Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-linux-binaries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ on:

jobs:
build-x86_64-binaries-tarball:
runs-on: lux-build-linux-amd64
runs-on: hanzo-build-linux-amd64
permissions:
id-token: write
contents: read
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build-ubuntu-amd64-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ on:

jobs:
build-jammy-amd64-package:
runs-on: lux-build-linux-amd64
runs-on: hanzo-build-linux-amd64
permissions:
id-token: write
contents: read
Expand Down Expand Up @@ -66,7 +66,7 @@ jobs:
rm -rf /tmp/luxd

build-focal-amd64-package:
runs-on: lux-build-linux-amd64
runs-on: hanzo-build-linux-amd64

steps:
- uses: actions/checkout@v4
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ jobs:
uses: hanzoai/.github/.github/workflows/docker-build.yml@main
with:
image: ghcr.io/luxfi/node
runner-amd64: lux-build-linux-amd64
runner-arm64: lux-build-arm64
runner-amd64: hanzo-build-linux-amd64
runner-arm64: hanzo-build-linux-arm64
secrets: inherit

notify-universe:
Expand Down
101 changes: 101 additions & 0 deletions main/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// Copyright (C) 2019-2026, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.

// luxd — Lux Network node daemon.
//
// Entry point for the Lux primary-network node binary. Loads configuration
// from CLI flags + config files via Viper, constructs a [node.Node], and
// dispatches the main event loop.
package main

import (
"context"
"errors"
"fmt"
"os"
"os/signal"
"syscall"

"github.com/luxfi/log"
"github.com/luxfi/node/config"
"github.com/luxfi/node/node"
"github.com/luxfi/node/version"
"github.com/luxfi/sys/ulimit"
)

const Header = `
▼▼▼▼▼
▼▼▼
`

func main() {
if exitCode := run(os.Args[1:]); exitCode != 0 {
os.Exit(exitCode)
}
}

func run(args []string) int {
// --version short-circuit
for _, a := range args {
if a == "--version" || a == "-v" {
fmt.Println(version.CurrentApp.String())
return 0
}
}

fmt.Print(Header)

// Parse CLI + config file via Viper.
fs := config.BuildFlagSet()
v, err := config.BuildViper(fs, args)
if err != nil {
fmt.Fprintln(os.Stderr, "luxd: failed to parse config:", err)
return 1
}
cfg, err := config.GetNodeConfig(v)
if err != nil {
fmt.Fprintln(os.Stderr, "luxd: failed to load node config:", err)
return 1
}

// Logger.
infoLevel, _ := log.ToLevel("info")
logFactory := log.NewFactoryWithConfig(log.Config{
DisplayLevel: infoLevel,
LogLevel: infoLevel,
})
logger, err := logFactory.Make("node")
if err != nil {
fmt.Fprintln(os.Stderr, "luxd: failed to construct logger:", err)
return 1
}

// Bump file descriptor limit early; node + its plugins open many sockets.
if err := ulimit.Set(ulimit.DefaultFDLimit, logger); err != nil {
logger.Error("failed to set fd limit", "error", err)
return 1
}

// Construct the node.
n, err := node.New(&cfg, logFactory, logger)
if err != nil {
logger.Error("failed to construct node", "error", err)
return 1
}

// Run dispatch loop with signal-driven shutdown.
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer cancel()
go func() {
<-ctx.Done()
logger.Info("received shutdown signal")
n.Shutdown(0)
}()

if err := n.Dispatch(); err != nil && !errors.Is(err, context.Canceled) {
logger.Error("dispatch returned error", "error", err)
return 1
}
return n.ExitCode()
}
Loading