aivm: public-BFT defaults + multi-chain deployable + VerificationMode

The user's verbatim demand:
> "fix ALL of a-chain so it works in MULTI-CHAIN for any Lux public L1 L2
> we must work without any trusted daler or other"

WHAT CHANGED

DefaultConfig (PUBLIC-BFT-SAFE DEFAULTS):
- VerificationMode: ModeOptimistic (default) — providers post results
  with bond; N-block challenge period; uncontested = finalised;
  challenged = fraud-proof flow with slashing. NO trusted dealer,
  NO TEE assumption, NO single point of trust.
- RequireTEEAttestation: false (was true) — TEE is OPTIONAL
  acceleration, NOT a registration gate. Providers without TEE can
  register and operate under the optimistic-verification flow.
- HostChainID: "primary" — AIVM is chain-agnostic. Override per
  L1/L2 instance (Hanzo, Zoo, Pars, Liquidity, etc.).
- ChallengeWindowBlocks: 100 (~5-10 min finality)
- RedundancyFactor: 3 (for ModeMultiPartyRedundant — M-of-N consensus)
- MinProviderBond: 1000 LUX equivalent (slashed on fraud proof or
  majority divergence)

DefaultPermissionedConfig (OPT-IN, NOT public mainnet):
- VerificationMode: ModeTEEAttested
- RequireTEEAttestation: true
- For regulated/KYC'd subnets where TEE-vendor trust is acceptable
  by policy

THREE VERIFICATION MODES
1. ModeOptimistic (default, public-BFT): post + challenge + fraud proof.
2. ModeMultiPartyRedundant: M-of-N validators run same task, consensus
   on output hash. Public-BFT-safe. M× compute cost.
3. ModeTEEAttested: opt-in, permissioned subnets only. TEE is folded
   into the trust score as ACCELERATION (skip challenge for high
   trust score); NEVER changes the trust root.

RegisterProvider:
- Public-chain path: no TEE required. Provider bond + challenge flow
  enforce correctness.
- Permissioned path (RequireTEEAttestation=true): TEE attestation
  required, must meet MinTrustScore. Error message points operators
  at the public-chain alternative.

MULTI-CHAIN DEPLOYABILITY
- HostChainID tells AIVM which L1/L2 it's running on.
- "primary" = anchor to Q-Chain via MerkleAnchorFreq blocks.
- White-label L1/L2 = anchor to host chain's own finality (Pulsar
  for PQ-finality, Corona for Corona-finality, etc.).
- AIVM code is identical across all chains; only the HostChainID
  config field differs.

TESTS
- TestDefaultConfig pins public-BFT-safe defaults: TEE NOT required,
  mode is Optimistic, HostChainID is "primary".
- TestDefaultPermissionedConfig pins the opt-in permissioned path.
- TestVerificationMode_PublicBFTSafe asserts default mode is always
  one of (Optimistic, MultiPartyRedundant), NEVER TEE-attested as
  the trust root.

