diff --git a/api/info/service.go b/api/info/service.go index e315afd259e..9bdf245569a 100644 --- a/api/info/service.go +++ b/api/info/service.go @@ -25,7 +25,10 @@ import ( "github.com/ava-labs/avalanchego/utils/set" "github.com/ava-labs/avalanchego/version" "github.com/ava-labs/avalanchego/vms" + "github.com/ava-labs/avalanchego/vms/nftfx" "github.com/ava-labs/avalanchego/vms/platformvm/signer" + "github.com/ava-labs/avalanchego/vms/propertyfx" + "github.com/ava-labs/avalanchego/vms/secp256k1fx" ) var errNoChainProvided = errors.New("argument 'chain' not given") @@ -416,6 +419,7 @@ func (i *Info) GetTxFee(_ *http.Request, _ *struct{}, reply *GetTxFeeResponse) e // GetVMsReply contains the response metadata for GetVMs type GetVMsReply struct { VMs map[ids.ID][]string `json:"vms"` + Fxs map[ids.ID]string `json:"fxs"` } // GetVMs lists the virtual machines installed on the node @@ -432,5 +436,10 @@ func (i *Info) GetVMs(_ *http.Request, _ *struct{}, reply *GetVMsReply) error { } reply.VMs, err = ids.GetRelevantAliases(i.VMManager, vmIDs) + reply.Fxs = map[ids.ID]string{ + secp256k1fx.ID: secp256k1fx.Name, + nftfx.ID: nftfx.Name, + propertyfx.ID: propertyfx.Name, + } return err } diff --git a/chains/manager.go b/chains/manager.go index 84762d3eb3f..e7c49afcd02 100644 --- a/chains/manager.go +++ b/chains/manager.go @@ -55,9 +55,13 @@ import ( "github.com/ava-labs/avalanchego/utils/set" "github.com/ava-labs/avalanchego/version" "github.com/ava-labs/avalanchego/vms" + "github.com/ava-labs/avalanchego/vms/fx" "github.com/ava-labs/avalanchego/vms/metervm" + "github.com/ava-labs/avalanchego/vms/nftfx" "github.com/ava-labs/avalanchego/vms/platformvm/warp" + "github.com/ava-labs/avalanchego/vms/propertyfx" "github.com/ava-labs/avalanchego/vms/proposervm" + "github.com/ava-labs/avalanchego/vms/secp256k1fx" "github.com/ava-labs/avalanchego/vms/tracedvm" timetracker "github.com/ava-labs/avalanchego/snow/networking/tracker" @@ -96,6 +100,12 @@ var ( errNoPrimaryNetworkConfig = errors.New("no subnet config for primary network found") errPartialSyncAsAValidator = errors.New("partial sync should not be configured for a validator") + fxs = map[ids.ID]fx.Factory{ + secp256k1fx.ID: &secp256k1fx.Factory{}, + nftfx.ID: &nftfx.Factory{}, + propertyfx.ID: &propertyfx.Factory{}, + } + _ Manager = (*manager)(nil) ) @@ -511,23 +521,16 @@ func (m *manager) buildChain(chainParams ChainParameters, sb subnets.Subnet) (*c } // TODO: Shutdown VM if an error occurs - fxs := make([]*common.Fx, len(chainParams.FxIDs)) + chainFxs := make([]*common.Fx, len(chainParams.FxIDs)) for i, fxID := range chainParams.FxIDs { - // Get a factory for the fx we want to use on our chain - fxFactory, err := m.VMManager.GetFactory(fxID) - if err != nil { - return nil, fmt.Errorf("error while getting fxFactory: %w", err) - } - - fx, err := fxFactory.New(chainLog) - if err != nil { - return nil, fmt.Errorf("error while creating fx: %w", err) + fxFactory, ok := fxs[fxID] + if !ok { + return nil, fmt.Errorf("fx %s not found", fxID) } - // Create the fx - fxs[i] = &common.Fx{ + chainFxs[i] = &common.Fx{ ID: fxID, - Fx: fx, + Fx: fxFactory.New(), } } @@ -539,7 +542,7 @@ func (m *manager) buildChain(chainParams ChainParameters, sb subnets.Subnet) (*c chainParams.GenesisData, m.Validators, vm, - fxs, + chainFxs, sb, ) if err != nil { @@ -557,7 +560,7 @@ func (m *manager) buildChain(chainParams ChainParameters, sb subnets.Subnet) (*c m.Validators, beacons, vm, - fxs, + chainFxs, sb, ) if err != nil { diff --git a/node/node.go b/node/node.go index 1aeaddcf624..7842259c8a9 100644 --- a/node/node.go +++ b/node/node.go @@ -78,15 +78,12 @@ import ( "github.com/ava-labs/avalanchego/version" "github.com/ava-labs/avalanchego/vms" "github.com/ava-labs/avalanchego/vms/avm" - "github.com/ava-labs/avalanchego/vms/nftfx" "github.com/ava-labs/avalanchego/vms/platformvm" "github.com/ava-labs/avalanchego/vms/platformvm/block" "github.com/ava-labs/avalanchego/vms/platformvm/signer" "github.com/ava-labs/avalanchego/vms/platformvm/txs" - "github.com/ava-labs/avalanchego/vms/propertyfx" "github.com/ava-labs/avalanchego/vms/registry" "github.com/ava-labs/avalanchego/vms/rpcchainvm/runtime" - "github.com/ava-labs/avalanchego/vms/secp256k1fx" ipcsapi "github.com/ava-labs/avalanchego/api/ipcs" avmconfig "github.com/ava-labs/avalanchego/vms/avm/config" @@ -1226,9 +1223,6 @@ func (n *Node) initVMs() error { }, }), n.VMManager.RegisterFactory(context.TODO(), constants.EVMID, &coreth.Factory{}), - n.VMManager.RegisterFactory(context.TODO(), secp256k1fx.ID, &secp256k1fx.Factory{}), - n.VMManager.RegisterFactory(context.TODO(), nftfx.ID, &nftfx.Factory{}), - n.VMManager.RegisterFactory(context.TODO(), propertyfx.ID, &propertyfx.Factory{}), ) if err != nil { return err diff --git a/vms/fx/factory.go b/vms/fx/factory.go new file mode 100644 index 00000000000..a2c957a5bf6 --- /dev/null +++ b/vms/fx/factory.go @@ -0,0 +1,9 @@ +// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package fx + +// Factory returns an instance of a feature extension +type Factory interface { + New() any +} diff --git a/vms/nftfx/factory.go b/vms/nftfx/factory.go index a111bc0ed7e..c8be03661bb 100644 --- a/vms/nftfx/factory.go +++ b/vms/nftfx/factory.go @@ -5,12 +5,13 @@ package nftfx import ( "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/logging" - "github.com/ava-labs/avalanchego/vms" + "github.com/ava-labs/avalanchego/vms/fx" ) +const Name = "nftfx" + var ( - _ vms.Factory = (*Factory)(nil) + _ fx.Factory = (*Factory)(nil) // ID that this Fx uses when labeled ID = ids.ID{'n', 'f', 't', 'f', 'x'} @@ -18,6 +19,6 @@ var ( type Factory struct{} -func (*Factory) New(logging.Logger) (interface{}, error) { - return &Fx{}, nil +func (*Factory) New() any { + return &Fx{} } diff --git a/vms/nftfx/factory_test.go b/vms/nftfx/factory_test.go index 6b4fba9861a..6b5ecafbeec 100644 --- a/vms/nftfx/factory_test.go +++ b/vms/nftfx/factory_test.go @@ -7,15 +7,11 @@ import ( "testing" "github.com/stretchr/testify/require" - - "github.com/ava-labs/avalanchego/utils/logging" ) func TestFactory(t *testing.T) { require := require.New(t) factory := Factory{} - fx, err := factory.New(logging.NoLog{}) - require.NoError(err) - require.NotNil(fx) + require.Equal(&Fx{}, factory.New()) } diff --git a/vms/propertyfx/factory.go b/vms/propertyfx/factory.go index c42b92c84c5..53d6101b130 100644 --- a/vms/propertyfx/factory.go +++ b/vms/propertyfx/factory.go @@ -5,12 +5,13 @@ package propertyfx import ( "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/logging" - "github.com/ava-labs/avalanchego/vms" + "github.com/ava-labs/avalanchego/vms/fx" ) +const Name = "propertyfx" + var ( - _ vms.Factory = (*Factory)(nil) + _ fx.Factory = (*Factory)(nil) // ID that this Fx uses when labeled ID = ids.ID{'p', 'r', 'o', 'p', 'e', 'r', 't', 'y', 'f', 'x'} @@ -18,6 +19,6 @@ var ( type Factory struct{} -func (*Factory) New(logging.Logger) (interface{}, error) { - return &Fx{}, nil +func (*Factory) New() any { + return &Fx{} } diff --git a/vms/propertyfx/factory_test.go b/vms/propertyfx/factory_test.go index f40cb2610a8..9aa461921e4 100644 --- a/vms/propertyfx/factory_test.go +++ b/vms/propertyfx/factory_test.go @@ -7,15 +7,11 @@ import ( "testing" "github.com/stretchr/testify/require" - - "github.com/ava-labs/avalanchego/utils/logging" ) func TestFactory(t *testing.T) { require := require.New(t) factory := Factory{} - fx, err := factory.New(logging.NoLog{}) - require.NoError(err) - require.NotNil(fx) + require.Equal(&Fx{}, factory.New()) } diff --git a/vms/secp256k1fx/factory.go b/vms/secp256k1fx/factory.go index fd52fe79a6f..9630795ea37 100644 --- a/vms/secp256k1fx/factory.go +++ b/vms/secp256k1fx/factory.go @@ -5,12 +5,13 @@ package secp256k1fx import ( "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/logging" - "github.com/ava-labs/avalanchego/vms" + "github.com/ava-labs/avalanchego/vms/fx" ) +const Name = "secp256k1fx" + var ( - _ vms.Factory = (*Factory)(nil) + _ fx.Factory = (*Factory)(nil) // ID that this Fx uses when labeled ID = ids.ID{'s', 'e', 'c', 'p', '2', '5', '6', 'k', '1', 'f', 'x'} @@ -18,6 +19,6 @@ var ( type Factory struct{} -func (*Factory) New(logging.Logger) (interface{}, error) { - return &Fx{}, nil +func (*Factory) New() any { + return &Fx{} } diff --git a/vms/secp256k1fx/factory_test.go b/vms/secp256k1fx/factory_test.go index 2b1fa184474..d7653d361f5 100644 --- a/vms/secp256k1fx/factory_test.go +++ b/vms/secp256k1fx/factory_test.go @@ -7,14 +7,10 @@ import ( "testing" "github.com/stretchr/testify/require" - - "github.com/ava-labs/avalanchego/utils/logging" ) func TestFactory(t *testing.T) { require := require.New(t) factory := Factory{} - fx, err := factory.New(logging.NoLog{}) - require.NoError(err) - require.NotNil(fx) + require.Equal(&Fx{}, factory.New()) }