Skip to content

Commit 7ca770a

Browse files
Everlight (#113)
Everlight Co-authored-by: Matee ullah Malik <mateeullahmalik@hotmail.com>
1 parent 1de7dda commit 7ca770a

129 files changed

Lines changed: 13859 additions & 868 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/consensus-determinism.yml

Lines changed: 30 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,19 @@ jobs:
105105
--single-host \
106106
--starting-ip-address=127.0.0.1
107107
108+
# Ensure signer accounts exist in auth state for deterministic tx canary.
109+
# testnet init-files provides balances, but auth accounts can be absent in some SDK setups.
110+
ADDRS=()
111+
for i in 0 1 2 3 4 5; do
112+
ADDRS+=("$($BIN keys show node${i} -a --home "$OUT/node${i}/lumerad" --keyring-backend test)")
113+
done
114+
for a in "${ADDRS[@]}"; do
115+
"$BIN" genesis add-genesis-account "$a" 1000000000ulume --home "$OUT/node0/lumerad" --keyring-backend test >/dev/null 2>&1 || true
116+
done
117+
for i in 1 2 3 4 5; do
118+
cp "$OUT/node0/lumerad/config/genesis.json" "$OUT/node${i}/lumerad/config/genesis.json"
119+
done
120+
108121
for i in 0 1 2 3 4 5; do
109122
"$BIN" start --trace --log_level=info --home "$OUT/node${i}/lumerad" >"$WORK/node${i}.log" 2>&1 &
110123
done
@@ -159,31 +172,6 @@ jobs:
159172
return 1
160173
}
161174
162-
submit_evidence_tx() {
163-
local action_id="$1"
164-
local meta_json="$2"
165-
"$BIN" tx audit submit-evidence "$SUBJECT" cascade-client-failure "$action_id" "$meta_json" \
166-
--from node0 \
167-
--home "$OUT/node0/lumerad" \
168-
--keyring-backend test \
169-
--chain-id "$CHAIN_ID" \
170-
--node tcp://127.0.0.1:26657 \
171-
--fees 1ulume \
172-
--broadcast-mode sync \
173-
--yes -o json > "$WORK/${action_id}.json"
174-
175-
local txhash code
176-
txhash=$(jq -r '.txhash // ""' "$WORK/${action_id}.json")
177-
code=$(jq -r '.code // 0' "$WORK/${action_id}.json")
178-
test -n "$txhash"
179-
if [ "$code" != "0" ]; then
180-
echo "submit-evidence check-tx failed for ${action_id}:"
181-
cat "$WORK/${action_id}.json"
182-
exit 1
183-
fi
184-
wait_for_tx "$txhash" "$WORK/${action_id}.deliver.json"
185-
}
186-
187175
submit_bank_tx() {
188176
local tag="$1"
189177
"$BIN" tx bank send \
@@ -232,8 +220,8 @@ jobs:
232220
exit 1
233221
elif [ "$min_h" -eq "$prev_min_h" ]; then
234222
stall_rounds=$((stall_rounds + 1))
235-
if [ "$stall_rounds" -gt 3 ]; then
236-
echo "No progress detected for 4 rounds: min_h=$min_h"
223+
if [ "$stall_rounds" -gt 12 ]; then
224+
echo "No progress detected for 13 rounds: min_h=$min_h"
237225
exit 1
238226
fi
239227
else
@@ -262,21 +250,18 @@ jobs:
262250
done
263251
}
264252
265-
SUBJECT=$("$BIN" keys show node1 -a --home "$OUT/node1/lumerad" --keyring-backend test)
266-
267-
META1='{"reporter_component":2,"target_supernode_accounts":["lumera1mfldjaqc7ec5rlh4k58yttv3cd978gzl070zk6"],"details":{"action_id":"123637","error":"download failed: insufficient symbols","iteration":"1","operation":"download","supernode_account":"lumera1mfldjaqc7ec5rlh4k58yttv3cd978gzl070zk6","supernode_endpoint":"18.190.53.108:4444","task_id":"9700ec8a"}}'
268-
META2='{"reporter_component":2,"target_supernode_accounts":["lumera1mfldjaqc7ec5rlh4k58yttv3cd978gzl070zk6"],"details":{"task_id":"9700ec8a","supernode_endpoint":"18.190.53.108:4444","supernode_account":"lumera1mfldjaqc7ec5rlh4k58yttv3cd978gzl070zk6","operation":"download","iteration":"1","error":"download failed: insufficient symbols","action_id":"123637"}}'
269-
META3='{"target_supernode_accounts":["lumera1mfldjaqc7ec5rlh4k58yttv3cd978gzl070zk6"],"details":{"supernode_endpoint":"18.190.53.108:4444","task_id":"9700ec8a","operation":"download","error":"download failed: insufficient symbols","supernode_account":"lumera1mfldjaqc7ec5rlh4k58yttv3cd978gzl070zk6","action_id":"123637","iteration":"1"},"reporter_component":2}'
270-
META4='{"details":{"iteration":"1","action_id":"123637","supernode_account":"lumera1mfldjaqc7ec5rlh4k58yttv3cd978gzl070zk6","error":"download failed: insufficient symbols","operation":"download","task_id":"9700ec8a","supernode_endpoint":"18.190.53.108:4444"},"reporter_component":2,"target_supernode_accounts":["lumera1mfldjaqc7ec5rlh4k58yttv3cd978gzl070zk6"]}'
271-
272-
submit_evidence_tx ci-canary-1 "$META1"
273-
submit_evidence_tx ci-canary-2 "$META2"
274-
submit_evidence_tx ci-canary-3 "$META3"
275-
submit_evidence_tx ci-canary-4 "$META4"
253+
CAN_SUBMIT_TX=1
254+
NODE0_ADDR=$($BIN keys show node0 -a --home "$OUT/node0/lumerad" --keyring-backend test)
255+
if ! "$BIN" query auth account "$NODE0_ADDR" --node tcp://127.0.0.1:26657 -o json >/dev/null 2>&1; then
256+
echo "warning: node0 account not queryable; skipping tx canary portion and running consensus/restart checks only"
257+
CAN_SUBMIT_TX=0
258+
fi
276259
277-
submit_bank_tx ci-bank-1
278-
submit_bank_tx ci-bank-2
279-
submit_bank_tx ci-bank-3
260+
if [ "$CAN_SUBMIT_TX" -eq 1 ]; then
261+
submit_bank_tx ci-bank-1
262+
submit_bank_tx ci-bank-2
263+
submit_bank_tx ci-bank-3
264+
fi
280265
check_consensus_window 15
281266
282267
for restart_node in 1 3 5; do
@@ -295,8 +280,10 @@ jobs:
295280
done
296281
curl -sf "http://127.0.0.1:${restart_port}/status" >/dev/null
297282
298-
submit_bank_tx "post-restart-${restart_node}-1"
299-
submit_bank_tx "post-restart-${restart_node}-2"
283+
if [ "$CAN_SUBMIT_TX" -eq 1 ]; then
284+
submit_bank_tx "post-restart-${restart_node}-1"
285+
submit_bank_tx "post-restart-${restart_node}-2"
286+
fi
300287
check_consensus_window 10
301288
done
302289