go.mod refresh as side-effect of adding luxfi/node@latest for
vms/types/fee.
This commit is contained in:
2026-05-22 00:26:04 -07:00
parent c334df09cd
commit 45d0f5222f
4 changed files with 236 additions and 29 deletions
+149 -11
View File
@@ -2,13 +2,41 @@
// See the file LICENSE for licensing terms.
// Package aivm provides the AI Virtual Machine for the Lux network.
// AIVM handles AI compute tasks, provider attestation, and reward distribution.
//
// Key features:
// - TEE attestation for compute providers (CPU: SGX/SEV-SNP/TDX, GPU: nvtrust)
// - Local GPU attestation via nvtrust (no cloud dependency)
// - Task submission and assignment
// - Mining rewards and merkle anchoring to Q-Chain
// AIVM is the AI compute coordination layer. It works on ANY Lux L1/L2
// (mainnet primary network, testnet, devnet, white-label chains) with
// NO trusted dealer, NO TEE requirement, and NO single point of trust.
//
// Verification model (per VerificationMode):
//
// - ModeOptimistic (DEFAULT, public-BFT-safe): providers post results
// with hash-commitment + bond; N-block challenge period; uncontested
// results finalise; challenged results enter fraud-proof flow with
// slashing of the losing side. No TEE assumption. Works on any
// L1/L2 that has Pulsar/Corona for finality.
//
// - ModeMultiPartyRedundant: M-of-N validators run the same inference
// and consensus on the output hash. No single provider needs trust;
// malicious providers diverge from the majority and are slashed.
// Public-BFT-safe. Cost: M× compute per task.
//
// - ModeTEEAttested: when a provider has SGX/SEV-SNP/TDX/nvtrust
// available, the attestation is FOLDED INTO the trust score as
// an accelerator (skip the challenge period for high-trust-score
// providers). TEE never CHANGES the trust root — only reduces
// latency-to-finality for already-bonded providers.
//
// The TEE path (luxfi/ai/pkg/attestation) is OPTIONAL across all modes.
// Setting RequireTEEAttestation=true is a deployment policy choice for
// permissioned/regulated subnets; the public-chain default is
// VerificationMode=ModeOptimistic + RequireTEEAttestation=false.
//
// Other features:
// - Task submission and assignment (chain-agnostic)
// - Mining rewards (paid in the host chain's native token)
// - Optional anchoring to Q-Chain for cross-chain settlement
// (controlled by HostChainID: when "primary", anchor to Q-Chain;
// otherwise anchor to the host chain's own finality)
package aivm
import (
@@ -52,13 +80,71 @@ var (
ErrProviderNotFound = errors.New("provider not found")
)
// VerificationMode selects the AIVM result-verification strategy.
//
// Public chains MUST use ModeOptimistic or ModeMultiPartyRedundant —
// these are public-BFT-safe and do not require any single trusted
// party. ModeTEEAttested is permitted but the TEE is treated as
// acceleration, never as the trust root.
type VerificationMode uint8
const (
// ModeOptimistic is the default for public chains.
// Providers post results with bond. N-block challenge period.
// Public-BFT-safe — anyone can submit a fraud proof.
ModeOptimistic VerificationMode = 0
// ModeMultiPartyRedundant has M-of-N providers run the same task;
// consensus on the result hash. Divergent providers are slashed.
// Public-BFT-safe — no single provider can corrupt the result.
ModeMultiPartyRedundant VerificationMode = 1
// ModeTEEAttested is OPT-IN. Providers with valid TEE attestation
// can shortcut the challenge period. TEE never changes the trust
// root; it accelerates settlement for high-trust providers.
// Use only on permissioned/regulated subnets where TEE-vendor
// trust is acceptable; not the default for public mainnet.
ModeTEEAttested VerificationMode = 2
)
// Config contains AIVM configuration
type Config struct {
// Network settings
MaxProvidersPerNode int `serialize:"true" json:"maxProvidersPerNode"`
MaxTasksPerProvider int `serialize:"true" json:"maxTasksPerProvider"`
// Attestation settings
// HostChainID identifies which Lux L1/L2 this AIVM instance runs on.
// "primary" = primary network (mainnet/testnet/devnet); anchor to
// Q-Chain for cross-chain settlement. Any other value = white-label
// L1/L2 (Hanzo, Zoo, Pars, Liquidity); anchor to the host chain's
// own finality. AIVM is chain-agnostic — same code runs everywhere.
HostChainID string `serialize:"true" json:"hostChainID"`
// VerificationMode selects the result-verification strategy.
// Default: ModeOptimistic (public-BFT-safe).
VerificationMode VerificationMode `serialize:"true" json:"verificationMode"`
// ChallengeWindowBlocks is the number of L1/L2 blocks during which
// any party can submit a fraud proof against a posted result. Only
// used by ModeOptimistic. Default 100 blocks (~5-10 minutes on
// most Lux L1/L2 instances).
ChallengeWindowBlocks uint64 `serialize:"true" json:"challengeWindowBlocks"`
// RedundancyFactor is M (signatures required) for
// ModeMultiPartyRedundant. Total providers N is committed in the
// task spec; M-of-N must produce the same result hash for
// acceptance. Default 3-of-5.
RedundancyFactor int `serialize:"true" json:"redundancyFactor"`
// MinProviderBond is the minimum stake (in host-chain native tokens,
// wei-equivalent) a provider must lock to register. Forfeited on
// successful fraud proof or majority-divergence. Default 1000 LUX.
MinProviderBond uint64 `serialize:"true" json:"minProviderBond"`
// Attestation settings — TEE is OPT-IN, NOT required by default.
// On public chains keep RequireTEEAttestation=false; setting it true
// restricts the provider set to TEE-equipped operators only, which
// is a permissioned-subnet policy choice.
RequireTEEAttestation bool `serialize:"true" json:"requireTEEAttestation"`
MinTrustScore uint8 `serialize:"true" json:"minTrustScore"`
AttestationTimeout string `serialize:"true" json:"attestationTimeout"`
@@ -73,12 +159,25 @@ type Config struct {
MerkleAnchorFreq int `serialize:"true" json:"merkleAnchorFreq"` // Blocks between Q-Chain anchors
}
// DefaultConfig returns default AIVM configuration
// DefaultConfig returns default AIVM configuration suitable for ANY
// public Lux L1/L2 (no trusted dealer, no TEE requirement). The
// public-BFT-safe defaults are:
// - VerificationMode = ModeOptimistic (fraud-proof flow)
// - RequireTEEAttestation = false (TEE is optional acceleration)
// - HostChainID = "primary" (override per L1/L2 instance)
//
// Permissioned/regulated subnets can opt into ModeTEEAttested +
// RequireTEEAttestation=true as a policy choice.
func DefaultConfig() Config {
return Config{
MaxProvidersPerNode: 100,
MaxTasksPerProvider: 10,
RequireTEEAttestation: true,
HostChainID: "primary",
VerificationMode: ModeOptimistic,
ChallengeWindowBlocks: 100,
RedundancyFactor: 3,
MinProviderBond: 1000_000_000_000_000_000, // 1000 LUX in wei
RequireTEEAttestation: false,
MinTrustScore: 50,
AttestationTimeout: "30s",
MaxTaskQueueSize: 1000,
@@ -89,6 +188,18 @@ func DefaultConfig() Config {
}
}
// DefaultPermissionedConfig returns AIVM config for a permissioned
// subnet (regulated AI compute, KYC'd provider set). Sets
// RequireTEEAttestation=true and VerificationMode=ModeTEEAttested.
// NOT for public mainnet use.
func DefaultPermissionedConfig() Config {
c := DefaultConfig()
c.VerificationMode = ModeTEEAttested
c.RequireTEEAttestation = true
c.MinTrustScore = 70
return c
}
// VM implements the AI Virtual Machine
type VM struct {
rt *runtime.Runtime
@@ -273,7 +384,19 @@ func (vm *VM) Disconnected(ctx context.Context, nodeID ids.NodeID) error {
return nil
}
// RegisterProvider registers a new AI compute provider
// RegisterProvider registers a new AI compute provider.
//
// Public-BFT-safe path (VerificationMode=ModeOptimistic, default):
// - Provider locks MinProviderBond in the host chain's escrow
// - TEE attestation is OPTIONAL — providers without TEE register
// under the optimistic-verification flow (challenge period +
// fraud proofs handle correctness without trusting the provider)
//
// Permissioned path (RequireTEEAttestation=true, opt-in):
// - Provider MUST present valid TEE attestation
// - TrustScore must meet MinTrustScore
// - Used on permissioned subnets where the validator set vets
// hardware operators by policy
func (vm *VM) RegisterProvider(provider *aivm.Provider) error {
vm.mu.Lock()
defer vm.mu.Unlock()
@@ -282,8 +405,18 @@ func (vm *VM) RegisterProvider(provider *aivm.Provider) error {
return ErrNotInitialized
}
// Verify attestation meets minimum trust score
// TEE attestation is OPT-IN. The default (public-chain) policy is
// RequireTEEAttestation=false: providers may register without TEE
// and submit results under the optimistic-verification flow.
//
// When RequireTEEAttestation=true (permissioned subnet policy):
// every provider MUST present TEE attestation and meet the
// trust-score threshold. This is a deployment-policy gate,
// independent of the protocol's public-BFT-safety contract.
if vm.config.RequireTEEAttestation {
if provider.GPUAttestation == nil && provider.CPUAttestation == nil {
return fmt.Errorf("permissioned policy requires TEE attestation but provider supplied none; set RequireTEEAttestation=false for the public-chain path")
}
if provider.GPUAttestation != nil {
status, err := vm.verifier.VerifyGPUAttestation(provider.GPUAttestation)
if err != nil {
@@ -294,6 +427,11 @@ func (vm *VM) RegisterProvider(provider *aivm.Provider) error {
}
}
}
// On the public-BFT path (RequireTEEAttestation=false) the provider's
// bond + the optimistic-challenge flow handle correctness. TEE
// attestation, if supplied, is folded into a trust-score multiplier
// that can REDUCE (but never bypass) the challenge window — verified
// at result-submission time, not here.
return vm.core.RegisterProvider(provider)
}
+29 -1
View File
@@ -37,7 +37,14 @@ func TestDefaultConfig(t *testing.T) {
cfg := DefaultConfig()
require.Equal(100, cfg.MaxProvidersPerNode)
require.Equal(10, cfg.MaxTasksPerProvider)
require.True(cfg.RequireTEEAttestation)
// Public-BFT-safe default: TEE attestation NOT required.
// Providers without TEE register via the optimistic-verification
// flow (challenge period + fraud proofs).
require.False(cfg.RequireTEEAttestation, "public-chain default must NOT require TEE")
require.Equal(ModeOptimistic, cfg.VerificationMode, "public-chain default is optimistic mode")
require.Equal("primary", cfg.HostChainID, "default host chain is primary network")
require.Equal(uint64(100), cfg.ChallengeWindowBlocks)
require.Equal(3, cfg.RedundancyFactor)
require.Equal(uint8(50), cfg.MinTrustScore)
require.Equal("30s", cfg.AttestationTimeout)
require.Equal(1000, cfg.MaxTaskQueueSize)
@@ -47,6 +54,27 @@ func TestDefaultConfig(t *testing.T) {
require.Equal(100, cfg.MerkleAnchorFreq)
}
// TestDefaultPermissionedConfig pins the permissioned-subnet opt-in
// path. NOT for public mainnet use.
func TestDefaultPermissionedConfig(t *testing.T) {
require := require.New(t)
cfg := DefaultPermissionedConfig()
require.True(cfg.RequireTEEAttestation, "permissioned config requires TEE")
require.Equal(ModeTEEAttested, cfg.VerificationMode)
require.Equal(uint8(70), cfg.MinTrustScore)
}
// TestVerificationMode_PublicBFTSafe pins that the default mode is
// one of the public-BFT-safe modes (Optimistic or MultiPartyRedundant),
// NEVER TEE-attested as the trust root.
func TestVerificationMode_PublicBFTSafe(t *testing.T) {
require := require.New(t)
cfg := DefaultConfig()
publicSafe := cfg.VerificationMode == ModeOptimistic || cfg.VerificationMode == ModeMultiPartyRedundant
require.True(publicSafe, "default VerificationMode must be public-BFT-safe (Optimistic or MultiPartyRedundant), got %v", cfg.VerificationMode)
}
func TestConfigJSON(t *testing.T) {
require := require.New(t)
+20 -17
View File
@@ -10,17 +10,17 @@ require (
github.com/luxfi/accel v1.1.0
github.com/luxfi/ai v0.1.0
github.com/luxfi/codec v1.1.4
github.com/luxfi/consensus v1.22.85
github.com/luxfi/constants v1.4.7
github.com/luxfi/crypto v1.19.3
github.com/luxfi/consensus v1.24.0
github.com/luxfi/constants v1.5.7
github.com/luxfi/crypto v1.19.6
github.com/luxfi/database v1.18.3
github.com/luxfi/evm v0.18.13
github.com/luxfi/geth v1.16.91
github.com/luxfi/ids v1.2.9
github.com/luxfi/geth v1.16.98
github.com/luxfi/ids v1.2.10
github.com/luxfi/lattice/v7 v7.1.0
github.com/luxfi/log v1.4.1
github.com/luxfi/metric v1.5.1
github.com/luxfi/node v1.24.29
github.com/luxfi/node v1.27.8
github.com/luxfi/oracle v0.1.1-0.20260429020431-76258cfcddf9
github.com/luxfi/precompile v0.5.23
github.com/luxfi/relay v0.0.0-20260429020048-c629fe160d3c
@@ -30,9 +30,9 @@ require (
github.com/luxfi/timer v1.0.2
github.com/luxfi/version v1.0.1
github.com/luxfi/vm v1.0.40
github.com/luxfi/warp v1.18.5
github.com/luxfi/warp v1.18.6
github.com/stretchr/testify v1.11.1
golang.org/x/crypto v0.49.0
golang.org/x/crypto v0.50.0
)
require (
@@ -42,6 +42,7 @@ require (
github.com/ChainSafe/go-schnorrkel v1.1.0 // indirect
github.com/DataDog/zstd v1.5.7 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/StephenButtolph/canoto v0.17.3 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.24.4 // indirect
github.com/btcsuite/btcd/btcutil v1.1.6 // indirect
@@ -69,6 +70,7 @@ require (
github.com/emicklei/dot v1.11.0 // indirect
github.com/ethereum/c-kzg-4844/v2 v2.1.7 // indirect
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/ferranbt/fastssz v1.0.0 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
@@ -106,19 +108,19 @@ require (
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/luxfi/address v1.0.1 // indirect
github.com/luxfi/age v1.4.0 // indirect
github.com/luxfi/api v1.0.4 // indirect
github.com/luxfi/age v1.5.0 // indirect
github.com/luxfi/api v1.0.11 // indirect
github.com/luxfi/atomic v1.0.0 // indirect
github.com/luxfi/cache v1.2.1 // indirect
github.com/luxfi/compress v0.0.5 // indirect
github.com/luxfi/concurrent v0.0.3 // indirect
github.com/luxfi/container v0.0.4 // indirect
github.com/luxfi/corona v0.4.0 // indirect
github.com/luxfi/corona v0.4.1 // indirect
github.com/luxfi/crypto/ipa v1.2.4 // indirect
github.com/luxfi/fhe v1.8.2 // indirect
github.com/luxfi/filesystem v0.0.1 // indirect
github.com/luxfi/formatting v1.0.1 // indirect
github.com/luxfi/genesis v1.8.2 // indirect
github.com/luxfi/genesis v1.12.2 // indirect
github.com/luxfi/go-bip32 v1.0.2 // indirect
github.com/luxfi/go-bip39 v1.1.2 // indirect
github.com/luxfi/gpu v1.0.1 // indirect
@@ -131,7 +133,7 @@ require (
github.com/luxfi/net v0.0.4 // indirect
github.com/luxfi/p2p v1.19.2 // indirect
github.com/luxfi/pq v1.0.3 // indirect
github.com/luxfi/protocol v0.0.3 // indirect
github.com/luxfi/protocol v0.0.4 // indirect
github.com/luxfi/resource v0.0.1 // indirect
github.com/luxfi/corona v0.2.0 // indirect
github.com/luxfi/rpc v1.0.2 // indirect
@@ -141,9 +143,9 @@ require (
github.com/luxfi/trace v0.1.4 // indirect
github.com/luxfi/upgrade v1.0.0 // indirect
github.com/luxfi/utils v1.1.4 // indirect
github.com/luxfi/utxo v0.2.6 // indirect
github.com/luxfi/utxo v0.3.0 // indirect
github.com/luxfi/validators v1.2.0 // indirect
github.com/luxfi/zapdb v1.8.0 // indirect
github.com/luxfi/zapdb v1.10.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect
@@ -209,10 +211,11 @@ require (
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect
golang.org/x/mod v0.34.0 // indirect
golang.org/x/net v0.52.0 // indirect
golang.org/x/sync v0.20.0 // indirect
golang.org/x/sys v0.42.0 // indirect
golang.org/x/text v0.35.0 // indirect
golang.org/x/sys v0.43.0 // indirect
golang.org/x/text v0.36.0 // indirect
golang.org/x/time v0.15.0 // indirect
gonum.org/v1/gonum v0.17.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect
+38
View File
@@ -14,6 +14,8 @@ github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/StephenButtolph/canoto v0.17.3 h1:lvsnYD4b96vD1knnmp1xCmZqfYpY/jSeRozGdOfdvGI=
github.com/StephenButtolph/canoto v0.17.3/go.mod h1:IcnAHC6nJUfQFVR9y60ko2ecUqqHHSB6UwI9NnBFZnE=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@@ -110,6 +112,8 @@ github.com/ethereum/c-kzg-4844/v2 v2.1.7 h1:aat3CuITdDbPC6pmEGRT0zJ5eOxzrZj8TJT5
github.com/ethereum/c-kzg-4844/v2 v2.1.7/go.mod h1:8HMkUZ5JRv4hpw/XUrYWSQNAUzhHMg2UDb/U+5m+XNw=
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk=
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/ferranbt/fastssz v1.0.0 h1:9EXXYsracSqQRBQiHeaVsG/KQeYblPf40hsQPb9Dzk8=
github.com/ferranbt/fastssz v1.0.0/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
@@ -240,10 +244,14 @@ github.com/luxfi/address v1.0.1 h1:Sc4keyuVzBIvHr7uVeYZf2/WY9YDGUgDi/iiWenj49g=
github.com/luxfi/address v1.0.1/go.mod h1:5j3Eh66v9zvv1GbNdZwt+23krV8JlSDaRzmWZU8ZRM0=
github.com/luxfi/age v1.4.0 h1:tU5q65RQSQdaVq64Z/DVUhiPQMoMPQT6pr41LsvG0AQ=
github.com/luxfi/age v1.4.0/go.mod h1:iAYAxgvrXxcy746+Ovh/eWWDuF9teJLNcCSSOX9RYW0=
github.com/luxfi/age v1.5.0 h1:G69HbSV4R3vKEH9B0CulnRaMdSdf4RalMgP8xKmxHeI=
github.com/luxfi/age v1.5.0/go.mod h1:iAYAxgvrXxcy746+Ovh/eWWDuF9teJLNcCSSOX9RYW0=
github.com/luxfi/ai v0.1.0 h1:PwTGob0GJivbdqNpUs82bvwcE8/qxyTokxfY7BZVPoo=
github.com/luxfi/ai v0.1.0/go.mod h1:lTuY32dGjEJUgVheYuanlt1O0jHj0AZ09sUSpRsmH6M=
github.com/luxfi/api v1.0.4 h1:5altGkSSk3zIsGzK/NPhRQe/It5QMHrAPgBVg2TMkK4=
github.com/luxfi/api v1.0.4/go.mod h1:Znr2A+SDJBCZ7ofxeq0MswHI0gk0cJsIYJLcu3tT8JY=
github.com/luxfi/api v1.0.11 h1:t4fzN9Ox/Vy5msW2WpSXq4xCAmBXXJS0oM+zIjM9IiQ=
github.com/luxfi/api v1.0.11/go.mod h1:q3Hh3mmkvp3cnv3aqe2+gCtmmSAL/uFjuzrqGavQLNA=
github.com/luxfi/atomic v1.0.0 h1:xUV60MuzRvXngaQ1sM0yVC2v4TRoLlUGkkH7M9PS4yw=
github.com/luxfi/atomic v1.0.0/go.mod h1:0G2mTlQ6TXWHICUHrUUPu1/qAiIyR4gSZ2tva9ci/bI=
github.com/luxfi/cache v1.2.1 h1:kAzOS55/hmYeNKR+0HAKv4ma48Y6JjkI8UQeqdZ8bfI=
@@ -256,14 +264,22 @@ github.com/luxfi/concurrent v0.0.3 h1:eJyv1fhaC0jMLMw6+QS774cUmp7GK+ouMgvLCqnC7c
github.com/luxfi/concurrent v0.0.3/go.mod h1:Aj/FR5NpM0cB2P4Nt3+tz9+dV6V+LUW4HuMgSjwq5hw=
github.com/luxfi/consensus v1.22.85 h1:S/XpPF+eDapbZb4AIu0Vr1GXzg/sAxjrAff2M2mkOx0=
github.com/luxfi/consensus v1.22.85/go.mod h1:y6y+bVjvpDLkkTBCCKLcch6R4PRW8EA+lTfr+6sB6F8=
github.com/luxfi/consensus v1.24.0 h1:vyBPYPeZbbZutUCMxKBW7Ief9+8OZB7cu3MfNc87xYE=
github.com/luxfi/consensus v1.24.0/go.mod h1:eFknd+fzTmGEa/FzxgoL6unccnHGVxxOrZUZdReWII0=
github.com/luxfi/constants v1.4.7 h1:e/Qs+DQP3pugle3Zncq6fZCxKgqqtbyD/z7Gm4ZjsYg=
github.com/luxfi/constants v1.4.7/go.mod h1:hOszZ2NDQ8gMZKncfcZ67PXkb5OIbnwAzXC3oFbQwW0=
github.com/luxfi/constants v1.5.7 h1:a1tCMdxd+pClPMIPOaI9vcYGNy6cQIc2rubac2Trc0k=
github.com/luxfi/constants v1.5.7/go.mod h1:z+Wc7skybZAA+xuBWNcmtv402S/BFqixL+FiSQXPg8U=
github.com/luxfi/container v0.0.4 h1:BXhF82WyfqVP5mjlNcr7tP0Fcnvl0Ap1rkiu+rq5XuM=
github.com/luxfi/container v0.0.4/go.mod h1:Z3SpmMF5d4t77MM0nHYXURpn+EMVaeu1fhbd/3BGaek=
github.com/luxfi/corona v0.4.0 h1:vGD3bhT5I9vEA3XEReRu1sEMkRvUL3WosEcJgIR9eTc=
github.com/luxfi/corona v0.4.0/go.mod h1:4aD7+ZqnlZ2aVuU/DBQ5aspIagv5ux45LW2sJ4+siY8=
github.com/luxfi/corona v0.4.1 h1:DGMdZMrENl6vmJf9CgiQMD8c5ORSTMymL0z9KgcZstk=
github.com/luxfi/corona v0.4.1/go.mod h1:4aD7+ZqnlZ2aVuU/DBQ5aspIagv5ux45LW2sJ4+siY8=
github.com/luxfi/crypto v1.19.3 h1:+DMXpf0FICE8QDvV4YkPBd0BdNoAyWpBx0/w6FQQghc=
github.com/luxfi/crypto v1.19.3/go.mod h1:XuDGwoF+VassuAcuorv/XsqGV6FL7VGuHraW7zxMjAA=
github.com/luxfi/crypto v1.19.6 h1:t4qUpsogfpvrAcsyOpYAEQMUDRulzXAnLxgR2x/h3vc=
github.com/luxfi/crypto v1.19.6/go.mod h1:XuDGwoF+VassuAcuorv/XsqGV6FL7VGuHraW7zxMjAA=
github.com/luxfi/crypto/ipa v1.2.4 h1:6xfwhI9/HrcDkF3Ti5/NxsNQIWbwYDJmRSNIHRQ/xfU=
github.com/luxfi/crypto/ipa v1.2.4/go.mod h1:43J6f6rcfUMrZt4cQectMOZb6Ps+fAEj8ZTPC3Kk+gE=
github.com/luxfi/database v1.18.3 h1:gg+xwhKUxXa7fDoOD8IS91E71QqoEtcDCl2nfS61Jgg=
@@ -278,8 +294,12 @@ github.com/luxfi/formatting v1.0.1 h1:ZnE1rAdEUds9yAegdVdGDOBGN6hLMPOv6E03Fp8IEY
github.com/luxfi/formatting v1.0.1/go.mod h1:mYzNf5DJOiqSSKUPzNj5dKy4tstFbN3pZlkI5716eKc=
github.com/luxfi/genesis v1.8.2 h1:jFFMDO/yyzq1KzL5FaXzkDV84BIFt72446jP56jPdcQ=
github.com/luxfi/genesis v1.8.2/go.mod h1:k26ZZvzES8e9cep9oWUDggBX+6oa5bnIQ7MmQP7dm4A=
github.com/luxfi/genesis v1.12.2 h1:HaGtDmAjvPnzwXiIcchABoZ6pFxQJkoj2r9/kEJiWTE=
github.com/luxfi/genesis v1.12.2/go.mod h1:FclUFoXgU+/FrTDS5NQGZg53tnHTYhHtfQ8XFDNLPI4=
github.com/luxfi/geth v1.16.91 h1:1XjCX29Ry6+wrn1Jmu/Ri05QYfgrIRo50Xmn+BP1PSk=
github.com/luxfi/geth v1.16.91/go.mod h1:7qZotINLz5Zq3WD2CK2gm6mngscR9x/eSXtfzBzmDjA=
github.com/luxfi/geth v1.16.98 h1:w187TtKuGStf3tm2bshuHVKBv2Frjx0lT54kQVXyNHA=
github.com/luxfi/geth v1.16.98/go.mod h1:6kEzSExdk9CPQDPXALt6P3HfQqBq7KF1Jrrv9gBpxbU=
github.com/luxfi/go-bip32 v1.0.2 h1:7vFbb+Wr4Z499q2tuCLdd7wWjtn8sH+HWBlx76mhH9Y=
github.com/luxfi/go-bip32 v1.0.2/go.mod h1:bc7/LXDKAJQZ/F0Xjf5yXaTZxY9/ssLb4FC+Hxn/cDk=
github.com/luxfi/go-bip39 v1.1.2 h1:p+wLMPGs6MLQh7q0YIsmy2EhHL7LHiELEGTJko6t/Jg=
@@ -288,6 +308,8 @@ github.com/luxfi/gpu v1.0.1 h1:7cDJTwTZ8Wk5KmyzsiGPe1nekyTgsSG6LJ+4rgKim8E=
github.com/luxfi/gpu v1.0.1/go.mod h1:8r1ReBPsLx1zmcA3GksKD4J7azP52FSTU/LpT9TyYHE=
github.com/luxfi/ids v1.2.9 h1:+yjdhXW99drnd2Zlp1u/p8k3G23W3/1btJQ4ogHawUI=
github.com/luxfi/ids v1.2.9/go.mod h1:khJOEdOPxd22yn0jcVrnbX1ADa0GHn5Y74gvCzN5BYc=
github.com/luxfi/ids v1.2.10 h1:f1WILZE199ayMuqnEyB2WP1qfMZkmozOQXSVYtB3e5k=
github.com/luxfi/ids v1.2.10/go.mod h1:QBIwy3OHvrtskbUqKh1+OYRa6PsyR7f7oNX33sOfK7w=
github.com/luxfi/keychain v1.0.2 h1:uQgmjs37/VBIALEiYrrszTpxvtqr07/YvS9TnmxGafs=
github.com/luxfi/keychain v1.0.2/go.mod h1:q/4ULgZBlstKkwzOzG/0T6y73BDPgnkrcibbJyTvmbU=
github.com/luxfi/lattice/v7 v7.1.0 h1:mr3HvN6olNTS2LT/xAW/JBhTqfvpsGmsopDMeR7BSJs=
@@ -310,6 +332,8 @@ github.com/luxfi/net v0.0.4 h1:z1d6Q5c9/79jb4vF0XwBBjlF5swH5NsgfaXA+Pgojq8=
github.com/luxfi/net v0.0.4/go.mod h1:QvgHzCa767cVWtPpui0P7HW1IrA2+c++hhvaQ/t0yyw=
github.com/luxfi/node v1.24.29 h1:tgU1T7qTotckscE2r29lK8akVziQ2cSZtRu7XDpgB8Y=
github.com/luxfi/node v1.24.29/go.mod h1:0b5M2qAjpnWkuvhLqVpQioSiK8rPqyevKk35FOaqkEA=
github.com/luxfi/node v1.27.8 h1:pQC2L3C2rC1otSoOcbdIc1KtXJxlsnVQmvMp2AgnU64=
github.com/luxfi/node v1.27.8/go.mod h1:lpippK7+Fvy1YKNkTB4OoHoQ4vqdTc+0khs6VDuUibU=
github.com/luxfi/oracle v0.1.1-0.20260429020431-76258cfcddf9 h1:y+foW/ZJuTEb/AUUaJGrll2PVWumTiydWZuYJV4bJ/k=
github.com/luxfi/oracle v0.1.1-0.20260429020431-76258cfcddf9/go.mod h1:ueeF3b4SrhpCNb8hUYeP/kV7qgkp/BKKjsKbUhEjg40=
github.com/luxfi/p2p v1.19.2 h1:uqZq7ofmEDbXlTkv1QThtci01Q+dmDkNmAPeORIyP8E=
@@ -320,6 +344,8 @@ github.com/luxfi/precompile v0.5.23 h1:AhKZmc0qtb8iwHhRorCEN4VjVGQPUMTIZSCEPNRAv
github.com/luxfi/precompile v0.5.23/go.mod h1:K/1lY+UEYpQKelLFKhh0vnMM50uhW9HEf51CB4YBlto=
github.com/luxfi/protocol v0.0.3 h1:Teytlu6Gbd0HqJXuDvV84ArqRabEFR40yDNNQUOCpVE=
github.com/luxfi/protocol v0.0.3/go.mod h1:ZSA1i7f2SlN129UG7rUZ+doHvf5/mtiurJMqRwGB4M8=
github.com/luxfi/protocol v0.0.4 h1:wf3JSyeNMEabOUG0vExtIAtjfpJAyHXlepGBwv5g9NE=
github.com/luxfi/protocol v0.0.4/go.mod h1:9f35GLNlcHAz6LCvFBDZP5fTD2QnN0URXWGUOcD1JPU=
github.com/luxfi/relay v0.0.0-20260429020048-c629fe160d3c h1:wiOLqdEEjIoq+Uubkm6F6GYQue+rzqnITScM3ohWGqI=
github.com/luxfi/relay v0.0.0-20260429020048-c629fe160d3c/go.mod h1:P408Sn9NGwtcDOoGdkmWe0484dkWDvEvDDBM44Cv+s4=
github.com/luxfi/resource v0.0.1 h1:mTh+ICWSy548GTUSSyx7V/X5dV18oEwxZeQEYGJQhD4=
@@ -352,6 +378,8 @@ github.com/luxfi/utils v1.1.4 h1:8OY0jXCkpp6OotN1Y++6DATJkvtEwzq2k0p56imJlAk=
github.com/luxfi/utils v1.1.4/go.mod h1:c3yz1RjzrB+cs5GZm+q1T3/2cCKElO9vxm9yRRtgSEM=
github.com/luxfi/utxo v0.2.6 h1:3iICLel6+v4Q6Bhnyppd6VFw43Kk862SDDfgzOhjJR4=
github.com/luxfi/utxo v0.2.6/go.mod h1:lRA7XK1ree1xs8qBZKnSSHxZMBadOEsqhZOqxnOpgcw=
github.com/luxfi/utxo v0.3.0 h1:Ok9VrICkFTRKjf3oTOovIPbPwiRpEZQ/MEFw7gFxpPo=
github.com/luxfi/utxo v0.3.0/go.mod h1:e1KQHhjYTpc0zugPbGuffezUoz2ZFvha5I3LoFB10/M=
github.com/luxfi/validators v1.2.0 h1:VygpiBqBAdGrfkb7xzE2yrVmnXaqE+hm8FLWdGXO7G8=
github.com/luxfi/validators v1.2.0/go.mod h1:GYLulrNXAan23ZlX7sgWVbVnLpUexeB/m2qr2ymsXok=
github.com/luxfi/version v1.0.1 h1:T/1KYWEMmsrNQk7pN7PFPAwh/7XbeX7cFAKLBqI37Sk=
@@ -360,8 +388,12 @@ github.com/luxfi/vm v1.0.40 h1:kA0V/9p1VdC88EjgbljWb8t+fl9qz5bCyF3IxnV20yg=
github.com/luxfi/vm v1.0.40/go.mod h1:Y5WUKhT76PR6HnbUykHBWI2f5sjssrm5BL6/o7b6IfQ=
github.com/luxfi/warp v1.18.5 h1:yXFCT+lnvzJHs8nVvfUCQ9wNvhtgbDGaXJkJeiwgKf4=
github.com/luxfi/warp v1.18.5/go.mod h1:SFyC529HDvbP/TWRAdYQSyJUliMa5JKFRtBrTLEElp4=
github.com/luxfi/warp v1.18.6 h1:+ly7mHz77ig4yUyLax32aAjk7tiQQ6eygzOSDNfYRbQ=
github.com/luxfi/warp v1.18.6/go.mod h1:OBN23yiGl+E4qupkPHuetBIEqsI8q5leE8WJH8soFjY=
github.com/luxfi/zapdb v1.8.0 h1:E9hXMW1MTuS6kmDVs07j62gIq5qI5gZOdyzVfiBc1wg=
github.com/luxfi/zapdb v1.8.0/go.mod h1:Qukh3hDRD0MnxA6z+a28JTnXhN85AiLLgp6TYr4QAMc=
github.com/luxfi/zapdb v1.10.0 h1:1lLHEmkyC0BucnA/zjQYsMkUVxuEo2vQkEaQGjYfuuc=
github.com/luxfi/zapdb v1.10.0/go.mod h1:Qukh3hDRD0MnxA6z+a28JTnXhN85AiLLgp6TYr4QAMc=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -569,6 +601,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI=
golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q=
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA=
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -638,6 +672,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -656,6 +692,8 @@ golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=