mirror of
https://github.com/luxfi/evm.git
synced 2026-09-24 00:27:44 +00:00
evm: bump luxfi/geth v1.16.90; assorted fixes
Bumps luxfi/geth pin to v1.16.90 to pull in the PQ profile gate (refuse(Op) at every classical precompile) and the restored p3q + pulsar registrations. Transitively bumps luxfi/precompile to v0.5.16. Additional fixes: - core/genesis.go: skip WithdrawalsHash on genesis block to preserve the canonical Lux mainnet genesis hash (chain ID 96369) under Durango fork activation. - params/config_extra.go: surface SetEthUpgrades errors with os.Stderr context for boot diagnostics. - precompile/contracts/warp/module.go + precompile/modules/registerer.go: housekeeping. Removed stale .bak files.
This commit is contained in:
@@ -1,597 +0,0 @@
|
||||
// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved.
|
||||
// See the file LICENSE for licensing terms.
|
||||
//
|
||||
// This file is a derived work, based on the go-ethereum library whose original
|
||||
// notices appear below.
|
||||
//
|
||||
// It is distributed under a license compatible with the licensing terms of the
|
||||
// original code from which it is derived.
|
||||
//
|
||||
// Much love to the original authors for their work.
|
||||
// **********
|
||||
// Copyright 2020 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Tests that abnormal program termination (i.e.crash) and restart can recovery
|
||||
// the snapshot properly if the snapshot is enabled.
|
||||
|
||||
package core
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math/big"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/luxfi/evm/consensus"
|
||||
"github.com/luxfi/evm/consensus/dummy"
|
||||
"github.com/luxfi/evm/params"
|
||||
"github.com/luxfi/evm/plugin/evm/upgrade/legacy"
|
||||
"github.com/luxfi/geth/common"
|
||||
"github.com/luxfi/geth/core/rawdb"
|
||||
"github.com/luxfi/geth/core/types"
|
||||
"github.com/luxfi/geth/core/vm"
|
||||
"github.com/luxfi/geth/ethdb"
|
||||
)
|
||||
|
||||
// snapshotTestBasic wraps the common testing fields in the snapshot tests.
|
||||
type snapshotTestBasic struct {
|
||||
scheme string // Disk scheme used for storing trie nodes
|
||||
chainBlocks int // Number of blocks to generate for the canonical chain
|
||||
snapshotBlock uint64 // Block number of the relevant snapshot disk layer
|
||||
|
||||
expCanonicalBlocks int // Number of canonical blocks expected to remain in the database (excl. genesis)
|
||||
expHeadBlock uint64 // Block number of the expected head full block
|
||||
expSnapshotBottom uint64 // The block height corresponding to the snapshot disk layer
|
||||
|
||||
// share fields, set in runtime
|
||||
datadir string
|
||||
ancient string
|
||||
db ethdb.Database
|
||||
genDb ethdb.Database
|
||||
engine consensus.Engine
|
||||
gspec *Genesis
|
||||
|
||||
lastAcceptedHash common.Hash
|
||||
}
|
||||
|
||||
func (basic *snapshotTestBasic) prepare(t *testing.T) (*BlockChain, []*types.Block) {
|
||||
// Create a temporary persistent database
|
||||
datadir := t.TempDir()
|
||||
ancient := path.Join(datadir, "ancient")
|
||||
|
||||
// For testing, use a memory database instead
|
||||
db := rawdb.NewMemoryDatabase()
|
||||
// Initialize a fresh chain
|
||||
var (
|
||||
gspec = &Genesis{
|
||||
BaseFee: big.NewInt(legacy.BaseFee),
|
||||
Config: params.TestChainConfig,
|
||||
}
|
||||
engine = dummy.NewFullFaker()
|
||||
)
|
||||
chain, err := NewBlockChain(db, DefaultCacheConfigWithScheme(basic.scheme), gspec, engine, vm.Config{}, common.Hash{}, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create chain: %v", err)
|
||||
}
|
||||
genDb, blocks, _, _ := GenerateChainWithGenesis(gspec, engine, basic.chainBlocks, 10, func(i int, b *BlockGen) {})
|
||||
|
||||
// genesis as last accepted
|
||||
basic.lastAcceptedHash = chain.GetBlockByNumber(0).Hash()
|
||||
|
||||
// Insert the blocks with configured settings.
|
||||
var breakpoints []uint64
|
||||
breakpoints = append(breakpoints, basic.snapshotBlock)
|
||||
var startPoint uint64
|
||||
for _, point := range breakpoints {
|
||||
if _, err := chain.InsertChain(blocks[startPoint:point]); err != nil {
|
||||
t.Fatalf("Failed to import canonical chain start: %v", err)
|
||||
}
|
||||
startPoint = point
|
||||
|
||||
if basic.snapshotBlock > 0 && basic.snapshotBlock == point {
|
||||
// Flushing from 0 to snapshotBlock into the disk
|
||||
for i := uint64(0); i < point; i++ {
|
||||
if err := chain.Accept(blocks[i]); err != nil {
|
||||
t.Fatalf("Failed to accept block %v: %v", i, err)
|
||||
}
|
||||
basic.lastAcceptedHash = blocks[i].Hash()
|
||||
}
|
||||
chain.DrainAcceptorQueue()
|
||||
|
||||
diskRoot, blockRoot := chain.snaps.DiskRoot(), blocks[point-1].Root()
|
||||
if !bytes.Equal(diskRoot.Bytes(), blockRoot.Bytes()) {
|
||||
t.Fatalf("Failed to flush disk layer change, want %x, got %x", blockRoot, diskRoot)
|
||||
}
|
||||
}
|
||||
}
|
||||
if _, err := chain.InsertChain(blocks[startPoint:]); err != nil {
|
||||
t.Fatalf("Failed to import canonical chain tail: %v", err)
|
||||
}
|
||||
|
||||
// Set runtime fields
|
||||
basic.datadir = datadir
|
||||
basic.ancient = ancient
|
||||
basic.db = db
|
||||
basic.genDb = genDb
|
||||
basic.engine = engine
|
||||
basic.gspec = gspec
|
||||
return chain, blocks
|
||||
}
|
||||
|
||||
func (basic *snapshotTestBasic) verify(t *testing.T, chain *BlockChain, blocks []*types.Block) {
|
||||
// Iterate over all the remaining blocks and ensure there are no gaps
|
||||
verifyNoGaps(t, chain, true, blocks)
|
||||
verifyCutoff(t, chain, true, blocks, basic.expCanonicalBlocks)
|
||||
|
||||
if head := chain.CurrentHeader(); head.Number.Uint64() != basic.expHeadBlock {
|
||||
t.Errorf("Head header mismatch: have %d, want %d", head.Number, basic.expHeadBlock)
|
||||
}
|
||||
if head := chain.CurrentBlock(); head.Number.Uint64() != basic.expHeadBlock {
|
||||
t.Errorf("Head block mismatch: have %d, want %d", head.Number, basic.expHeadBlock)
|
||||
}
|
||||
|
||||
// Check the disk layer, ensure they are matched
|
||||
block := chain.GetBlockByNumber(basic.expSnapshotBottom)
|
||||
if block == nil {
|
||||
t.Errorf("The corresponding block[%d] of snapshot disk layer is missing", basic.expSnapshotBottom)
|
||||
} else if !bytes.Equal(chain.snaps.DiskRoot().Bytes(), block.Root().Bytes()) {
|
||||
t.Errorf("The snapshot disk layer root is incorrect, want %x, get %x", block.Root(), chain.snaps.DiskRoot())
|
||||
} else if len(chain.snaps.Snapshots(block.Hash(), -1, false)) != 1 {
|
||||
t.Errorf("The corresponding block[%d] of snapshot disk layer is missing", basic.expSnapshotBottom)
|
||||
}
|
||||
|
||||
// Check the snapshot, ensure it's integrated
|
||||
if err := chain.snaps.Verify(block.Root()); err != nil {
|
||||
t.Errorf("The disk layer is not integrated %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
//nolint:unused
|
||||
func (basic *snapshotTestBasic) dump() string {
|
||||
buffer := new(strings.Builder)
|
||||
|
||||
fmt.Fprint(buffer, "Chain:\n G")
|
||||
for i := 0; i < basic.chainBlocks; i++ {
|
||||
fmt.Fprintf(buffer, "->C%d", i+1)
|
||||
}
|
||||
fmt.Fprint(buffer, " (HEAD)\n\n")
|
||||
|
||||
fmt.Fprintf(buffer, "Snapshot: G")
|
||||
if basic.snapshotBlock > 0 {
|
||||
fmt.Fprintf(buffer, ", C%d", basic.snapshotBlock)
|
||||
}
|
||||
fmt.Fprint(buffer, "\n")
|
||||
|
||||
//if crash {
|
||||
// fmt.Fprintf(buffer, "\nCRASH\n\n")
|
||||
//} else {
|
||||
// fmt.Fprintf(buffer, "\nSetHead(%d)\n\n", basic.setHead)
|
||||
//}
|
||||
fmt.Fprintf(buffer, "------------------------------\n\n")
|
||||
|
||||
fmt.Fprint(buffer, "Expected in leveldb:\n G")
|
||||
for i := 0; i < basic.expCanonicalBlocks; i++ {
|
||||
fmt.Fprintf(buffer, "->C%d", i+1)
|
||||
}
|
||||
fmt.Fprintf(buffer, "\n\n")
|
||||
fmt.Fprintf(buffer, "Expected head header : C%d\n", basic.expHeadBlock)
|
||||
if basic.expHeadBlock == 0 {
|
||||
fmt.Fprintf(buffer, "Expected head block : G\n")
|
||||
} else {
|
||||
fmt.Fprintf(buffer, "Expected head block : C%d\n", basic.expHeadBlock)
|
||||
}
|
||||
if basic.expSnapshotBottom == 0 {
|
||||
fmt.Fprintf(buffer, "Expected snapshot disk : G\n")
|
||||
} else {
|
||||
fmt.Fprintf(buffer, "Expected snapshot disk : C%d\n", basic.expSnapshotBottom)
|
||||
}
|
||||
return buffer.String()
|
||||
}
|
||||
|
||||
func (basic *snapshotTestBasic) teardown() {
|
||||
basic.db.Close()
|
||||
basic.genDb.Close()
|
||||
os.RemoveAll(basic.datadir)
|
||||
os.RemoveAll(basic.ancient)
|
||||
}
|
||||
|
||||
// snapshotTest is a test case type for normal snapshot recovery.
|
||||
// It can be used for testing that restart Geth normally.
|
||||
type snapshotTest struct {
|
||||
snapshotTestBasic
|
||||
}
|
||||
|
||||
func (snaptest *snapshotTest) test(t *testing.T) {
|
||||
// It's hard to follow the test case, visualize the input
|
||||
// log.Root().SetHandler(log.LevelFilterHandler(log.LevelTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(true))))
|
||||
// fmt.Println(tt.dump())
|
||||
chain, blocks := snaptest.prepare(t)
|
||||
|
||||
// Restart the chain normally
|
||||
chain.Stop()
|
||||
newchain, err := NewBlockChain(snaptest.db, DefaultCacheConfigWithScheme(snaptest.scheme), snaptest.gspec, snaptest.engine, vm.Config{}, snaptest.lastAcceptedHash, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to recreate chain: %v", err)
|
||||
}
|
||||
defer newchain.Stop()
|
||||
|
||||
snaptest.verify(t, newchain, blocks)
|
||||
}
|
||||
|
||||
// crashSnapshotTest is a test case type for irregular snapshot recovery.
|
||||
// It can be used for testing that restart Geth after the crash.
|
||||
type crashSnapshotTest struct {
|
||||
snapshotTestBasic
|
||||
}
|
||||
|
||||
func (snaptest *crashSnapshotTest) test(t *testing.T) {
|
||||
// It's hard to follow the test case, visualize the input
|
||||
// log.Root().SetHandler(log.LevelFilterHandler(log.LevelTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(true))))
|
||||
// fmt.Println(tt.dump())
|
||||
chain, blocks := snaptest.prepare(t)
|
||||
|
||||
// Pull the plug on the database, simulating a hard crash
|
||||
db := chain.db
|
||||
db.Close()
|
||||
chain.stopWithoutSaving()
|
||||
chain.triedb.Close()
|
||||
|
||||
// Start a new blockchain back up and see where the repair leads us
|
||||
// For testing, use a memory database instead
|
||||
newdb := rawdb.NewMemoryDatabase()
|
||||
defer newdb.Close()
|
||||
|
||||
// The interesting thing is: instead of starting the blockchain after
|
||||
// the crash, we do restart twice here: one after the crash and one
|
||||
// after the normal stop. It's used to ensure the broken snapshot
|
||||
// can be detected all the time.
|
||||
newchain, err := NewBlockChain(newdb, DefaultCacheConfigWithScheme(snaptest.scheme), snaptest.gspec, snaptest.engine, vm.Config{}, snaptest.lastAcceptedHash, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to recreate chain: %v", err)
|
||||
}
|
||||
newchain.Stop()
|
||||
|
||||
newchain, err = NewBlockChain(newdb, DefaultCacheConfigWithScheme(snaptest.scheme), snaptest.gspec, snaptest.engine, vm.Config{}, snaptest.lastAcceptedHash, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to recreate chain: %v", err)
|
||||
}
|
||||
defer newchain.Stop()
|
||||
|
||||
snaptest.verify(t, newchain, blocks)
|
||||
}
|
||||
|
||||
// gappedSnapshotTest is a test type used to test this scenario:
|
||||
// - have a complete snapshot
|
||||
// - restart without enabling the snapshot
|
||||
// - insert a few blocks
|
||||
// - restart with enabling the snapshot again
|
||||
type gappedSnapshotTest struct {
|
||||
snapshotTestBasic
|
||||
gapped int // Number of blocks to insert without enabling snapshot
|
||||
}
|
||||
|
||||
func (snaptest *gappedSnapshotTest) test(t *testing.T) {
|
||||
// It's hard to follow the test case, visualize the input
|
||||
// log.Root().SetHandler(log.LevelFilterHandler(log.LevelTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(true))))
|
||||
// fmt.Println(tt.dump())
|
||||
chain, blocks := snaptest.prepare(t)
|
||||
|
||||
// Insert blocks without enabling snapshot if gapping is required.
|
||||
chain.Stop()
|
||||
gappedBlocks, _, _ := GenerateChain(snaptest.gspec.Config, blocks[len(blocks)-1], snaptest.engine, snaptest.genDb, snaptest.gapped, 10, func(i int, b *BlockGen) {})
|
||||
|
||||
// Insert a few more blocks without enabling snapshot
|
||||
var cacheConfig = &CacheConfig{
|
||||
TrieCleanLimit: 256,
|
||||
TrieDirtyLimit: 256,
|
||||
SnapshotLimit: 0,
|
||||
Pruning: true,
|
||||
CommitInterval: 4096,
|
||||
StateHistory: 32,
|
||||
StateScheme: snaptest.scheme,
|
||||
}
|
||||
newchain, err := NewBlockChain(snaptest.db, cacheConfig, snaptest.gspec, snaptest.engine, vm.Config{}, snaptest.lastAcceptedHash, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to recreate chain: %v", err)
|
||||
}
|
||||
newchain.InsertChain(gappedBlocks)
|
||||
newchain.Stop()
|
||||
|
||||
// Restart the chain with enabling the snapshot
|
||||
newchain, err = NewBlockChain(snaptest.db, DefaultCacheConfigWithScheme(snaptest.scheme), snaptest.gspec, snaptest.engine, vm.Config{}, snaptest.lastAcceptedHash, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to recreate chain: %v", err)
|
||||
}
|
||||
defer newchain.Stop()
|
||||
|
||||
snaptest.verify(t, newchain, blocks)
|
||||
}
|
||||
|
||||
// wipeCrashSnapshotTest is the test type used to test this scenario:
|
||||
// - have a complete snapshot
|
||||
// - restart, insert more blocks without enabling the snapshot
|
||||
// - restart again with enabling the snapshot
|
||||
// - crash
|
||||
type wipeCrashSnapshotTest struct {
|
||||
snapshotTestBasic
|
||||
newBlocks int
|
||||
}
|
||||
|
||||
func (snaptest *wipeCrashSnapshotTest) test(t *testing.T) {
|
||||
// It's hard to follow the test case, visualize the input
|
||||
// log.Root().SetHandler(log.LevelFilterHandler(log.LevelTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(true))))
|
||||
// fmt.Println(tt.dump())
|
||||
chain, blocks := snaptest.prepare(t)
|
||||
|
||||
// Firstly, stop the chain properly, with all snapshot journal
|
||||
// and state committed.
|
||||
chain.Stop()
|
||||
|
||||
config := &CacheConfig{
|
||||
TrieCleanLimit: 256,
|
||||
TrieDirtyLimit: 256,
|
||||
SnapshotLimit: 0,
|
||||
Pruning: true,
|
||||
CommitInterval: 4096,
|
||||
StateHistory: 32,
|
||||
StateScheme: snaptest.scheme,
|
||||
}
|
||||
newchain, err := NewBlockChain(snaptest.db, config, snaptest.gspec, snaptest.engine, vm.Config{}, snaptest.lastAcceptedHash, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to recreate chain: %v", err)
|
||||
}
|
||||
newBlocks, _, _ := GenerateChain(snaptest.gspec.Config, blocks[len(blocks)-1], snaptest.engine, snaptest.genDb, snaptest.newBlocks, 10, func(i int, b *BlockGen) {})
|
||||
newchain.InsertChain(newBlocks)
|
||||
newchain.Stop()
|
||||
|
||||
// Restart the chain, the wiper should start working
|
||||
config = &CacheConfig{
|
||||
TrieCleanLimit: 256,
|
||||
TrieDirtyLimit: 256,
|
||||
SnapshotLimit: 256,
|
||||
Pruning: true,
|
||||
CommitInterval: 4096,
|
||||
StateHistory: 32,
|
||||
SnapshotWait: false, // Don't wait rebuild
|
||||
StateScheme: snaptest.scheme,
|
||||
}
|
||||
tmp, err := NewBlockChain(snaptest.db, config, snaptest.gspec, snaptest.engine, vm.Config{}, snaptest.lastAcceptedHash, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to recreate chain: %v", err)
|
||||
}
|
||||
|
||||
// Simulate the blockchain crash.
|
||||
tmp.triedb.Close()
|
||||
tmp.stopWithoutSaving()
|
||||
|
||||
newchain, err = NewBlockChain(snaptest.db, DefaultCacheConfigWithScheme(snaptest.scheme), snaptest.gspec, snaptest.engine, vm.Config{}, snaptest.lastAcceptedHash, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to recreate chain: %v", err)
|
||||
}
|
||||
snaptest.verify(t, newchain, blocks)
|
||||
newchain.Stop()
|
||||
}
|
||||
|
||||
// Tests a Geth restart with valid snapshot. Before the shutdown, all snapshot
|
||||
// journal will be persisted correctly. In this case no snapshot recovery is
|
||||
// required.
|
||||
func TestRestartWithNewSnapshot(t *testing.T) {
|
||||
// Chain:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD)
|
||||
//
|
||||
// Snapshot: G
|
||||
//
|
||||
// ------------------------------
|
||||
//
|
||||
// Expected in leveldb:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8
|
||||
//
|
||||
// Expected head header : C8
|
||||
// Expected head block : C4
|
||||
// Expected snapshot disk : C4
|
||||
for _, scheme := range []string{rawdb.HashScheme, rawdb.PathScheme} {
|
||||
test := &snapshotTest{
|
||||
snapshotTestBasic{
|
||||
scheme: scheme,
|
||||
chainBlocks: 8,
|
||||
snapshotBlock: 4,
|
||||
expCanonicalBlocks: 8,
|
||||
expHeadBlock: 4,
|
||||
expSnapshotBottom: 4, // Initial disk layer built from genesis
|
||||
},
|
||||
}
|
||||
test.test(t)
|
||||
test.teardown()
|
||||
}
|
||||
}
|
||||
|
||||
// Tests a Geth was crashed and restarts with a broken snapshot. In this case the
|
||||
// chain head should be rewound to the point with available state. And also the
|
||||
// new head should must be lower than disk layer. But there is no committed point
|
||||
// so the chain should be rewound to genesis and the disk layer should be left
|
||||
// for recovery.
|
||||
func TestNoCommitCrashWithNewSnapshot(t *testing.T) {
|
||||
// Chain:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD)
|
||||
//
|
||||
// Snapshot: G, C4
|
||||
//
|
||||
// CRASH
|
||||
//
|
||||
// ------------------------------
|
||||
//
|
||||
// Expected in leveldb:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8
|
||||
//
|
||||
// Expected head block : C4
|
||||
// Expected snapshot disk : C4
|
||||
for _, scheme := range []string{rawdb.HashScheme, rawdb.PathScheme} {
|
||||
test := &crashSnapshotTest{
|
||||
snapshotTestBasic{
|
||||
scheme: scheme,
|
||||
chainBlocks: 8,
|
||||
snapshotBlock: 4,
|
||||
expCanonicalBlocks: 8,
|
||||
expHeadBlock: 4,
|
||||
expSnapshotBottom: 4, // Last committed disk layer, wait recovery
|
||||
},
|
||||
}
|
||||
test.test(t)
|
||||
test.teardown()
|
||||
}
|
||||
}
|
||||
|
||||
// Tests a Geth was crashed and restarts with a broken snapshot. In this case the
|
||||
// chain head should be rewound to the point with available state. And also the
|
||||
// new head should must be lower than disk layer. But there is only a low committed
|
||||
// point so the chain should be rewound to committed point and the disk layer
|
||||
// should be left for recovery.
|
||||
func TestLowCommitCrashWithNewSnapshot(t *testing.T) {
|
||||
// Chain:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD)
|
||||
//
|
||||
// Snapshot: G, C4
|
||||
//
|
||||
// CRASH
|
||||
//
|
||||
// ------------------------------
|
||||
//
|
||||
// Expected in leveldb:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8
|
||||
//
|
||||
// Expected head block : C4
|
||||
// Expected snapshot disk : C4
|
||||
for _, scheme := range []string{rawdb.HashScheme, rawdb.PathScheme} {
|
||||
test := &crashSnapshotTest{
|
||||
snapshotTestBasic{
|
||||
scheme: scheme,
|
||||
chainBlocks: 8,
|
||||
snapshotBlock: 4,
|
||||
expCanonicalBlocks: 8,
|
||||
expHeadBlock: 4,
|
||||
expSnapshotBottom: 4, // Last committed disk layer, wait recovery
|
||||
},
|
||||
}
|
||||
test.test(t)
|
||||
test.teardown()
|
||||
}
|
||||
}
|
||||
|
||||
// Tests a Geth was crashed and restarts with a broken snapshot. In this case
|
||||
// the chain head should be rewound to the point with available state. And also
|
||||
// the new head should must be lower than disk layer. But there is only a high
|
||||
// committed point so the chain should be rewound to genesis and the disk layer
|
||||
// should be left for recovery.
|
||||
func TestHighCommitCrashWithNewSnapshot(t *testing.T) {
|
||||
// Chain:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD)
|
||||
//
|
||||
// Snapshot: G, C4
|
||||
//
|
||||
// CRASH
|
||||
//
|
||||
// ------------------------------
|
||||
//
|
||||
// Expected in leveldb:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8
|
||||
//
|
||||
// Expected head block : C4
|
||||
// Expected snapshot disk : C4
|
||||
for _, scheme := range []string{rawdb.HashScheme, rawdb.PathScheme} {
|
||||
test := &crashSnapshotTest{
|
||||
snapshotTestBasic{
|
||||
scheme: scheme,
|
||||
chainBlocks: 8,
|
||||
snapshotBlock: 4,
|
||||
expCanonicalBlocks: 8,
|
||||
expHeadBlock: 4,
|
||||
expSnapshotBottom: 4, // Last committed disk layer, wait recovery
|
||||
},
|
||||
}
|
||||
test.test(t)
|
||||
test.teardown()
|
||||
}
|
||||
}
|
||||
|
||||
// Tests a Geth was running with snapshot enabled. Then restarts without
|
||||
// enabling snapshot and after that re-enable the snapshot again. In this
|
||||
// case the snapshot should be rebuilt with latest chain head.
|
||||
func TestGappedNewSnapshot(t *testing.T) {
|
||||
// Chain:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD)
|
||||
//
|
||||
// Snapshot: G
|
||||
//
|
||||
// ------------------------------
|
||||
//
|
||||
// Expected in leveldb:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10
|
||||
//
|
||||
// Expected head block : G
|
||||
// Expected snapshot disk : G
|
||||
for _, scheme := range []string{rawdb.HashScheme, rawdb.PathScheme} {
|
||||
test := &gappedSnapshotTest{
|
||||
snapshotTestBasic: snapshotTestBasic{
|
||||
scheme: scheme,
|
||||
chainBlocks: 8,
|
||||
snapshotBlock: 0,
|
||||
expCanonicalBlocks: 10,
|
||||
expHeadBlock: 0,
|
||||
expSnapshotBottom: 0, // Rebuilt snapshot from the latest HEAD
|
||||
},
|
||||
gapped: 2,
|
||||
}
|
||||
test.test(t)
|
||||
test.teardown()
|
||||
}
|
||||
}
|
||||
|
||||
// Tests the Geth was running with a complete snapshot and then imports a few
|
||||
// more new blocks on top without enabling the snapshot. After the restart,
|
||||
// crash happens. Check everything is ok after the restart.
|
||||
func TestRecoverSnapshotFromWipingCrash(t *testing.T) {
|
||||
// Chain:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD)
|
||||
//
|
||||
// Snapshot: G
|
||||
//
|
||||
// ------------------------------
|
||||
//
|
||||
// Expected in leveldb:
|
||||
// G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10
|
||||
//
|
||||
// Expected head block : C4
|
||||
// Expected snapshot disk : C4
|
||||
for _, scheme := range []string{rawdb.HashScheme, rawdb.PathScheme} {
|
||||
test := &wipeCrashSnapshotTest{
|
||||
snapshotTestBasic: snapshotTestBasic{
|
||||
scheme: scheme,
|
||||
chainBlocks: 8,
|
||||
snapshotBlock: 4,
|
||||
expCanonicalBlocks: 10,
|
||||
expHeadBlock: 4,
|
||||
expSnapshotBottom: 4,
|
||||
},
|
||||
newBlocks: 2,
|
||||
}
|
||||
test.test(t)
|
||||
test.teardown()
|
||||
}
|
||||
}
|
||||
+10
-2
@@ -435,8 +435,16 @@ func (g *Genesis) toBlock(db ethdb.Database, triedb *triedb.Database) *types.Blo
|
||||
}
|
||||
}
|
||||
|
||||
// EIP-4895: Set empty withdrawals hash for Shanghai
|
||||
if conf.IsShanghai(num, g.Timestamp) {
|
||||
// EIP-4895: Set empty withdrawals hash for Shanghai.
|
||||
//
|
||||
// Lux genesis predates Shanghai/withdrawals: the canonical mainnet
|
||||
// genesis hash (chain ID 96369 = 0x3f4fa2a0…) was produced with the
|
||||
// 16-field header format (no WithdrawalsHash). Forks like Durango
|
||||
// (which alias to Shanghai for EVM-fork bookkeeping) may activate
|
||||
// at genesis timestamp, but the genesis BLOCK itself must remain
|
||||
// in pre-withdrawals format to preserve hash continuity. Only
|
||||
// post-genesis blocks (Number > 0) get a WithdrawalsHash here.
|
||||
if num.Sign() != 0 && conf.IsShanghai(num, g.Timestamp) {
|
||||
head.WithdrawalsHash = &types.EmptyWithdrawalsHash
|
||||
withdrawals = make([]*types.Withdrawal, 0)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved.
|
||||
// See the file LICENSE for licensing terms.
|
||||
|
||||
package core
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/luxfi/geth/core/types"
|
||||
"github.com/luxfi/geth/rlp"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// TestLuxGenesisFromJSON builds the genesis block from cchain.json and compares
|
||||
// hash + RLP bytes to the genesis recovered from the canonical RLP file.
|
||||
func TestLuxGenesisFromJSON(t *testing.T) {
|
||||
cchainPath := "/Users/z/work/lux/genesis/configs/mainnet/cchain.json"
|
||||
rlpPath := "/Users/z/work/lux/state/rlp/lux-mainnet/lux-mainnet-96369.rlp"
|
||||
|
||||
for _, p := range []string{cchainPath, rlpPath} {
|
||||
if _, err := os.Stat(p); os.IsNotExist(err) {
|
||||
t.Skipf("missing input %s", p)
|
||||
}
|
||||
}
|
||||
|
||||
// 1) Build the genesis block from JSON.
|
||||
jsonBytes, err := os.ReadFile(cchainPath)
|
||||
require.NoError(t, err)
|
||||
|
||||
var g Genesis
|
||||
require.NoError(t, json.Unmarshal(jsonBytes, &g))
|
||||
|
||||
// Override gasLimit to canonical 12M (cchain.json has 100M).
|
||||
g.GasLimit = 0xb71b00
|
||||
|
||||
// Defer shanghai/cancun beyond genesis to avoid Eth2 fields (e.g. WithdrawalsHash)
|
||||
// being added to the genesis header, which would force a 17-field RLP encoding.
|
||||
farFuture := uint64(253399622400)
|
||||
g.Config.ShanghaiTime = &farFuture
|
||||
g.Config.CancunTime = &farFuture
|
||||
|
||||
tmp := t.TempDir()
|
||||
_ = tmp
|
||||
// Use ToBlock without DB commit by extracting head computation.
|
||||
jsonBlock := g.ToBlock()
|
||||
jsonHeader := jsonBlock.Header()
|
||||
jsonRLP, err := rlp.EncodeToBytes(jsonHeader)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Logf("JSON-built genesis:")
|
||||
t.Logf(" hash: %s", jsonBlock.Hash().Hex())
|
||||
t.Logf(" state root: %s", jsonHeader.Root.Hex())
|
||||
t.Logf(" RLP len: %d", len(jsonRLP))
|
||||
t.Logf(" RLP: %s", hex.EncodeToString(jsonRLP))
|
||||
t.Logf(" ExtDataHash: %v", jsonHeader.ExtDataHash)
|
||||
t.Logf(" ExtDataGasUsed: %v", jsonHeader.ExtDataGasUsed)
|
||||
t.Logf(" BlockGasCost: %v", jsonHeader.BlockGasCost)
|
||||
t.Logf(" WithdrawalsHash:%v", jsonHeader.WithdrawalsHash)
|
||||
t.Logf(" BlobGasUsed: %v", jsonHeader.BlobGasUsed)
|
||||
t.Logf(" ExcessBlobGas: %v", jsonHeader.ExcessBlobGas)
|
||||
t.Logf(" ParentBeaconRoot:%v", jsonHeader.ParentBeaconRoot)
|
||||
t.Logf(" RequestsHash: %v", jsonHeader.RequestsHash)
|
||||
|
||||
// 2) Decode genesis from canonical RLP file.
|
||||
file, err := os.Open(rlpPath)
|
||||
require.NoError(t, err)
|
||||
defer file.Close()
|
||||
|
||||
stream := rlp.NewStream(file, 0)
|
||||
var rlpBlock types.Block
|
||||
require.NoError(t, stream.Decode(&rlpBlock))
|
||||
rlpHeader := rlpBlock.Header()
|
||||
|
||||
rlpHeaderBytes, err := rlp.EncodeToBytes(rlpHeader)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Logf("RLP-decoded genesis:")
|
||||
t.Logf(" hash: %s", rlpBlock.Hash().Hex())
|
||||
t.Logf(" state root: %s", rlpHeader.Root.Hex())
|
||||
t.Logf(" RLP len: %d", len(rlpHeaderBytes))
|
||||
t.Logf(" RLP: %s", hex.EncodeToString(rlpHeaderBytes))
|
||||
}
|
||||
@@ -22,7 +22,7 @@ require (
|
||||
github.com/luxfi/crypto v1.18.1
|
||||
github.com/luxfi/database v1.18.1
|
||||
github.com/luxfi/filesystem v0.0.1
|
||||
github.com/luxfi/geth v1.16.88
|
||||
github.com/luxfi/geth v1.16.90
|
||||
github.com/luxfi/go-bip39 v1.1.2
|
||||
github.com/luxfi/gpu v0.30.0
|
||||
github.com/luxfi/ids v1.2.9
|
||||
@@ -32,7 +32,7 @@ require (
|
||||
github.com/luxfi/math/safe v0.0.1
|
||||
github.com/luxfi/metric v1.5.1
|
||||
github.com/luxfi/p2p v1.19.2
|
||||
github.com/luxfi/precompile v0.5.14
|
||||
github.com/luxfi/precompile v0.5.16
|
||||
github.com/luxfi/runtime v1.0.1
|
||||
github.com/luxfi/sys v0.0.0-20260110090042-50187ec5ffd8
|
||||
github.com/luxfi/timer v1.0.2
|
||||
@@ -92,6 +92,7 @@ require (
|
||||
github.com/luxfi/fhe v1.8.0 // indirect
|
||||
github.com/luxfi/lattice/v7 v7.0.0 // indirect
|
||||
github.com/luxfi/node v1.23.4 // indirect
|
||||
github.com/luxfi/pq v0.0.0-20260511232911-de15d6ce2f0f // indirect
|
||||
github.com/luxfi/protocol v0.0.2 // indirect
|
||||
github.com/luxfi/resource v0.0.1 // indirect
|
||||
github.com/luxfi/threshold v1.5.5 // indirect
|
||||
|
||||
@@ -226,8 +226,8 @@ github.com/luxfi/filesystem v0.0.1 h1:VZ6xMFKaAPBW/ddlMsDnI2G0VU1lV5rYaVcW5d+KwE
|
||||
github.com/luxfi/filesystem v0.0.1/go.mod h1:OQVSU6XNwqrr1AI+MqkID2taHUclx7NYmmr3svgttec=
|
||||
github.com/luxfi/formatting v1.0.1 h1:ZnE1rAdEUds9yAegdVdGDOBGN6hLMPOv6E03Fp8IEYo=
|
||||
github.com/luxfi/formatting v1.0.1/go.mod h1:mYzNf5DJOiqSSKUPzNj5dKy4tstFbN3pZlkI5716eKc=
|
||||
github.com/luxfi/geth v1.16.88 h1:I46mMJPbLh2qfqjFDtP91RTSoyj1KdWiTmZX6rjHqaA=
|
||||
github.com/luxfi/geth v1.16.88/go.mod h1:E5YcGOW9jB6Rgo4LB7NlTZxvkPzIoh1w7q56O63Zf1g=
|
||||
github.com/luxfi/geth v1.16.90 h1:LLvhUggNyK2bZSN1gtH3yknVB8YPXcS9sHrqTZwWpfg=
|
||||
github.com/luxfi/geth v1.16.90/go.mod h1:ynzwEXqLboNr1R1wdht/SqYnGINtaU4lYajR779JxgE=
|
||||
github.com/luxfi/go-bip39 v1.1.2 h1:p+wLMPGs6MLQh7q0YIsmy2EhHL7LHiELEGTJko6t/Jg=
|
||||
github.com/luxfi/go-bip39 v1.1.2/go.mod h1:96de9VkR2kY/ASAnhMtvt3TSh+PZkAFAngNj0GjRGDo=
|
||||
github.com/luxfi/gpu v0.30.0 h1:k+7EDp/WHTa0176zXet1UXTl8IcZcp1ZkS8GUJ5l2iU=
|
||||
@@ -252,8 +252,10 @@ github.com/luxfi/node v1.23.4 h1:NzARkjbFUtlHyMEqSFQ0VeQRKF5eGWWwfQA7PO4f9VQ=
|
||||
github.com/luxfi/node v1.23.4/go.mod h1:eSzDGb6N60yHIANLmU5l8uRLlrTzVGq9yvwgITGeWkU=
|
||||
github.com/luxfi/p2p v1.19.2 h1:uqZq7ofmEDbXlTkv1QThtci01Q+dmDkNmAPeORIyP8E=
|
||||
github.com/luxfi/p2p v1.19.2/go.mod h1:tI9Bt1R0ouvVtJvXG4e20GlGeV4AR230k4mFF9Vglzk=
|
||||
github.com/luxfi/precompile v0.5.14 h1:z8mlWv7yWqWczWp59qoxTp0B7l/a0HMtMBPk27MEKyg=
|
||||
github.com/luxfi/precompile v0.5.14/go.mod h1:r2nImBshkpIfl3n0+Zas0uxfJ3c7JB0E0qpJkBtSV/s=
|
||||
github.com/luxfi/pq v0.0.0-20260511232911-de15d6ce2f0f h1:heVZJMlU6RtYZGjgmqFbtcO9RCMl+6Sfchz/n0U/6+U=
|
||||
github.com/luxfi/pq v0.0.0-20260511232911-de15d6ce2f0f/go.mod h1:8bppZcRElfrVt0n3nYCZW3iX1TvhvzNbdjNdK1irgIE=
|
||||
github.com/luxfi/precompile v0.5.16 h1:tIY7/yK856lggOvv/5vVC0Cr7gRUs6Wi7MhibIszsng=
|
||||
github.com/luxfi/precompile v0.5.16/go.mod h1:r2nImBshkpIfl3n0+Zas0uxfJ3c7JB0E0qpJkBtSV/s=
|
||||
github.com/luxfi/protocol v0.0.2 h1:TAuXMm1K4VDpG3B3brq1EE9Lb7XlbhQmVBObskgNhmc=
|
||||
github.com/luxfi/protocol v0.0.2/go.mod h1:Yjn2VRwn5PXim0+JTalAyrVG6YbmuSnYOfeUXSbAsqA=
|
||||
github.com/luxfi/resource v0.0.1 h1:mTh+ICWSy548GTUSSyx7V/X5dV18oEwxZeQEYGJQhD4=
|
||||
|
||||
-572
@@ -1,572 +0,0 @@
|
||||
github.com/ALTree/bigfloat v0.2.0 h1:AwNzawrpFuw55/YDVlcPw0F0cmmXrmngBHhVrvdXPvM=
|
||||
github.com/ALTree/bigfloat v0.2.0/go.mod h1:+NaH2gLeY6RPBPPQf4aRotPPStg+eXc8f9ZaE4vRfD4=
|
||||
github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE=
|
||||
github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
|
||||
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
|
||||
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/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20260311194731-d5b7577c683d h1:EA+kZ8mxGb1W/ewiIBMzb/1gg5BiW1Fvr3r4qCUBJEg=
|
||||
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20260311194731-d5b7577c683d/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bits-and-blooms/bitset v1.24.4 h1:95H15Og1clikBrKr/DuzMXkQzECs1M6hhoGXLwLQOZE=
|
||||
github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
|
||||
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
|
||||
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
||||
github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
|
||||
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8=
|
||||
github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4=
|
||||
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
|
||||
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
|
||||
github.com/cockroachdb/errors v1.12.0 h1:d7oCs6vuIMUQRVbi6jWWWEJZahLCfJpnJSVobd1/sUo=
|
||||
github.com/cockroachdb/errors v1.12.0/go.mod h1:SvzfYNNBshAVbZ8wzNc/UPK3w1vf0dKDUP41ucAIf7g=
|
||||
github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 h1:pU88SPhIFid6/k0egdR5V6eALQYq2qbSmukrkgIh/0A=
|
||||
github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
|
||||
github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 h1:ASDL+UJcILMqgNeV5jiqR4j+sTuvQNHdf2chuKj1M5k=
|
||||
github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506/go.mod h1:Mw7HqKr2kdtu6aYGn3tPmAftiP3QPX63LdK/zcariIo=
|
||||
github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw=
|
||||
github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo=
|
||||
github.com/cockroachdb/redact v1.1.6 h1:zXJBwDZ84xJNlHl1rMyCojqyIxv+7YUpQiJLQ7n4314=
|
||||
github.com/cockroachdb/redact v1.1.6/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb h1:3bCgBvB8PbJVMX1ouCcSIxvsqKPYM7gs72o0zC76n9g=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
|
||||
github.com/consensys/gnark-crypto v0.20.1 h1:PXDUBvk8AzhvWowHLWBEAfUQcV1/aZgWIqD6eMpXmDg=
|
||||
github.com/consensys/gnark-crypto v0.20.1/go.mod h1:RBWrSgy+IDbGR69RRV313th3M/aZU1ubk2om+qHuTSc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/crate-crypto/go-eth-kzg v1.5.0 h1:FYRiJMJG2iv+2Dy3fi14SVGjcPteZ5HAAUe4YWlJygc=
|
||||
github.com/crate-crypto/go-eth-kzg v1.5.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI=
|
||||
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg=
|
||||
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM=
|
||||
github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4=
|
||||
github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/cronokirby/saferith v0.33.0 h1:TgoQlfsD4LIwx71+ChfRcIpjkw+RPOapDEVxa+LhwLo=
|
||||
github.com/cronokirby/saferith v0.33.0/go.mod h1:QKJhjoqUtBsXCAVEjw38mFqoi7DebT7kthcD7UzbnoA=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/deckarep/golang-set/v2 v2.8.0 h1:swm0rlPCmdWn9mESxKOjWk8hXSqoxOp+ZlfuyaAdFlQ=
|
||||
github.com/deckarep/golang-set/v2 v2.8.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
|
||||
github.com/dgraph-io/badger/v4 v4.9.0 h1:tpqWb0NewSrCYqTvywbcXOhQdWcqephkVkbBmaaqHzc=
|
||||
github.com/dgraph-io/badger/v4 v4.9.0/go.mod h1:5/MEx97uzdPUHR4KtkNt8asfI2T4JiEiQlV7kWUo8c0=
|
||||
github.com/dgraph-io/ristretto/v2 v2.4.0 h1:I/w09yLjhdcVD2QV192UJcq8dPBaAJb9pOuMyNy0XlU=
|
||||
github.com/dgraph-io/ristretto/v2 v2.4.0/go.mod h1:0KsrXtXvnv0EqnzyowllbVJB8yBonswa2lTCK2gGo9E=
|
||||
github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38=
|
||||
github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
|
||||
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||
github.com/dop251/goja v0.0.0-20251201205617-2bb4c724c0f9 h1:3uSSOd6mVlwcX3k5OYOpiDqFgRmaE2dBfLvVIFWWHrw=
|
||||
github.com/dop251/goja v0.0.0-20251201205617-2bb4c724c0f9/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4=
|
||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/emicklei/dot v1.11.0 h1:zsrhCuFHAJge/aZIC4N4LdHy5tqYu4tWEaUzIwdYj4Y=
|
||||
github.com/emicklei/dot v1.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
|
||||
github.com/ethereum/c-kzg-4844/v2 v2.1.7 h1:aat3CuITdDbPC6pmEGRT0zJ5eOxzrZj8TJT5z7Xk//M=
|
||||
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/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8=
|
||||
github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
|
||||
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/fjl/gencodec v0.1.1 h1:DhQY29Q6JLXB/GgMqE86NbOEuvckiYcJCbXFu02toms=
|
||||
github.com/fjl/gencodec v0.1.1/go.mod h1:chDHL3wKXuBgauP8x3XNZkl5EIAR5SoCTmmmDTZRzmw=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
|
||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
|
||||
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
||||
github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc=
|
||||
github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8=
|
||||
github.com/gballet/go-libpcsclite v0.0.0-20250918194357-1ec6f2e601c6 h1:ko+DlyhLqUHpgrvwqs5ybydoGAqjpJQTXpAS7vUqVlM=
|
||||
github.com/gballet/go-libpcsclite v0.0.0-20250918194357-1ec6f2e601c6/go.mod h1:3IVE7v4II2gS2V5amIH7F7NeYQtbbORtQtjdflgS1vk=
|
||||
github.com/getsentry/sentry-go v0.40.0 h1:VTJMN9zbTvqDqPwheRVLcp0qcUcM+8eFivvGocAaSbo=
|
||||
github.com/getsentry/sentry-go v0.40.0/go.mod h1:eRXCoh3uvmjQLY6qu63BjUZnaBu5L5WhMV1RwYO8W5s=
|
||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
|
||||
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
||||
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
||||
github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q=
|
||||
github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=
|
||||
github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
||||
github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw=
|
||||
github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
|
||||
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/flatbuffers v25.12.19+incompatible h1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs=
|
||||
github.com/google/flatbuffers v25.12.19+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc=
|
||||
github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=
|
||||
github.com/google/renameio/v2 v2.0.2 h1:qKZs+tfn+arruZZhQ7TKC/ergJunuJicWS6gLDt/dGw=
|
||||
github.com/google/renameio/v2 v2.0.2/go.mod h1:OX+G6WHHpHq3NVj7cAOleLOwJfcQ1s3uUJQCrr78SWo=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gorilla/rpc v1.2.1 h1:yC+LMV5esttgpVvNORL/xX4jvTTEUE30UZhZ5JF7K9k=
|
||||
github.com/gorilla/rpc v1.2.1/go.mod h1:uNpOihAlF5xRFLuTYhfR0yfCTm0WTQSQttkMSptRfGk=
|
||||
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
|
||||
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c=
|
||||
github.com/hashicorp/go-bexpr v0.1.15 h1:flTYJAqZAlK+t8ezezb6WQGlRO1D4+GEF/HmH+xZo5k=
|
||||
github.com/hashicorp/go-bexpr v0.1.15/go.mod h1:HGKbAByHn2aJWUV47gL7+IjLK79iU3EZIbOwCXJZLoE=
|
||||
github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
|
||||
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db h1:IZUYC/xb3giYwBLMnr8d0TGTzPKFGNTCGgGLoyeX330=
|
||||
github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db/go.mod h1:xTEYN9KCHxuYHs+NmrmzFcnvHMzLLNiGFafCb1n3Mfg=
|
||||
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
|
||||
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
|
||||
github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA=
|
||||
github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
|
||||
github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
|
||||
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c=
|
||||
github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||
github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4=
|
||||
github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c=
|
||||
github.com/luxfi/accel v1.0.7 h1:ksHieAp50umwqxqgyHk9WiOmXM54kia3IEDb5H7FsM8=
|
||||
github.com/luxfi/accel v1.0.7/go.mod h1:iZD3oxffiMEIT/KvzD8bgwC/cBn4AYlMW3QJpbRa4RE=
|
||||
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/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=
|
||||
github.com/luxfi/cache v1.2.1/go.mod h1:co7JTxZZHpKT31Yh01LFp5aZOxmoUg157FhBLQdQHVU=
|
||||
github.com/luxfi/codec v1.1.4 h1:Yl8ZalMNkqo7cD6R9AjczAajkLOmsjyZ9+DASVYHrvg=
|
||||
github.com/luxfi/codec v1.1.4/go.mod h1:oGQ3j6E8c2P0pL0irYtWkrB1hmDUFIE0puXHK4gV5KI=
|
||||
github.com/luxfi/compress v0.0.5 h1:4tEUHw5MK1bu5UOjfYCt4OKMiH7yykIgmGPRA/BfJTM=
|
||||
github.com/luxfi/compress v0.0.5/go.mod h1:Cc1yxD2pfzrvpO32W2GDwLKff+CylHEvzZh2Ko8RSIU=
|
||||
github.com/luxfi/concurrent v0.0.3 h1:eJyv1fhaC0jMLMw6+QS774cUmp7GK+ouMgvLCqnC7cc=
|
||||
github.com/luxfi/concurrent v0.0.3/go.mod h1:Aj/FR5NpM0cB2P4Nt3+tz9+dV6V+LUW4HuMgSjwq5hw=
|
||||
github.com/luxfi/consensus v1.22.70 h1:sfXS5Ref0rOaTO1fJFoETmgAcs/y8y8eNSezq8S2Qwk=
|
||||
github.com/luxfi/consensus v1.22.70/go.mod h1:m4uQVYjliw8Bjg6ssLzIY88vFcgrEUc5laWPzj/YVPs=
|
||||
github.com/luxfi/constants v1.4.4 h1:R5MaZkQs70eHceZx+2LS9G2gmG7OcLF98BSkJol3OJE=
|
||||
github.com/luxfi/constants v1.4.4/go.mod h1:ENkJ121cmDEkwQPDiKK4QhnTnW9u37PGpepbrdVcAmc=
|
||||
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/crypto v1.17.44 h1:N3uWiHs1hC0DGsr2jwIdTfsEcpVR1Da583Z1LcqOaH8=
|
||||
github.com/luxfi/crypto v1.17.44/go.mod h1:3ahTd4kNZT5WtEiVWbzGtd05wUjjrlA7eSkqeDNL8U4=
|
||||
github.com/luxfi/database v1.17.44 h1:hfiTls7sqbweW+o4iaZqB8P997paC+vpgWmhN6v5MJ0=
|
||||
github.com/luxfi/database v1.17.44/go.mod h1:6Ey5y3I0WNLHbxIlIdFqUuKfBg+b0fAgTA8FgRgQ8zg=
|
||||
github.com/luxfi/fhe v1.7.6 h1:H2WqsWa/YoeVjDa2EjMtLMyep3MqJgS/rnBwjZSGMcw=
|
||||
github.com/luxfi/fhe v1.7.6/go.mod h1:evKiXq9Kf7d1SttKZt7ItBAhZ1fQ6O3+iXsD1lw/RYo=
|
||||
github.com/luxfi/filesystem v0.0.1 h1:VZ6xMFKaAPBW/ddlMsDnI2G0VU1lV5rYaVcW5d+KwEY=
|
||||
github.com/luxfi/filesystem v0.0.1/go.mod h1:OQVSU6XNwqrr1AI+MqkID2taHUclx7NYmmr3svgttec=
|
||||
github.com/luxfi/formatting v1.0.1 h1:ZnE1rAdEUds9yAegdVdGDOBGN6hLMPOv6E03Fp8IEYo=
|
||||
github.com/luxfi/formatting v1.0.1/go.mod h1:mYzNf5DJOiqSSKUPzNj5dKy4tstFbN3pZlkI5716eKc=
|
||||
github.com/luxfi/geth v1.16.77 h1:bFbSV6C0KCqU6bFtq+I8hJw9bWAj2hCZXyx0fJPIUfo=
|
||||
github.com/luxfi/geth v1.16.77/go.mod h1:al8oFHXxsVly+Y3fcRHIhNhBSgAFNRR5Ey6YKemEDUs=
|
||||
github.com/luxfi/go-bip39 v1.1.2 h1:p+wLMPGs6MLQh7q0YIsmy2EhHL7LHiELEGTJko6t/Jg=
|
||||
github.com/luxfi/go-bip39 v1.1.2/go.mod h1:96de9VkR2kY/ASAnhMtvt3TSh+PZkAFAngNj0GjRGDo=
|
||||
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/lattice/v7 v7.0.0 h1:d1vgan6mlb2KtwYfPc1g69uxVYaoVYZmlrIm4aCO88w=
|
||||
github.com/luxfi/lattice/v7 v7.0.0/go.mod h1:PFDdOkuGTQ0cbJMbKojzEJMGWUQmZW+wK9/wJ9F9fOs=
|
||||
github.com/luxfi/log v1.4.1 h1:rIfFRodb9jrD/w7KayaUk0Oc+37PaQQdKEEMJCjR8gw=
|
||||
github.com/luxfi/log v1.4.1/go.mod h1:64IE3xRMJcpkQwnPUfJw3pDj7wU0kRS7BZ9wM7R72jk=
|
||||
github.com/luxfi/math v1.2.4 h1:iVz7s0gToCNUU/2cLT8gUa8MLzc0YRp4jBmeXBeKdXk=
|
||||
github.com/luxfi/math v1.2.4/go.mod h1:i+Am9YvFsqDE75ZW8MPE62XCXGukXNiN/7mD9SKxxZY=
|
||||
github.com/luxfi/math/big v0.1.0 h1:Vz4c0RsZVPdIKPsHPgAJChH/R3p15WHRUz7LkLf+NIQ=
|
||||
github.com/luxfi/math/big v0.1.0/go.mod h1:BuxSu22RbO93xBLk5Eam5nldFponoJ73xDFz4uJ3Huk=
|
||||
github.com/luxfi/math/safe v0.0.1 h1:GfSBINV9mOFgHzd32JbgfHSLhlNn0BwnP43rteYEosc=
|
||||
github.com/luxfi/math/safe v0.0.1/go.mod h1:EejrmOJHh03YAD8+Zww8cPcMR1K3Q2I7w1dX4sMloeo=
|
||||
github.com/luxfi/metric v1.5.1 h1:6tVarXMnNR3Xzud8FYUHjtXabTll3HI/OEqG0tgLAcI=
|
||||
github.com/luxfi/metric v1.5.1/go.mod h1:PkD4D4JoGuyKtfUkqPNYkrg9xKrJeNVZFdW/5XvAe/A=
|
||||
github.com/luxfi/mock v0.1.1 h1:0HEtIjg1J6CWz+IUyP6rsGqNWTcmxjFnSQIhaDuARwY=
|
||||
github.com/luxfi/mock v0.1.1/go.mod h1:jo35akl3Vtd8LbzDts8VJ0jmSVycrd1/eBi6g6t5hKU=
|
||||
github.com/luxfi/node v1.23.4 h1:NzARkjbFUtlHyMEqSFQ0VeQRKF5eGWWwfQA7PO4f9VQ=
|
||||
github.com/luxfi/node v1.23.4/go.mod h1:eSzDGb6N60yHIANLmU5l8uRLlrTzVGq9yvwgITGeWkU=
|
||||
github.com/luxfi/p2p v1.19.2 h1:uqZq7ofmEDbXlTkv1QThtci01Q+dmDkNmAPeORIyP8E=
|
||||
github.com/luxfi/p2p v1.19.2/go.mod h1:tI9Bt1R0ouvVtJvXG4e20GlGeV4AR230k4mFF9Vglzk=
|
||||
github.com/luxfi/precompile v0.4.11 h1:a9krIOpB8QoHxHKgOEVXk768Dtw0iRl26f4JMr+HrFg=
|
||||
github.com/luxfi/precompile v0.4.11/go.mod h1:Jz14VhQrU90mVgm/nTStQHdq8cLSOBHMF9UpJQjPFec=
|
||||
github.com/luxfi/protocol v0.0.2 h1:TAuXMm1K4VDpG3B3brq1EE9Lb7XlbhQmVBObskgNhmc=
|
||||
github.com/luxfi/protocol v0.0.2/go.mod h1:Yjn2VRwn5PXim0+JTalAyrVG6YbmuSnYOfeUXSbAsqA=
|
||||
github.com/luxfi/resource v0.0.1 h1:mTh+ICWSy548GTUSSyx7V/X5dV18oEwxZeQEYGJQhD4=
|
||||
github.com/luxfi/resource v0.0.1/go.mod h1:wWpZktciYwIi6RNqA+fHwzmPrUJa7PRX7urfwT+spRE=
|
||||
github.com/luxfi/corona v0.2.0 h1:DbLMZmE//2T2wXXS/gEkKZrTbre9LD+7EE/tz5SQszU=
|
||||
github.com/luxfi/corona v0.2.0/go.mod h1:SZ+aDLUdfSAtaTRaaYzeDZ5DNQiLaOCelSaIGjL21R0=
|
||||
github.com/luxfi/runtime v1.0.1 h1:cii3OsRiVSIl9jzfWFM6++62T1r6ZSGP+/3F0Ezhpqw=
|
||||
github.com/luxfi/runtime v1.0.1/go.mod h1:2hBKjzbEeE4dzrhUKH8dqkRgLEyiXz6GmuVusy3vJMs=
|
||||
github.com/luxfi/sampler v1.0.0 h1:k8Sf6otW83w4pQp0jXLA+g3J/joB7w7SqXQsWmNTOV0=
|
||||
github.com/luxfi/sampler v1.0.0/go.mod h1:f96/ozlj9vFfZj+akLtrHn4VpulQahwB+MQQhpeIekk=
|
||||
github.com/luxfi/sys v0.0.0-20260110090042-50187ec5ffd8 h1:6L5294QWwXzy9he6wAM+Dc39rV4iwyl9hex0k2pXPsg=
|
||||
github.com/luxfi/sys v0.0.0-20260110090042-50187ec5ffd8/go.mod h1:Y0UwjnEJYSbGM7IvJbKYLf8BWNVLfT8Oz00bEiDITHw=
|
||||
github.com/luxfi/threshold v1.5.5 h1:MgPMrHf7dryztiaOYaG+Z+Cqqfa79oyblp5EowDFJw4=
|
||||
github.com/luxfi/threshold v1.5.5/go.mod h1:JEnYrKvCRDwGUeuCsMJSO2FeokuZGVaOml1XD/L1Vgs=
|
||||
github.com/luxfi/timer v1.0.2 h1:g/odi0VQJIsrzdklJUG1thHZ/sGNnbIiVGcU6LctJm0=
|
||||
github.com/luxfi/timer v1.0.2/go.mod h1:SoaZwntYigUE3H6z1GV32YwP8QaSiAT0UiEv7iPugXg=
|
||||
github.com/luxfi/trace v0.1.4 h1:ttCRyXGwWuz232se+lIUqhWHBoTuvPLhHH/hLWyqtaM=
|
||||
github.com/luxfi/trace v0.1.4/go.mod h1:Az7HWh+PCuPftXjQu+ssjv51nKauaFu+q2un7bmZYBA=
|
||||
github.com/luxfi/upgrade v1.0.0 h1:mM6YXvU8VzoclA7IdtuE5bmnMuFquYxjKUUW84LJz54=
|
||||
github.com/luxfi/upgrade v1.0.0/go.mod h1:DZF7dO4erhUEKf907B2e65k4/vGkCPkUngpvIEUS3eI=
|
||||
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/validators v1.0.0 h1:zE1HJM1lfvC+v1Lalg+MUgkKBGFWnwTfOOmXraiNnpE=
|
||||
github.com/luxfi/validators v1.0.0/go.mod h1:QGppjtI/gqprbplWc10J+4OIK8UYWpv+53mfH2aKhy4=
|
||||
github.com/luxfi/version v1.0.1 h1:T/1KYWEMmsrNQk7pN7PFPAwh/7XbeX7cFAKLBqI37Sk=
|
||||
github.com/luxfi/version v1.0.1/go.mod h1:Y5fPkQ2DB0XRBCxgSPXp4ISzL1/jptKnmFknShRJCyg=
|
||||
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/zapdb/v4 v4.9.3 h1:KV1DrbZqtZsZvrWyPw5D8WHR0DxzqW2jHjqx6obxgoM=
|
||||
github.com/luxfi/zapdb/v4 v4.9.3/go.mod h1:BrpLaDeYy+smON4ASDPCFKWrQ58CXhy3WNEPGna7vuU=
|
||||
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=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
|
||||
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
|
||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw=
|
||||
github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
|
||||
github.com/montanaflynn/stats v0.8.2 h1:52wnefTJnPI5FoHif1DQh2soKRw0yYs+4AVyvtcZCH0=
|
||||
github.com/montanaflynn/stats v0.8.2/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
||||
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
|
||||
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
|
||||
github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28=
|
||||
github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||
github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 h1:+FZIDR/D97YOPik4N4lPDaUcLDF/EQPogxtlHB2ZZRM=
|
||||
github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg=
|
||||
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
|
||||
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
|
||||
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
|
||||
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
|
||||
github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8=
|
||||
github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so=
|
||||
github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0=
|
||||
github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ=
|
||||
github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
|
||||
github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
|
||||
github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q=
|
||||
github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E=
|
||||
github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
|
||||
github.com/pion/transport/v3 v3.1.1 h1:Tr684+fnnKlhPceU+ICdrw6KKkTms+5qHMgw6bIkYOM=
|
||||
github.com/pion/transport/v3 v3.1.1/go.mod h1:+c2eewC5WJQHiAA46fkMMzoYZSuGzA/7E2FPrOYHctQ=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
|
||||
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
|
||||
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
||||
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
||||
github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=
|
||||
github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw=
|
||||
github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=
|
||||
github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
|
||||
github.com/prysmaticlabs/gohashtree v0.0.4-beta h1:H/EbCuXPeTV3lpKeXGPpEV9gsUpkqOOVnWapUyeWro4=
|
||||
github.com/prysmaticlabs/gohashtree v0.0.4-beta/go.mod h1:BFdtALS+Ffhg3lGQIHv9HDWuHS8cTvHZzrHWxwOtGOs=
|
||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4=
|
||||
github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI=
|
||||
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
|
||||
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
|
||||
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
|
||||
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
|
||||
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
||||
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
|
||||
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
|
||||
github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
|
||||
github.com/status-im/keycard-go v0.3.3 h1:qk/JHSkT9sMka+lVXrTOIVSgHIY7lDm46wrUqTsNa4s=
|
||||
github.com/status-im/keycard-go v0.3.3/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE=
|
||||
github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI=
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
|
||||
github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA=
|
||||
github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI=
|
||||
github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=
|
||||
github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ=
|
||||
github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU=
|
||||
github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4=
|
||||
github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
|
||||
github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
|
||||
github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
|
||||
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
|
||||
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
|
||||
github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg=
|
||||
github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
|
||||
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
|
||||
github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
|
||||
github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
|
||||
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
|
||||
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
|
||||
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
||||
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
|
||||
go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=
|
||||
go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 h1:in9O8ESIOlwJAEGTkkf34DesGRAc/Pn8qJ7k3r/42LM=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0/go.mod h1:Rp0EXBm5tfnv0WL+ARyO/PHBEaEAT8UUHQ6AGJcSq6c=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU=
|
||||
go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=
|
||||
go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=
|
||||
go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8=
|
||||
go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg=
|
||||
go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=
|
||||
go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=
|
||||
go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=
|
||||
go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=
|
||||
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
||||
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
|
||||
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
|
||||
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
|
||||
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
|
||||
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
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/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=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
|
||||
golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
|
||||
golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
||||
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
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/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=
|
||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
|
||||
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
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/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
|
||||
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
|
||||
golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
||||
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
|
||||
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d h1:EocjzKLywydp5uZ5tJ79iP6Q0UjDnyiHkGRWxuPBP8s=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:48U2I+QQUYhsFrg2SY6r+nJzeOtjey7j//WBESw+qyQ=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d h1:t/LOSXPJ9R0B6fnZNyALBRfZBH0Uy0gT+uR+SJ6syqQ=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
|
||||
google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY=
|
||||
google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
||||
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
@@ -6,7 +6,9 @@ package params
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/big"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"github.com/luxfi/evm/params/extras"
|
||||
@@ -131,6 +133,8 @@ func SetEthUpgrades(c *ChainConfig) error {
|
||||
extra := GetExtra(c)
|
||||
// We only mark Eth upgrades as enabled if we have marked them as scheduled.
|
||||
if durango := extra.DurangoTimestamp; durango != nil && *durango < unscheduledActivation {
|
||||
fmt.Fprintf(os.Stderr, "[SET-ETH-UPGRADES] setting ShanghaiTime to durango=%d (was %v)\n",
|
||||
*durango, c.ShanghaiTime)
|
||||
c.ShanghaiTime = utils.NewUint64(*durango)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,699 +0,0 @@
|
||||
// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved.
|
||||
// See the file LICENSE for licensing terms.
|
||||
|
||||
package allowlisttest
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/luxfi/evm/core/extstate"
|
||||
"github.com/luxfi/evm/core/state"
|
||||
"github.com/luxfi/evm/precompile/allowlist"
|
||||
"github.com/luxfi/evm/precompile/modules"
|
||||
"github.com/luxfi/evm/precompile/precompileconfig"
|
||||
"github.com/luxfi/evm/precompile/precompiletest"
|
||||
"github.com/luxfi/geth/common"
|
||||
ethtypes "github.com/luxfi/geth/core/types"
|
||||
"github.com/luxfi/geth/core/vm"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/mock/gomock"
|
||||
)
|
||||
|
||||
var (
|
||||
TestAdminAddr = common.HexToAddress("0x0000000000000000000000000000000000000011")
|
||||
TestEnabledAddr = common.HexToAddress("0x0000000000000000000000000000000000000022")
|
||||
TestNoRoleAddr = common.HexToAddress("0x0000000000000000000000000000000000000033")
|
||||
TestManagerAddr = common.HexToAddress("0x0000000000000000000000000000000000000044")
|
||||
)
|
||||
|
||||
func AllowListTests(t testing.TB, module modules.Module) map[string]precompiletest.PrecompileTest {
|
||||
contractAddress := module.Address
|
||||
return map[string]precompiletest.PrecompileTest{
|
||||
"admin set admin": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.AdminRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost + allowlist.AllowListEventGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
res := allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr)
|
||||
require.Equal(t, allowlist.AdminRole, res)
|
||||
// Check logs are stored in state
|
||||
logs := state.Logs()
|
||||
assertSetRoleEvent(t, logs, allowlist.AdminRole, TestNoRoleAddr, TestAdminAddr, allowlist.NoRole)
|
||||
},
|
||||
},
|
||||
"admin set enabled": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.EnabledRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost + allowlist.AllowListEventGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
res := allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr)
|
||||
require.Equal(t, allowlist.EnabledRole, res)
|
||||
// Check logs are stored in state
|
||||
logs := state.Logs()
|
||||
assertSetRoleEvent(t, logs, allowlist.EnabledRole, TestNoRoleAddr, TestAdminAddr, allowlist.NoRole)
|
||||
},
|
||||
},
|
||||
"admin set no role": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost + allowlist.AllowListEventGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
res := allowlist.GetAllowListStatus(state, contractAddress, TestEnabledAddr)
|
||||
require.Equal(t, allowlist.NoRole, res)
|
||||
// Check logs are stored in state
|
||||
logs := state.Logs()
|
||||
assertSetRoleEvent(t, logs, allowlist.NoRole, TestEnabledAddr, TestAdminAddr, allowlist.EnabledRole)
|
||||
},
|
||||
},
|
||||
"no role set no role": {
|
||||
Caller: TestNoRoleAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"no role set enabled": {
|
||||
Caller: TestNoRoleAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.EnabledRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"no role set admin": {
|
||||
Caller: TestNoRoleAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.AdminRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"enabled set no role": {
|
||||
Caller: TestEnabledAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestAdminAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"enabled set enabled": {
|
||||
Caller: TestEnabledAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.EnabledRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"enabled set admin": {
|
||||
Caller: TestEnabledAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.AdminRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"no role set manager pre-Durango": {
|
||||
Caller: TestNoRoleAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(false).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: 0,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: "invalid non-activated function selector",
|
||||
},
|
||||
"no role set manager": {
|
||||
Caller: TestNoRoleAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(true).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"enabled role set manager pre-Durango": {
|
||||
Caller: TestEnabledAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(false).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: 0,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: "invalid non-activated function selector",
|
||||
},
|
||||
"enabled set manager": {
|
||||
Caller: TestNoRoleAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(true).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"admin set manager pre-DUpgarde": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(false).AnyTimes()
|
||||
return config
|
||||
},
|
||||
SuppliedGas: 0,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: "invalid non-activated function selector",
|
||||
},
|
||||
"admin set manager": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
ExpectedRes: []byte{},
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(true).AnyTimes()
|
||||
return config
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost + allowlist.AllowListEventGasCost,
|
||||
ReadOnly: false,
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
res := allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr)
|
||||
require.Equal(t, allowlist.ManagerRole, res)
|
||||
// Check logs are stored in state
|
||||
logs := state.Logs()
|
||||
assertSetRoleEvent(t, logs, allowlist.ManagerRole, TestNoRoleAddr, TestAdminAddr, allowlist.NoRole)
|
||||
},
|
||||
},
|
||||
"manager set no role to no role": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost + allowlist.AllowListEventGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
ExpectedErr: "",
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
res := allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr)
|
||||
require.Equal(t, allowlist.NoRole, res)
|
||||
// Check logs are stored in state
|
||||
logs := state.Logs()
|
||||
assertSetRoleEvent(t, logs, allowlist.NoRole, TestNoRoleAddr, TestManagerAddr, allowlist.NoRole)
|
||||
},
|
||||
},
|
||||
"manager set no role to enabled": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.EnabledRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost + allowlist.AllowListEventGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
ExpectedErr: "",
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
res := allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr)
|
||||
require.Equal(t, allowlist.EnabledRole, res)
|
||||
|
||||
// Check logs are stored in state
|
||||
logs := state.Logs()
|
||||
assertSetRoleEvent(t, logs, allowlist.EnabledRole, TestNoRoleAddr, TestManagerAddr, allowlist.NoRole)
|
||||
},
|
||||
},
|
||||
"manager set no role to manager": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(true).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"manager set no role to admin": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.AdminRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"manager set enabled to admin": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.AdminRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"manager set enabled role to manager": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(true).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"manager set enabled role to no role": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost + allowlist.AllowListEventGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
res := allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr)
|
||||
require.Equal(t, allowlist.NoRole, res)
|
||||
|
||||
// Check logs are stored in state
|
||||
logs := state.Logs()
|
||||
assertSetRoleEvent(t, logs, allowlist.NoRole, TestEnabledAddr, TestManagerAddr, allowlist.EnabledRole)
|
||||
},
|
||||
},
|
||||
"manager set admin to no role": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestAdminAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"manager set admin role to enabled": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestAdminAddr, allowlist.EnabledRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"manager set admin to manager": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(true).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestAdminAddr, allowlist.ManagerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"manager set manager to no role": {
|
||||
Caller: TestManagerAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestManagerAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: allowlist.ErrCannotModifyAllowList.Error(),
|
||||
},
|
||||
"admin set no role with readOnly enabled": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: true,
|
||||
ExpectedErr: vm.ErrWriteProtection.Error(),
|
||||
},
|
||||
"admin set no role insufficient gas": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost - 1,
|
||||
ReadOnly: false,
|
||||
ExpectedErr: vm.ErrOutOfGas.Error(),
|
||||
},
|
||||
"no role read allow list": {
|
||||
Caller: TestNoRoleAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackReadAllowList(TestNoRoleAddr)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ReadAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: common.Hash(allowlist.NoRole).Bytes(),
|
||||
},
|
||||
"admin role read allow list": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackReadAllowList(TestAdminAddr)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
}, SuppliedGas: allowlist.ReadAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: common.Hash(allowlist.AdminRole).Bytes(),
|
||||
},
|
||||
"admin read allow list with readOnly enabled": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackReadAllowList(TestNoRoleAddr)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
}, SuppliedGas: allowlist.ReadAllowListGasCost,
|
||||
ReadOnly: true,
|
||||
ExpectedRes: common.Hash(allowlist.NoRole).Bytes(),
|
||||
},
|
||||
"radmin read allow list out of gas": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackReadAllowList(TestNoRoleAddr)
|
||||
require.NoError(t, err)
|
||||
|
||||
return input
|
||||
}, SuppliedGas: allowlist.ReadAllowListGasCost - 1,
|
||||
ReadOnly: true,
|
||||
ExpectedErr: vm.ErrOutOfGas.Error(),
|
||||
},
|
||||
"initial config sets admins": {
|
||||
Config: mkConfigWithAllowList(
|
||||
module,
|
||||
&allowlist.AllowListConfig{
|
||||
AdminAddresses: []common.Address{TestNoRoleAddr, TestEnabledAddr},
|
||||
},
|
||||
),
|
||||
SuppliedGas: 0,
|
||||
ReadOnly: false,
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
require.Equal(t, allowlist.AdminRole, allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr))
|
||||
require.Equal(t, allowlist.AdminRole, allowlist.GetAllowListStatus(state, contractAddress, TestEnabledAddr))
|
||||
},
|
||||
},
|
||||
"initial config sets managers": {
|
||||
Config: mkConfigWithAllowList(
|
||||
module,
|
||||
&allowlist.AllowListConfig{
|
||||
ManagerAddresses: []common.Address{TestNoRoleAddr, TestEnabledAddr},
|
||||
},
|
||||
),
|
||||
SuppliedGas: 0,
|
||||
ReadOnly: false,
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
require.Equal(t, allowlist.ManagerRole, allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr))
|
||||
require.Equal(t, allowlist.ManagerRole, allowlist.GetAllowListStatus(state, contractAddress, TestEnabledAddr))
|
||||
},
|
||||
},
|
||||
"initial config sets enabled": {
|
||||
Config: mkConfigWithAllowList(
|
||||
module,
|
||||
&allowlist.AllowListConfig{
|
||||
EnabledAddresses: []common.Address{TestNoRoleAddr, TestAdminAddr},
|
||||
},
|
||||
),
|
||||
SuppliedGas: 0,
|
||||
ReadOnly: false,
|
||||
AfterHook: func(t testing.TB, state *state.StateDB) {
|
||||
require.Equal(t, allowlist.EnabledRole, allowlist.GetAllowListStatus(state, contractAddress, TestAdminAddr))
|
||||
require.Equal(t, allowlist.EnabledRole, allowlist.GetAllowListStatus(state, contractAddress, TestNoRoleAddr))
|
||||
},
|
||||
},
|
||||
"admin set admin pre-Durango": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(false).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.AdminRole)
|
||||
require.NoError(t, err)
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
AfterHook: func(t testing.TB, stateDB *state.StateDB) {
|
||||
// Check no logs are stored in state
|
||||
logs := stateDB.Logs()
|
||||
require.Empty(t, logs)
|
||||
},
|
||||
},
|
||||
"admin set enabled pre-Durango": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(false).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestNoRoleAddr, allowlist.EnabledRole)
|
||||
require.NoError(t, err)
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
AfterHook: func(t testing.TB, stateDB *state.StateDB) {
|
||||
// Check no logs are stored in state
|
||||
logs := stateDB.Logs()
|
||||
require.Empty(t, logs)
|
||||
},
|
||||
},
|
||||
"admin set no role pre-Durango": {
|
||||
Caller: TestAdminAddr,
|
||||
BeforeHook: SetDefaultRoles(contractAddress),
|
||||
ChainConfigFn: func(ctrl *gomock.Controller) precompileconfig.ChainConfig {
|
||||
config := precompileconfig.NewMockChainConfig(ctrl)
|
||||
config.EXPECT().IsDurango(gomock.Any()).Return(false).AnyTimes()
|
||||
return config
|
||||
},
|
||||
InputFn: func(t testing.TB) []byte {
|
||||
input, err := allowlist.PackModifyAllowList(TestEnabledAddr, allowlist.NoRole)
|
||||
require.NoError(t, err)
|
||||
return input
|
||||
},
|
||||
SuppliedGas: allowlist.ModifyAllowListGasCost,
|
||||
ReadOnly: false,
|
||||
ExpectedRes: []byte{},
|
||||
AfterHook: func(t testing.TB, stateDB *state.StateDB) {
|
||||
// Check no logs are stored in state
|
||||
logs := stateDB.Logs()
|
||||
require.Empty(t, logs)
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SetDefaultRoles returns a BeforeHook that sets roles TestAdminAddr and TestEnabledAddr
|
||||
// to have the AdminRole and EnabledRole respectively.
|
||||
func SetDefaultRoles(contractAddress common.Address) func(t testing.TB, stateDB *state.StateDB) {
|
||||
return func(t testing.TB, stateDB *state.StateDB) {
|
||||
// Create an ExtState wrapper and then get the adapter
|
||||
extState := extstate.New(stateDB)
|
||||
adapter := extstate.NewPrecompileAdapter(extState)
|
||||
allowlist.SetAllowListRole(adapter, contractAddress, TestAdminAddr, allowlist.AdminRole)
|
||||
allowlist.SetAllowListRole(adapter, contractAddress, TestManagerAddr, allowlist.ManagerRole)
|
||||
allowlist.SetAllowListRole(adapter, contractAddress, TestEnabledAddr, allowlist.EnabledRole)
|
||||
require.Equal(t, allowlist.AdminRole, allowlist.GetAllowListStatus(adapter, contractAddress, TestAdminAddr))
|
||||
require.Equal(t, allowlist.ManagerRole, allowlist.GetAllowListStatus(adapter, contractAddress, TestManagerAddr))
|
||||
require.Equal(t, allowlist.EnabledRole, allowlist.GetAllowListStatus(adapter, contractAddress, TestEnabledAddr))
|
||||
require.Equal(t, allowlist.NoRole, allowlist.GetAllowListStatus(adapter, contractAddress, TestNoRoleAddr))
|
||||
}
|
||||
}
|
||||
|
||||
func RunPrecompileWithAllowListTests(t *testing.T, module modules.Module, contractTests map[string]precompiletest.PrecompileTest) {
|
||||
t.Helper()
|
||||
tests := AllowListTests(t, module)
|
||||
// Add the contract specific tests to the map of tests to run.
|
||||
for name, test := range contractTests {
|
||||
if _, exists := tests[name]; exists {
|
||||
t.Fatalf("duplicate test name: %s", name)
|
||||
}
|
||||
tests[name] = test
|
||||
}
|
||||
|
||||
precompiletest.RunPrecompileTests(t, module, tests)
|
||||
}
|
||||
|
||||
func assertSetRoleEvent(t testing.TB, logs []*ethtypes.Log, role allowlist.Role, addr common.Address, caller common.Address, oldRole allowlist.Role) {
|
||||
require.Len(t, logs, 1)
|
||||
log := logs[0]
|
||||
require.Equal(
|
||||
t,
|
||||
[]common.Hash{
|
||||
allowlist.AllowListABI.Events["RoleSet"].ID,
|
||||
role.Hash(),
|
||||
common.BytesToHash(addr[:]),
|
||||
common.BytesToHash(caller[:]),
|
||||
},
|
||||
log.Topics,
|
||||
)
|
||||
require.Equal(t, oldRole.Bytes(), log.Data)
|
||||
}
|
||||
@@ -19,8 +19,10 @@ var _ contract.Configurator = (*configurator)(nil)
|
||||
// must be unique across all precompiles.
|
||||
const ConfigKey = "warpConfig"
|
||||
|
||||
// LP-aligned address: P=6 (LP-6xxx Bridges), C=2 (C-Chain), II=01 (Warp)
|
||||
var ContractAddress = common.HexToAddress("0x16201")
|
||||
// Canonical Lux Warp Messaging precompile address (legacy coreth-compatible).
|
||||
// Must match the address used by historical mainnet genesis (chain ID 96369);
|
||||
// changing this breaks genesis-hash compatibility for the canonical chain.
|
||||
var ContractAddress = common.HexToAddress("0x0200000000000000000000000000000000000005")
|
||||
|
||||
// Module is the precompile module. It is used to register the precompile contract.
|
||||
var Module = modules.Module{
|
||||
|
||||
@@ -1,745 +0,0 @@
|
||||
// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved.
|
||||
// See the file LICENSE for licensing terms.
|
||||
|
||||
package warp
|
||||
|
||||
import (
|
||||
"context"
|
||||
"math"
|
||||
"testing"
|
||||
|
||||
"github.com/luxfi/ids"
|
||||
"github.com/luxfi/node/consensus/validators"
|
||||
"github.com/luxfi/node/consensus/validators/validatorstest"
|
||||
"github.com/luxfi/utils/constants"
|
||||
"github.com/luxfi/crypto/bls"
|
||||
"github.com/luxfi/utils/set"
|
||||
luxWarp "github.com/luxfi/vm/vms/platformvm/warp"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type signatureTest struct {
|
||||
name string
|
||||
stateF func(*testing.T) validators.State
|
||||
quorumNum uint64
|
||||
quorumDen uint64
|
||||
msgF func(*require.Assertions) *luxWarp.Message
|
||||
verifyErr error
|
||||
canonicalErr error
|
||||
}
|
||||
|
||||
// This test copies the test coverage from https://github.com/luxfi/node/blob/0117ab96/vms/platformvm/warp/signature_test.go#L137.
|
||||
// These tests are only expected to fail if there is a breaking change in Luxd that unexpectedly changes behavior.
|
||||
func TestSignatureVerification(t *testing.T) {
|
||||
tests := []signatureTest{
|
||||
{
|
||||
name: "can't get subnetID",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{
|
||||
T: t,
|
||||
GetSubnetIDF: func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, errTest
|
||||
},
|
||||
}
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 2,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
canonicalErr: errTest,
|
||||
},
|
||||
{
|
||||
name: "can't get validator set",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{
|
||||
T: t,
|
||||
GetSubnetIDF: func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
},
|
||||
GetValidatorSetF: func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return nil, errTest
|
||||
},
|
||||
}
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 2,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
canonicalErr: errTest,
|
||||
},
|
||||
{
|
||||
name: "weight overflow",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{
|
||||
T: t,
|
||||
GetSubnetIDF: func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
},
|
||||
GetValidatorSetF: func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return map[ids.NodeID]*validators.GetValidatorOutput{
|
||||
testVdrs[0].nodeID: {
|
||||
NodeID: testVdrs[0].nodeID,
|
||||
PublicKey: testVdrs[0].vdr.PublicKey,
|
||||
Weight: math.MaxUint64,
|
||||
},
|
||||
testVdrs[1].nodeID: {
|
||||
NodeID: testVdrs[1].nodeID,
|
||||
PublicKey: testVdrs[1].vdr.PublicKey,
|
||||
Weight: math.MaxUint64,
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
}
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 2,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: make([]byte, 8),
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
canonicalErr: luxWarp.ErrWeightOverflow,
|
||||
},
|
||||
{
|
||||
name: "invalid bit set index",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 2,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: make([]byte, 1),
|
||||
Signature: [bls.SignatureLen]byte{},
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: luxWarp.ErrInvalidBitSet,
|
||||
},
|
||||
{
|
||||
name: "unknown index",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 2,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
signers := set.NewBits()
|
||||
signers.Add(3) // vdr oob
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: [bls.SignatureLen]byte{},
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: luxWarp.ErrUnknownValidator,
|
||||
},
|
||||
{
|
||||
name: "insufficient weight",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 1,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
// [signers] has weight from [vdr[0], vdr[1]],
|
||||
// which is 6, which is less than 9
|
||||
signers := set.NewBits()
|
||||
signers.Add(0)
|
||||
signers.Add(1)
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
vdr0Sig, err := testVdrs[0].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
vdr1Sig, err := testVdrs[1].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
aggSig, err := bls.AggregateSignatures([]*bls.Signature{vdr0Sig, vdr1Sig})
|
||||
require.NoError(err)
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(aggSig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: luxWarp.ErrInsufficientWeight,
|
||||
},
|
||||
{
|
||||
name: "can't parse sig",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 2,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
signers := set.NewBits()
|
||||
signers.Add(0)
|
||||
signers.Add(1)
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: [bls.SignatureLen]byte{},
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: luxWarp.ErrParseSignature,
|
||||
},
|
||||
{
|
||||
name: "no validators",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return nil, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 2,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
vdr0Sig, err := testVdrs[0].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(vdr0Sig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: nil,
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: bls.ErrNoPublicKeys,
|
||||
},
|
||||
{
|
||||
name: "invalid signature (substitute)",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 3,
|
||||
quorumDen: 5,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
signers := set.NewBits()
|
||||
signers.Add(0)
|
||||
signers.Add(1)
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
vdr0Sig, err := testVdrs[0].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
// Give sig from vdr[2] even though the bit vector says it
|
||||
// should be from vdr[1]
|
||||
vdr2Sig, err := testVdrs[2].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
aggSig, err := bls.AggregateSignatures([]*bls.Signature{vdr0Sig, vdr2Sig})
|
||||
require.NoError(err)
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(aggSig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: luxWarp.ErrInvalidSignature,
|
||||
},
|
||||
{
|
||||
name: "invalid signature (missing one)",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 3,
|
||||
quorumDen: 5,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
signers := set.NewBits()
|
||||
signers.Add(0)
|
||||
signers.Add(1)
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
vdr0Sig, err := testVdrs[0].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
// Don't give the sig from vdr[1]
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(vdr0Sig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: luxWarp.ErrInvalidSignature,
|
||||
},
|
||||
{
|
||||
name: "invalid signature (extra one)",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 3,
|
||||
quorumDen: 5,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
signers := set.NewBits()
|
||||
signers.Add(0)
|
||||
signers.Add(1)
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
vdr0Sig, err := testVdrs[0].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
vdr1Sig, err := testVdrs[1].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
// Give sig from vdr[2] even though the bit vector doesn't have
|
||||
// it
|
||||
vdr2Sig, err := testVdrs[2].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
aggSig, err := bls.AggregateSignatures([]*bls.Signature{vdr0Sig, vdr1Sig, vdr2Sig})
|
||||
require.NoError(err)
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(aggSig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: luxWarp.ErrInvalidSignature,
|
||||
},
|
||||
{
|
||||
name: "valid signature",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 2,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
// [signers] has weight from [vdr[1], vdr[2]],
|
||||
// which is 6, which is greater than 4.5
|
||||
signers := set.NewBits()
|
||||
signers.Add(1)
|
||||
signers.Add(2)
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
vdr1Sig, err := testVdrs[1].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
vdr2Sig, err := testVdrs[2].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
aggSig, err := bls.AggregateSignatures([]*bls.Signature{vdr1Sig, vdr2Sig})
|
||||
require.NoError(err)
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(aggSig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: nil,
|
||||
},
|
||||
{
|
||||
name: "valid signature (boundary)",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return vdrs, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 2,
|
||||
quorumDen: 3,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
// [signers] has weight from [vdr[1], vdr[2]],
|
||||
// which is 6, which meets the minimum 6
|
||||
signers := set.NewBits()
|
||||
signers.Add(1)
|
||||
signers.Add(2)
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
vdr1Sig, err := testVdrs[1].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
vdr2Sig, err := testVdrs[2].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
aggSig, err := bls.AggregateSignatures([]*bls.Signature{vdr1Sig, vdr2Sig})
|
||||
require.NoError(err)
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(aggSig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: nil,
|
||||
},
|
||||
{
|
||||
name: "valid signature (missing key)",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return map[ids.NodeID]*validators.GetValidatorOutput{
|
||||
testVdrs[0].nodeID: {
|
||||
NodeID: testVdrs[0].nodeID,
|
||||
PublicKey: nil,
|
||||
Weight: testVdrs[0].vdr.Weight,
|
||||
},
|
||||
testVdrs[1].nodeID: {
|
||||
NodeID: testVdrs[1].nodeID,
|
||||
PublicKey: testVdrs[1].vdr.PublicKey,
|
||||
Weight: testVdrs[1].vdr.Weight,
|
||||
},
|
||||
testVdrs[2].nodeID: {
|
||||
NodeID: testVdrs[2].nodeID,
|
||||
PublicKey: testVdrs[2].vdr.PublicKey,
|
||||
Weight: testVdrs[2].vdr.Weight,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 1,
|
||||
quorumDen: 3,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
// [signers] has weight from [vdr2, vdr3],
|
||||
// which is 6, which is greater than 3
|
||||
signers := set.NewBits()
|
||||
// Note: the bits are shifted because vdr[0]'s key was zeroed
|
||||
signers.Add(0) // vdr[1]
|
||||
signers.Add(1) // vdr[2]
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
vdr1Sig, err := testVdrs[1].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
vdr2Sig, err := testVdrs[2].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
aggSig, err := bls.AggregateSignatures([]*bls.Signature{vdr1Sig, vdr2Sig})
|
||||
require.NoError(err)
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(aggSig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: nil,
|
||||
},
|
||||
{
|
||||
name: "valid signature (duplicate key)",
|
||||
stateF: func(t *testing.T) validators.State {
|
||||
return &validatorstest.State{\n\t\t\t\t\tT: t,
|
||||
state.GetSubnetIDF = func(ctx context.Context, chainID ids.ID) (ids.ID, error) {
|
||||
return sourceSubnetID, nil
|
||||
}
|
||||
state.GetValidatorSetF = func(ctx context.Context, height uint64, subnetID ids.ID) (map[ids.NodeID]*validators.GetValidatorOutput, error) {
|
||||
return map[ids.NodeID]*validators.GetValidatorOutput{
|
||||
testVdrs[0].nodeID: {
|
||||
NodeID: testVdrs[0].nodeID,
|
||||
PublicKey: nil,
|
||||
Weight: testVdrs[0].vdr.Weight,
|
||||
},
|
||||
testVdrs[1].nodeID: {
|
||||
NodeID: testVdrs[1].nodeID,
|
||||
PublicKey: testVdrs[2].vdr.PublicKey,
|
||||
Weight: testVdrs[1].vdr.Weight,
|
||||
},
|
||||
testVdrs[2].nodeID: {
|
||||
NodeID: testVdrs[2].nodeID,
|
||||
PublicKey: testVdrs[2].vdr.PublicKey,
|
||||
Weight: testVdrs[2].vdr.Weight,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
return state
|
||||
},
|
||||
quorumNum: 2,
|
||||
quorumDen: 3,
|
||||
msgF: func(require *require.Assertions) *luxWarp.Message {
|
||||
unsignedMsg, err := luxWarp.NewUnsignedMessage(
|
||||
constants.UnitTestID,
|
||||
sourceChainID,
|
||||
addressedPayloadBytes,
|
||||
)
|
||||
require.NoError(err)
|
||||
|
||||
// [signers] has weight from [vdr2, vdr3],
|
||||
// which is 6, which meets the minimum 6
|
||||
signers := set.NewBits()
|
||||
// Note: the bits are shifted because vdr[0]'s key was zeroed
|
||||
// Note: vdr[1] and vdr[2] were combined because of a shared pk
|
||||
signers.Add(0) // vdr[1] + vdr[2]
|
||||
|
||||
unsignedBytes := unsignedMsg.Bytes()
|
||||
// Because vdr[1] and vdr[2] share a key, only one of them sign.
|
||||
vdr2Sig, err := testVdrs[2].sk.Sign(unsignedBytes)
|
||||
require.NoError(err)
|
||||
aggSigBytes := [bls.SignatureLen]byte{}
|
||||
copy(aggSigBytes[:], bls.SignatureToBytes(vdr2Sig))
|
||||
|
||||
msg, err := luxWarp.NewMessage(
|
||||
unsignedMsg,
|
||||
&luxWarp.BitSetSignature{
|
||||
Signers: signers.Bytes(),
|
||||
Signature: aggSigBytes,
|
||||
},
|
||||
)
|
||||
require.NoError(err)
|
||||
return msg
|
||||
},
|
||||
verifyErr: nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
msg := tt.msgF(require)
|
||||
pChainState := tt.stateF(t)
|
||||
|
||||
// The new Verify API directly takes the validators.State
|
||||
err := msg.Signature.Verify(
|
||||
context.Background(),
|
||||
&msg.UnsignedMessage,
|
||||
constants.UnitTestID,
|
||||
pChainState,
|
||||
pChainHeight,
|
||||
tt.quorumNum,
|
||||
tt.quorumDen,
|
||||
)
|
||||
// Check for both canonical and verify errors since the new API combines them
|
||||
if tt.canonicalErr != nil {
|
||||
require.ErrorIs(err, tt.canonicalErr)
|
||||
} else {
|
||||
require.ErrorIs(err, tt.verifyErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -42,6 +42,13 @@ var (
|
||||
Start: common.HexToAddress("0x0000000000000000000000000000000000010000"),
|
||||
End: common.HexToAddress("0x000000000000000000000000000000000001ffff"),
|
||||
},
|
||||
// Legacy coreth-compatible precompile range: 0x0200000000000000000000000000000000000000 - 0x02000000000000000000000000000000000000ff
|
||||
// Required for canonical mainnet (chain ID 96369) genesis hash compatibility:
|
||||
// historical warp precompile lives at 0x0200000000000000000000000000000000000005.
|
||||
{
|
||||
Start: common.HexToAddress("0x0200000000000000000000000000000000000000"),
|
||||
End: common.HexToAddress("0x02000000000000000000000000000000000000ff"),
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user