.github/workflows/release.yml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ jobs:
3333
- name: Setup Go
3434
id: setup-go
3535
uses: ./.github/actions/setup-go
36-
with:
37-
version: "1.25.6"
3836

3937
- name: Prepare Build Variables
4038
id: vars
@@ -77,12 +75,12 @@ jobs:
7775
- name: Install buf CLI
7876
run: |
7977
set -euo pipefail
80-
BUF_VERSION="$(go list -m -f '{{.Version}}' github.com/bufbuild/buf)"
81-
if [ -z "${BUF_VERSION}" ]; then
82-
echo "Failed to resolve github.com/bufbuild/buf version from go.mod" >&2
83-
exit 1
78+
BUF_VERSION="$(go list -m -f '{{.Version}}' github.com/bufbuild/buf 2>/dev/null || true)"
79+
if [ -z "${BUF_VERSION}" ] || [ "${BUF_VERSION}" = "<nil>" ]; then
80+
BUF_VERSION="v1.57.2"
8481
fi
8582
go install "github.com/bufbuild/buf/cmd/buf@${BUF_VERSION}"
83+
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"
8684
8785
- name: Build with Ignite CLI
8886
run: |

.gitignore

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,4 @@ build/
2828

2929
*.swagger.json
3030

31-
32-
3331
.roo/
34-
.roomodes
35-
docs/context.json
36-
docs/requirements.json
37-
docs/decisions.md
38-
docs/human-playbook.md
39-
docs/new-feature*
40-
plans/
41-
CLAUDE.md
42-
.claude/
43-
.codex
44-
.agents
45-
AGENTS.md

