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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ linters:
- -ST1012 # error var factoryError should have name of the form errFoo" were hidden
- -ST1016 # methods on the same type should have the same receiver name (seen 45x "db", 4x "s") (staticcheck)
- -ST1017 # don't use Yoda conditions" were hidden
- -ST1019 # other import of \"github.com/onflow/flow-go/model/bootstrap\"" were hidden
- -ST1023 # should omit type flow.IdentifierList from declaration; it will be inferred from the right-hand side" were hidden
custom:
structwrite:
Expand Down
21 changes: 10 additions & 11 deletions cmd/bootstrap/cmd/finalize.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
hotstuff "github.com/onflow/flow-go/consensus/hotstuff/model"
"github.com/onflow/flow-go/fvm"
"github.com/onflow/flow-go/model/bootstrap"
model "github.com/onflow/flow-go/model/bootstrap"
"github.com/onflow/flow-go/model/dkg"
"github.com/onflow/flow-go/model/flow"
"github.com/onflow/flow-go/module/epochs"
Expand Down Expand Up @@ -148,8 +147,8 @@ func finalize(cmd *cobra.Command, args []string) {
rootQC := constructRootQC(
block,
votes,
model.FilterByRole(stakingNodes, flow.RoleConsensus),
model.FilterByRole(internalNodes, flow.RoleConsensus),
bootstrap.FilterByRole(stakingNodes, flow.RoleConsensus),
bootstrap.FilterByRole(internalNodes, flow.RoleConsensus),
dkgData,
)
log.Info().Msg("")
Expand Down Expand Up @@ -200,15 +199,15 @@ func finalize(cmd *cobra.Command, args []string) {
}

// write snapshot to disk
err = common.WriteJSON(model.PathRootProtocolStateSnapshot, flagOutdir, snapshot.Encodable())
err = common.WriteJSON(bootstrap.PathRootProtocolStateSnapshot, flagOutdir, snapshot.Encodable())
if err != nil {
log.Fatal().Err(err).Msg("failed to write json")
}
log.Info().Msgf("wrote file %s/%s", flagOutdir, model.PathRootProtocolStateSnapshot)
log.Info().Msgf("wrote file %s/%s", flagOutdir, bootstrap.PathRootProtocolStateSnapshot)
log.Info().Msg("")

// read snapshot and verify consistency
rootSnapshot, err := loadRootProtocolSnapshot(model.PathRootProtocolStateSnapshot)
rootSnapshot, err := loadRootProtocolSnapshot(bootstrap.PathRootProtocolStateSnapshot)
if err != nil {
log.Fatal().Err(err).Msg("unable to load serialized root protocol")
}
Expand Down Expand Up @@ -249,7 +248,7 @@ func finalize(cmd *cobra.Command, args []string) {
log.Info().Str("private_dir", flagInternalNodePrivInfoDir).Str("output_dir", flagOutdir).Msg("attempting to copy private key files")
if flagInternalNodePrivInfoDir != flagOutdir {
log.Info().Msg("copying internal private keys to output folder")
err := io.CopyDirectory(flagInternalNodePrivInfoDir, filepath.Join(flagOutdir, model.DirPrivateRoot))
err := io.CopyDirectory(flagInternalNodePrivInfoDir, filepath.Join(flagOutdir, bootstrap.DirPrivateRoot))
if err != nil {
log.Error().Err(err).Msg("could not copy private key files")
}
Expand Down Expand Up @@ -278,7 +277,7 @@ func readRootBlockVotes() []*hotstuff.Vote {
}
for _, f := range files {
// skip files that do not include node-infos
if !strings.Contains(f, model.FilenameRootBlockVotePrefix) {
if !strings.Contains(f, bootstrap.FilenameRootBlockVotePrefix) {
continue
}

Expand All @@ -300,7 +299,7 @@ func readRootBlockVotes() []*hotstuff.Vote {
//
// IMPORTANT: node infos are returned in the canonical ordering, meaning this
// is safe to use as the input to the DKG and protocol state.
func mergeNodeInfos(internalNodes, partnerNodes []model.NodeInfo) ([]model.NodeInfo, error) {
func mergeNodeInfos(internalNodes, partnerNodes []bootstrap.NodeInfo) ([]bootstrap.NodeInfo, error) {
nodes := append(internalNodes, partnerNodes...)

// test for duplicate Addresses
Expand All @@ -322,7 +321,7 @@ func mergeNodeInfos(internalNodes, partnerNodes []model.NodeInfo) ([]model.NodeI
}

// sort nodes using the canonical ordering
nodes = model.Sort(nodes, flow.Canonical[flow.Identity])
nodes = bootstrap.Sort(nodes, flow.Canonical[flow.Identity])

return nodes, nil
}
Expand Down Expand Up @@ -410,7 +409,7 @@ func generateEmptyExecutionState(
}

commit, err = run.GenerateExecutionState(
filepath.Join(flagOutdir, model.DirnameExecutionState),
filepath.Join(flagOutdir, bootstrap.DirnameExecutionState),
serviceAccountPublicKey,
rootBlock.ChainID.Chain(),
fvm.WithRootBlock(rootBlock),
Expand Down
9 changes: 4 additions & 5 deletions cmd/bootstrap/cmd/machine_account_key_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (

"github.com/onflow/flow-go/cmd/util/cmd/common"
"github.com/onflow/flow-go/model/bootstrap"
model "github.com/onflow/flow-go/model/bootstrap"
ioutils "github.com/onflow/flow-go/utils/io"
"github.com/onflow/flow-go/utils/unittest"
)
Expand Down Expand Up @@ -45,11 +44,11 @@ func TestMachineAccountKeyFileExists(t *testing.T) {
nodeID := strings.TrimSpace(string(b))

// make sure file exists
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(model.PathNodeMachineAccountPrivateKey, nodeID))
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(bootstrap.PathNodeMachineAccountPrivateKey, nodeID))
require.FileExists(t, machineKeyFilePath)

// read file priv key file before command
var machineAccountPrivBefore model.NodeMachineAccountKey
var machineAccountPrivBefore bootstrap.NodeMachineAccountKey
require.NoError(t, common.ReadJSON(machineKeyFilePath, &machineAccountPrivBefore))

// run command with flags
Expand All @@ -59,7 +58,7 @@ func TestMachineAccountKeyFileExists(t *testing.T) {
require.Regexp(t, keyFileExistsRegex, hook.logs.String())

// read machine account key file again
var machineAccountPrivAfter model.NodeMachineAccountKey
var machineAccountPrivAfter bootstrap.NodeMachineAccountKey
require.NoError(t, common.ReadJSON(machineKeyFilePath, &machineAccountPrivAfter))

// check if key was modified
Expand Down Expand Up @@ -99,7 +98,7 @@ func TestMachineAccountKeyFileCreated(t *testing.T) {
nodeID := strings.TrimSpace(string(b))

// delete machine account key file
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(model.PathNodeMachineAccountPrivateKey, nodeID))
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(bootstrap.PathNodeMachineAccountPrivateKey, nodeID))
err = os.Remove(machineKeyFilePath)
require.NoError(t, err)

Expand Down
17 changes: 8 additions & 9 deletions cmd/bootstrap/cmd/machine_account_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (

"github.com/onflow/flow-go/cmd/util/cmd/common"
"github.com/onflow/flow-go/model/bootstrap"
model "github.com/onflow/flow-go/model/bootstrap"
"github.com/onflow/flow-go/model/flow"
ioutils "github.com/onflow/flow-go/utils/io"
"github.com/onflow/flow-go/utils/unittest"
Expand Down Expand Up @@ -55,11 +54,11 @@ func TestMachineAccountHappyPath(t *testing.T) {
nodeID := strings.TrimSpace(string(b))

// make sure key file exists (sanity check)
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(model.PathNodeMachineAccountPrivateKey, nodeID))
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(bootstrap.PathNodeMachineAccountPrivateKey, nodeID))
require.FileExists(t, machineKeyFilePath)

// sanity check if machine account info file exists
machineInfoFilePath := filepath.Join(flagOutdir, fmt.Sprintf(model.PathNodeMachineAccountInfoPriv, nodeID))
machineInfoFilePath := filepath.Join(flagOutdir, fmt.Sprintf(bootstrap.PathNodeMachineAccountInfoPriv, nodeID))
require.NoFileExists(t, machineInfoFilePath)

// make sure regex matches and file was created
Expand Down Expand Up @@ -102,11 +101,11 @@ func TestMachineAccountInfoFileExists(t *testing.T) {
nodeID := strings.TrimSpace(string(b))

// make sure key file exists (sanity check)
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(model.PathNodeMachineAccountPrivateKey, nodeID))
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(bootstrap.PathNodeMachineAccountPrivateKey, nodeID))
require.FileExists(t, machineKeyFilePath)

// sanity check if machine account info file exists
machineInfoFilePath := filepath.Join(flagOutdir, fmt.Sprintf(model.PathNodeMachineAccountInfoPriv, nodeID))
machineInfoFilePath := filepath.Join(flagOutdir, fmt.Sprintf(bootstrap.PathNodeMachineAccountInfoPriv, nodeID))
require.NoFileExists(t, machineInfoFilePath)

// run machine account to create info file
Expand All @@ -115,14 +114,14 @@ func TestMachineAccountInfoFileExists(t *testing.T) {
hook.logs.Reset()

// read in info file
var machineAccountInfoBefore model.NodeMachineAccountInfo
var machineAccountInfoBefore bootstrap.NodeMachineAccountInfo
require.NoError(t, common.ReadJSON(machineInfoFilePath, &machineAccountInfoBefore))

// run again and make sure info file was not changed
machineAccountRun(nil, nil)
require.Regexp(t, regex, hook.logs.String())

var machineAccountInfoAfter model.NodeMachineAccountInfo
var machineAccountInfoAfter bootstrap.NodeMachineAccountInfo
require.NoError(t, common.ReadJSON(machineInfoFilePath, &machineAccountInfoAfter))

assert.Equal(t, machineAccountInfoBefore, machineAccountInfoAfter)
Expand Down Expand Up @@ -160,11 +159,11 @@ func TestMachineAccountWrongFlowAddressFormat(t *testing.T) {
nodeID := strings.TrimSpace(string(b))

// make sure key file exists (sanity check)
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(model.PathNodeMachineAccountPrivateKey, nodeID))
machineKeyFilePath := filepath.Join(flagOutdir, fmt.Sprintf(bootstrap.PathNodeMachineAccountPrivateKey, nodeID))
require.FileExists(t, machineKeyFilePath)

// sanity check if machine account info file exists
machineInfoFilePath := filepath.Join(flagOutdir, fmt.Sprintf(model.PathNodeMachineAccountInfoPriv, nodeID))
machineInfoFilePath := filepath.Join(flagOutdir, fmt.Sprintf(bootstrap.PathNodeMachineAccountInfoPriv, nodeID))
require.NoFileExists(t, machineInfoFilePath)

// run machine account command
Expand Down
9 changes: 4 additions & 5 deletions cmd/bootstrap/run/epochs.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
hotstuff "github.com/onflow/flow-go/consensus/hotstuff/model"
"github.com/onflow/flow-go/fvm/systemcontracts"
"github.com/onflow/flow-go/model/bootstrap"
model "github.com/onflow/flow-go/model/bootstrap"
"github.com/onflow/flow-go/model/cluster"
"github.com/onflow/flow-go/model/flow"
"github.com/onflow/flow-go/model/flow/filter"
Expand Down Expand Up @@ -163,7 +162,7 @@ func GenerateRecoverTxArgsWithDKG(
// Filter internalNodes so it only contains nodes which are valid for inclusion in the epoch
// This is a safety measure: just in case subsequent functions don't properly account for additional nodes,
// we proactively remove them from consideration here.
internalNodes = slices.DeleteFunc(slices.Clone(internalNodes), func(info model.NodeInfo) bool {
internalNodes = slices.DeleteFunc(slices.Clone(internalNodes), func(info bootstrap.NodeInfo) bool {
_, isCurrentEligibleEpochParticipant := internalNodesMap[info.NodeID]
return !isCurrentEligibleEpochParticipant
})
Expand Down Expand Up @@ -364,11 +363,11 @@ func ConstructClusterRootQCsFromVotes(log zerolog.Logger, clusterList flow.Clust
// Filters a list of nodes to include only nodes that will sign the QC for the
// given cluster. The resulting list of nodes is only nodes that are in the
// given cluster AND are not partner nodes (ie. we have the private keys).
func filterClusterSigners(cluster flow.IdentitySkeletonList, nodeInfos []model.NodeInfo) []model.NodeInfo {
var filtered []model.NodeInfo
func filterClusterSigners(cluster flow.IdentitySkeletonList, nodeInfos []bootstrap.NodeInfo) []bootstrap.NodeInfo {
var filtered []bootstrap.NodeInfo
for _, node := range nodeInfos {
_, isInCluster := cluster.ByNodeID(node.NodeID)
isPrivateKeyAvailable := node.Type() == model.NodeInfoTypePrivate
isPrivateKeyAvailable := node.Type() == bootstrap.NodeInfoTypePrivate

if isInCluster && isPrivateKeyAvailable {
filtered = append(filtered, node)
Expand Down
3 changes: 1 addition & 2 deletions cmd/bootstrap/run/execution_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"github.com/onflow/flow-go/engine/execution/state/bootstrap"
"github.com/onflow/flow-go/fvm"
"github.com/onflow/flow-go/ledger/common/pathfinder"
"github.com/onflow/flow-go/ledger/complete"
ledger "github.com/onflow/flow-go/ledger/complete"
"github.com/onflow/flow-go/ledger/complete/mtrie/trie"
"github.com/onflow/flow-go/ledger/complete/wal"
Expand Down Expand Up @@ -43,7 +42,7 @@ func GenerateExecutionState(
return flow.DummyStateCommitment, err
}

compactor, err := complete.NewCompactor(ledgerStorage, diskWal, zerolog.Nop(), capacity, checkpointDistance, checkpointsToKeep, atomic.NewBool(false), metricsCollector)
compactor, err := ledger.NewCompactor(ledgerStorage, diskWal, zerolog.Nop(), capacity, checkpointDistance, checkpointsToKeep, atomic.NewBool(false), metricsCollector)
if err != nil {
return flow.DummyStateCommitment, err
}
Expand Down
9 changes: 4 additions & 5 deletions cmd/bootstrap/transit/cmd/pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
"github.com/onflow/flow-go/cmd/bootstrap/gcs"
"github.com/onflow/flow-go/cmd/bootstrap/utils"
"github.com/onflow/flow-go/model/bootstrap"
model "github.com/onflow/flow-go/model/bootstrap"
"github.com/onflow/flow-go/model/flow"
)

Expand Down Expand Up @@ -130,7 +129,7 @@ func pull(cmd *cobra.Command, args []string) {
if role == flow.RoleExecution {

// root.checkpoint* is downloaded to <bootstrap folder>/public-root-information after a pull
localPublicRootInfoDir := filepath.Join(flagBootDir, model.DirnamePublicBootstrap)
localPublicRootInfoDir := filepath.Join(flagBootDir, bootstrap.DirnamePublicBootstrap)

// move the root.checkpoint, root.checkpoint.0, root.checkpoint.1 etc. files to the bootstrap/execution-state dir
err = filepath.WalkDir(localPublicRootInfoDir, func(srcPath string, rootCheckpointFile fs.DirEntry, err error) error {
Expand All @@ -139,9 +138,9 @@ func pull(cmd *cobra.Command, args []string) {
}

// if rootCheckpointFile is a file whose name starts with "root.checkpoint", then move it
if !rootCheckpointFile.IsDir() && strings.HasPrefix(rootCheckpointFile.Name(), model.FilenameWALRootCheckpoint) {
if !rootCheckpointFile.IsDir() && strings.HasPrefix(rootCheckpointFile.Name(), bootstrap.FilenameWALRootCheckpoint) {

dstPath := filepath.Join(flagBootDir, model.DirnameExecutionState, rootCheckpointFile.Name())
dstPath := filepath.Join(flagBootDir, bootstrap.DirnameExecutionState, rootCheckpointFile.Name())
log.Info().Str("src", srcPath).Str("destination", dstPath).Msgf("moving file")
err = moveFile(srcPath, dstPath)
if err != nil {
Expand All @@ -165,7 +164,7 @@ func pull(cmd *cobra.Command, args []string) {
}

// calculate SHA256 of rootsnapshot
rootFile := filepath.Join(flagBootDir, model.PathRootProtocolStateSnapshot)
rootFile := filepath.Join(flagBootDir, bootstrap.PathRootProtocolStateSnapshot)
rootSHA256, err := getFileSHA256(rootFile)
if err != nil {
log.Fatal().Err(err).Str("file", rootFile).Msg("failed to calculate SHA256 of root file")
Expand Down
5 changes: 2 additions & 3 deletions cmd/bootstrap/utils/key_generation.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (

"github.com/onflow/flow-go/fvm/systemcontracts"
"github.com/onflow/flow-go/model/bootstrap"
model "github.com/onflow/flow-go/model/bootstrap"
"github.com/onflow/flow-go/model/encodable"
"github.com/onflow/flow-go/model/flow"
)
Expand Down Expand Up @@ -310,9 +309,9 @@ func WriteStakingNetworkingKeyFiles(nodeInfos []bootstrap.NodeInfo, write WriteJ
// WriteNodeInternalPubInfos writes the `node-internal-infos.pub.json` file.
// In a nutshell, this file contains the Role, address and weight for all authorized nodes.
func WriteNodeInternalPubInfos(nodeInfos []bootstrap.NodeInfo, write WriteJSONFileFunc) error {
configs := make([]model.NodeConfig, len(nodeInfos))
configs := make([]bootstrap.NodeConfig, len(nodeInfos))
for i, nodeInfo := range nodeInfos {
configs[i] = model.NodeConfig{
configs[i] = bootstrap.NodeConfig{
Role: nodeInfo.Role,
Address: nodeInfo.Address,
Weight: nodeInfo.Weight,
Expand Down
18 changes: 8 additions & 10 deletions cmd/execution_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ import (
"github.com/onflow/flow-go/ledger/common/pathfinder"
ledger "github.com/onflow/flow-go/ledger/complete"
"github.com/onflow/flow-go/ledger/complete/wal"
bootstrapFilenames "github.com/onflow/flow-go/model/bootstrap"
modelbootstrap "github.com/onflow/flow-go/model/bootstrap"
"github.com/onflow/flow-go/model/flow"
"github.com/onflow/flow-go/model/flow/filter"
Expand All @@ -78,7 +77,6 @@ import (
exedataprovider "github.com/onflow/flow-go/module/executiondatasync/provider"
"github.com/onflow/flow-go/module/executiondatasync/pruner"
edstorage "github.com/onflow/flow-go/module/executiondatasync/storage"
execdatastorage "github.com/onflow/flow-go/module/executiondatasync/storage"
"github.com/onflow/flow-go/module/executiondatasync/tracker"
"github.com/onflow/flow-go/module/finalizedreader"
finalizer "github.com/onflow/flow-go/module/finalizer/consensus"
Expand Down Expand Up @@ -168,7 +166,7 @@ type ExecutionNode struct {
executionDataStore execution_data.ExecutionDataStore
toTriggerCheckpoint *atomic.Bool // create the checkpoint trigger to be controlled by admin tool, and listened by the compactor
stopControl *stop.StopControl // stop the node at given block height
executionDataDatastore execdatastorage.DatastoreManager
executionDataDatastore edstorage.DatastoreManager
executionDataPruner *pruner.Pruner
executionDataBlobstore blobs.Blobstore
executionDataTracker tracker.Storage
Expand Down Expand Up @@ -1409,8 +1407,8 @@ func (exeNode *ExecutionNode) LoadBootstrapper(node *NodeConfig) error {

err := wal.CheckpointHasRootHash(
node.Logger,
path.Join(node.BootstrapDir, bootstrapFilenames.DirnameExecutionState),
bootstrapFilenames.FilenameWALRootCheckpoint,
path.Join(node.BootstrapDir, modelbootstrap.DirnameExecutionState),
modelbootstrap.FilenameWALRootCheckpoint,
ledgerpkg.RootHash(node.RootSeal.FinalState),
)
if err != nil {
Expand Down Expand Up @@ -1488,18 +1486,18 @@ func copyBootstrapState(dir, trie string) error {
firstCheckpointFilename := "00000000"

fileExists := func(fileName string) bool {
_, err := os.Stat(filepath.Join(dir, bootstrapFilenames.DirnameExecutionState, fileName))
_, err := os.Stat(filepath.Join(dir, modelbootstrap.DirnameExecutionState, fileName))
return err == nil
}

// if there is a root checkpoint file, then copy that file over
if fileExists(bootstrapFilenames.FilenameWALRootCheckpoint) {
filename = bootstrapFilenames.FilenameWALRootCheckpoint
if fileExists(modelbootstrap.FilenameWALRootCheckpoint) {
filename = modelbootstrap.FilenameWALRootCheckpoint
} else if fileExists(firstCheckpointFilename) {
// else if there is a checkpoint file, then copy that file over
filename = firstCheckpointFilename
} else {
filePath := filepath.Join(dir, bootstrapFilenames.DirnameExecutionState, firstCheckpointFilename)
filePath := filepath.Join(dir, modelbootstrap.DirnameExecutionState, firstCheckpointFilename)

// include absolute path of the missing file in the error message
absPath, err := filepath.Abs(filePath)
Expand All @@ -1511,7 +1509,7 @@ func copyBootstrapState(dir, trie string) error {
}

// copy from the bootstrap folder to the execution state folder
from, to := path.Join(dir, bootstrapFilenames.DirnameExecutionState), trie
from, to := path.Join(dir, modelbootstrap.DirnameExecutionState), trie

log.Info().Str("dir", dir).Str("trie", trie).
Msgf("linking checkpoint file %v from directory: %v, to: %v", filename, from, to)
Expand Down
5 changes: 2 additions & 3 deletions cmd/verification_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
"github.com/onflow/flow-go/consensus/hotstuff/verification"
recoveryprotocol "github.com/onflow/flow-go/consensus/recovery/protocol"
"github.com/onflow/flow-go/engine/common/follower"
followereng "github.com/onflow/flow-go/engine/common/follower"
commonsync "github.com/onflow/flow-go/engine/common/synchronization"
"github.com/onflow/flow-go/engine/execution/computation"
"github.com/onflow/flow-go/engine/verification/assigner"
Expand Down Expand Up @@ -390,7 +389,7 @@ func (v *VerificationNodeBuilder) LoadComponentsAndModules() {
heroCacheCollector = metrics.FollowerCacheMetrics(node.MetricsRegisterer)
}

core, err := followereng.NewComplianceCore(
core, err := follower.NewComplianceCore(
node.Logger,
node.Metrics.Mempool,
heroCacheCollector,
Expand All @@ -405,7 +404,7 @@ func (v *VerificationNodeBuilder) LoadComponentsAndModules() {
return nil, fmt.Errorf("could not create follower core: %w", err)
}

followerEng, err = followereng.NewComplianceLayer(
followerEng, err = follower.NewComplianceLayer(
node.Logger,
node.EngineRegistry,
node.Me,
Expand Down
Loading
Loading