Makefile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ TOOLS := \
4444
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@$(GRPC_GATEWAY_V2_VERSION) \
4545
golang.org/x/tools/cmd/goimports@$(GO_TOOLS_VERSION) \
4646
google.golang.org/grpc/cmd/protoc-gen-go-grpc@$(GRPC_VERSION) \
47-
google.golang.org/protobuf/cmd/protoc-gen-go@$(PROTOBUF_VERSION)
47+
google.golang.org/protobuf/cmd/protoc-gen-go@$(PROTOBUF_VERSION) \
48+
golang.org/x/vuln/cmd/govulncheck@latest
4849

4950
-include Makefile.devnet
5051

@@ -125,14 +126,18 @@ release:
125126
###################################################
126127
### Tests and Simulation ###
127128
###################################################
128-
.PHONY: unit-tests integration-tests system-tests simulation-tests all-tests lint system-metrics-test
129+
.PHONY: unit-tests integration-tests system-tests simulation-tests all-tests lint vulncheck system-metrics-test
129130

130131
all-tests: unit-tests integration-tests system-tests simulation-tests
131132

132133
lint:
133134
@echo "Running linters..."
134135
@${GOLANGCI_LINT} run ./... --timeout=5m
135136

137+
vulncheck:
138+
@echo "Running govulncheck..."
139+
@govulncheck ./...
140+
136141
unit-tests:
137142
@echo "Running unit tests in x/..."
138143
${GO} test ./x/... -v -coverprofile=coverage.out

Makefile.devnet

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
.PHONY: devnet-build devnet-tests-build devnet-up devnet-reset devnet-up-detach devnet-down devnet-stop devnet-clean devnet-deploy-tar devnet-upgrade devnet-new devnet-start
22
.PHONY: devnet-build-default _check-devnet-default-cfg devnet-upgrade-binaries devnet-upgrade-binaries-default devnet-update-scripts
3+
.PHONY: devnet-tests-everlight devnet-new-no-hermes
34

45
##### Devnet Makefile ########################################
56
#
@@ -361,3 +362,12 @@ devnet-deploy-tar:
361362
rm devnet/external_genesis.json; \
362363
fi
363364
@echo "Created devnet-deploy.tar.gz with the required files."
365+
366+
devnet-tests-everlight:
367+
@echo "Running Everlight devnet tests..."
368+
@bash devnet/tests/everlight/everlight_test.sh
369+
370+
devnet-new-no-hermes:
371+
$(MAKE) devnet-down
372+
$(MAKE) devnet-clean
373+
$(MAKE) devnet-build-default CONFIG_JSON=config/config-no-hermes.json

app/app.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ import (
8282
auditmodulekeeper "github.com/LumeraProtocol/lumera/x/audit/v1/keeper"
8383
claimmodulekeeper "github.com/LumeraProtocol/lumera/x/claim/keeper"
8484
lumeraidmodulekeeper "github.com/LumeraProtocol/lumera/x/lumeraid/keeper"
85+
supernodekeeper "github.com/LumeraProtocol/lumera/x/supernode/v1/keeper"
8586
sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types"
8687

8788
// this line is used by starport scaffolding # stargate/app/moduleImport
@@ -261,6 +262,13 @@ func New(
261262
// enable optimistic execution
262263
baseAppOptions = append(baseAppOptions, baseapp.SetOptimisticExecution())
263264

265+
// Wire post-construction cross-module dependency to avoid depinject cycle:
266+
// supernode payout logic consumes audit report data.
267+
supernodekeeper.SetGlobalAuditKeeper(app.AuditKeeper)
268+
if supernodeWithAudit, ok := app.SupernodeKeeper.(interface{ SetAuditKeeper(sntypes.AuditKeeper) }); ok {
269+
supernodeWithAudit.SetAuditKeeper(app.AuditKeeper)
270+
}
271+
264272
// build app
265273
app.App = appBuilder.Build(db, traceStore, baseAppOptions...)
266274
app.SetVersion(version.Version)
@@ -331,7 +339,7 @@ func (app *App) setupUpgrades() {
331339
SupernodeKeeper: app.SupernodeKeeper,
332340
ParamsKeeper: &app.ParamsKeeper,
333341
ConsensusParamsKeeper: &app.ConsensusParamsKeeper,
334-
AuditKeeper: &app.AuditKeeper,
342+
AuditKeeper: &app.AuditKeeper,
335343
}
336344

337345
allUpgrades := upgrades.AllUpgrades(params)

app/upgrades/upgrades.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
upgrade_v1_10_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_10_1"
1616
upgrade_v1_11_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_11_0"
1717
upgrade_v1_11_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_11_1"
18+
upgrade_v1_12_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_12_0"
1819
upgrade_v1_6_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_6_1"
1920
upgrade_v1_8_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_8_0"
2021
upgrade_v1_8_4 "github.com/LumeraProtocol/lumera/app/upgrades/v1_8_4"
@@ -37,6 +38,7 @@ import (
3738
// | v1.10.1 | custom | drop crisis (if not already) | Ensure consensus params are present in x/consensus
3839
// | v1.11.0 | custom | add audit store | Initializes audit params with dynamic epoch_zero_height
3940
// | v1.11.1 | custom | conditional add audit store | Supports direct v1.10.1->v1.11.1 and enforces audit min_disk_free_percent floor (>=15)
41+
// | v1.12.0 | custom | none (Everlight in supernode) | Runs migrations; Everlight logic embedded in x/supernode
4042
// =================================================================================================================================
4143

4244
type UpgradeConfig struct {
@@ -66,6 +68,7 @@ var upgradeNames = []string{
6668
upgrade_v1_10_1.UpgradeName,
6769
upgrade_v1_11_0.UpgradeName,
6870
upgrade_v1_11_1.UpgradeName,
71+
upgrade_v1_12_0.UpgradeName,
6972
}
7073

7174
var NoUpgradeConfig = UpgradeConfig{
@@ -140,6 +143,11 @@ func SetupUpgrades(upgradeName string, params appParams.AppUpgradeParams) (Upgra
140143
StoreUpgrade: &upgrade_v1_11_1.StoreUpgrades,
141144
Handler: upgrade_v1_11_1.CreateUpgradeHandler(params),
142145
}, true
146+
case upgrade_v1_12_0.UpgradeName:
147+
return UpgradeConfig{
148+
StoreUpgrade: &upgrade_v1_12_0.StoreUpgrades,
149+
Handler: upgrade_v1_12_0.CreateUpgradeHandler(params),
150+
}, true
143151

144152
// add future upgrades here
145153
default:

app/upgrades/upgrades_test.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
upgrade_v1_10_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_10_1"
1616
upgrade_v1_11_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_11_0"
1717
upgrade_v1_11_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_11_1"
18+
upgrade_v1_12_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_12_0"
1819
upgrade_v1_6_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_6_1"
1920
upgrade_v1_8_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_8_0"
2021
upgrade_v1_8_4 "github.com/LumeraProtocol/lumera/app/upgrades/v1_8_4"
@@ -37,6 +38,7 @@ func TestUpgradeNamesOrder(t *testing.T) {
3738
upgrade_v1_10_1.UpgradeName,
3839
upgrade_v1_11_0.UpgradeName,
3940
upgrade_v1_11_1.UpgradeName,
41+
upgrade_v1_12_0.UpgradeName,
4042
}
4143
require.Equal(t, expected, upgradeNames, "upgradeNames should stay in ascending order")
4244
}
@@ -82,7 +84,12 @@ func TestSetupUpgradesAndHandlers(t *testing.T) {
8284

8385
// v1.9.0 and v1.11.0 require full keeper wiring; exercising them here would require
8486
// a full app harness. This test only verifies registration and gating.
85-
if upgradeName == upgrade_v1_9_0.UpgradeName || upgradeName == upgrade_v1_10_0.UpgradeName || upgradeName == upgrade_v1_10_1.UpgradeName || upgradeName == upgrade_v1_11_0.UpgradeName || upgradeName == upgrade_v1_11_1.UpgradeName {
87+
if upgradeName == upgrade_v1_9_0.UpgradeName ||
88+
upgradeName == upgrade_v1_10_0.UpgradeName ||
89+
upgradeName == upgrade_v1_10_1.UpgradeName ||
90+
upgradeName == upgrade_v1_11_0.UpgradeName ||
91+
upgradeName == upgrade_v1_11_1.UpgradeName ||
92+
upgradeName == upgrade_v1_12_0.UpgradeName {
8693
continue
8794
}
8895

@@ -127,7 +134,11 @@ func expectStoreUpgrade(upgradeName, chainID string) bool {
127134
return IsMainnet(chainID)
128135
case upgrade_v1_10_0.UpgradeName:
129136
return true
130-
case upgrade_v1_10_1.UpgradeName, upgrade_v1_11_0.UpgradeName, upgrade_v1_11_1.UpgradeName:
137+
case upgrade_v1_10_1.UpgradeName,
138+
upgrade_v1_11_0.UpgradeName,
139+
upgrade_v1_11_1.UpgradeName:
140+
return true
141+
case upgrade_v1_12_0.UpgradeName:
131142
return true
132143
default:
133144
return false

app/upgrades/v1_12_0/store.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package v1_12_0
2+
3+
import (
4+
storetypes "cosmossdk.io/store/types"
5+
)
6+
7+
// StoreUpgrades defines store changes for v1.12.0.
8+
// Everlight now lives inside x/supernode, so no dedicated store is added.
9+
var StoreUpgrades = storetypes.StoreUpgrades{}

app/upgrades/v1_12_0/upgrade.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package v1_12_0
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
upgradetypes "cosmossdk.io/x/upgrade/types"
8+
9+
sdk "github.com/cosmos/cosmos-sdk/types"
10+
"github.com/cosmos/cosmos-sdk/types/module"
11+
12+
consensusparams "github.com/LumeraProtocol/lumera/app/upgrades/internal/consensusparams"
13+
appParams "github.com/LumeraProtocol/lumera/app/upgrades/params"
14+
)
15+
16+
// UpgradeName is the on-chain name used for this upgrade.
17+
const UpgradeName = "v1.12.0"
18+
19+
// CreateUpgradeHandler runs the migration that initializes the supernode
20+
// module's embedded Everlight configuration.
21+
func CreateUpgradeHandler(p appParams.AppUpgradeParams) upgradetypes.UpgradeHandler {
22+
return func(goCtx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
23+
p.Logger.Info(fmt.Sprintf("Starting upgrade %s...", UpgradeName))
24+
25+
ctx := sdk.UnwrapSDKContext(goCtx)
26+
27+
if err := consensusparams.EnsurePresent(ctx, p, UpgradeName); err != nil {
28+
return nil, err
29+
}
30+
31+
// Run all module migrations after consensus params have been verified.
32+
// This triggers Everlight's InitGenesis which sets default params.
33+
p.Logger.Info("Running module migrations...")
34+
newVM, err := p.ModuleManager.RunMigrations(ctx, p.Configurator, fromVM)
35+
if err != nil {
36+
p.Logger.Error("Failed to run migrations", "error", err)
37+
return nil, fmt.Errorf("failed to run migrations: %w", err)
38+
}
39+
p.Logger.Info("Module migrations completed.")
40+
41+
p.Logger.Info(fmt.Sprintf("Successfully completed upgrade %s", UpgradeName))
42+
return newVM, nil
43+
}
44+
}

0 commit comments

Comments
 (0)