From 69046849a7bf3a83cb5aea65cb3b57e7a93572a8 Mon Sep 17 00:00:00 2001 From: Felipe Madero Date: Fri, 28 Feb 2025 23:20:25 -0300 Subject: [PATCH] add evm multisig feature --- cmd/blockchaincmd/add_validator.go | 99 ++++++++++++------- cmd/nodecmd/local.go | 8 +- go.mod | 2 + pkg/contract/contract.go | 60 +++++------ pkg/evm/evm.go | 21 ++-- pkg/ictt/deploy.go | 1 + pkg/ictt/operate.go | 9 ++ pkg/interchain/operate.go | 1 + pkg/precompiles/allowlist.go | 4 + pkg/validatormanager/proxy.go | 1 + pkg/validatormanager/registration.go | 66 +++++++++---- pkg/validatormanager/removal.go | 4 + sdk/validatormanager/root.go | 1 + sdk/validatormanager/validator_manager_poa.go | 1 + sdk/validatormanager/validator_manager_pos.go | 1 + 15 files changed, 188 insertions(+), 91 deletions(-) diff --git a/cmd/blockchaincmd/add_validator.go b/cmd/blockchaincmd/add_validator.go index df9fd9f18..7ddcb7dbc 100644 --- a/cmd/blockchaincmd/add_validator.go +++ b/cmd/blockchaincmd/add_validator.go @@ -3,6 +3,7 @@ package blockchaincmd import ( + "encoding/hex" "errors" "fmt" "strings" @@ -31,31 +32,31 @@ import ( "github.com/ava-labs/avalanchego/utils/logging" "github.com/ava-labs/avalanchego/utils/units" warpMessage "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" + "github.com/ethereum/go-ethereum/common" "github.com/spf13/cobra" ) var ( - nodeIDStr string - nodeEndpoint string - balanceAVAX float64 - weight uint64 - startTimeStr string - duration time.Duration - defaultValidatorParams bool - useDefaultStartTime bool - useDefaultDuration bool - useDefaultWeight bool - waitForTxAcceptance bool - publicKey string - pop string - remainingBalanceOwnerAddr string - disableOwnerAddr string - rpcURL string - aggregatorLogLevel string - aggregatorLogToStdout bool - delegationFee uint16 - + nodeIDStr string + nodeEndpoint string + balanceAVAX float64 + weight uint64 + startTimeStr string + duration time.Duration + defaultValidatorParams bool + useDefaultStartTime bool + useDefaultDuration bool + useDefaultWeight bool + waitForTxAcceptance bool + publicKey string + pop string + remainingBalanceOwnerAddr string + disableOwnerAddr string + rpcURL string + aggregatorLogLevel string + aggregatorLogToStdout bool + delegationFee uint16 errNoSubnetID = errors.New("failed to find the subnet ID for this subnet, has it been deployed/created on this network?") errMutuallyExclusiveDurationOptions = errors.New("--use-default-duration/--use-default-validator-params and --staking-period are mutually exclusive") errMutuallyExclusiveStartOptions = errors.New("--use-default-start-time/--use-default-validator-params and --start-time are mutually exclusive") @@ -65,6 +66,7 @@ var ( aggregatorAllowPrivatePeers bool clusterNameFlagValue string createLocalValidator bool + multisigValidatorManagerOwner bool ) const ( @@ -124,6 +126,7 @@ Testnet or Mainnet.`, cmd.Flags().StringVar(&subnetIDstr, "subnet-id", "", "subnet ID (only if blockchain name is not provided)") cmd.Flags().StringVar(&validatorManagerOwnerAddress, "validator-manager-owner", "", "validator manager owner address (only if blockchain name is not provided)") cmd.Flags().Uint64Var(&weight, validatorWeightFlag, uint64(constants.DefaultStakeWeight), "set the weight of the validator") + cmd.Flags().BoolVar(&multisigValidatorManagerOwner, "multisig-validator-manager-ower", false, "validator manager owner is multisig, make hex dump of ech evm transactions, so they can be signed in a separate flow") return cmd } @@ -404,17 +407,22 @@ func CallAddValidator( return fmt.Errorf("unable to find Validator Manager address") } validatorManagerAddress = sc.Networks[network.Name()].ValidatorManagerAddress - ownerPrivateKeyFound, _, _, ownerPrivateKey, err := contract.SearchForManagedKey( - app, - network, - common.HexToAddress(sc.ValidatorManagerOwner), - true, - ) - if err != nil { - return err - } - if !ownerPrivateKeyFound { - return fmt.Errorf("private key for Validator manager owner %s is not found", sc.ValidatorManagerOwner) + + var ownerPrivateKey string + if !multisigValidatorManagerOwner { + var ownerPrivateKeyFound bool + ownerPrivateKeyFound, _, _, ownerPrivateKey, err = contract.SearchForManagedKey( + app, + network, + common.HexToAddress(sc.ValidatorManagerOwner), + true, + ) + if err != nil { + return err + } + if !ownerPrivateKeyFound { + return fmt.Errorf("private key for Validator manager owner %s is not found", sc.ValidatorManagerOwner) + } } pos := sc.PoS() @@ -523,12 +531,14 @@ func CallAddValidator( } aggregatorCtx, aggregatorCancel := sdkutils.GetTimedContext(constants.SignatureAggregatorTimeout) defer aggregatorCancel() - signedMessage, validationID, err := validatormanager.InitValidatorRegistration( + signedMessage, validationID, rawTx, err := validatormanager.InitValidatorRegistration( aggregatorCtx, app, network, rpcURL, chainSpec, + multisigValidatorManagerOwner, + sc.ValidatorManagerOwner, ownerPrivateKey, nodeID, blsInfo.PublicKey[:], @@ -547,6 +557,15 @@ func CallAddValidator( if err != nil { return err } + if rawTx != nil { + bs, err := rawTx.MarshalBinary() + if err != nil { + return fmt.Errorf("failure marshalling raw evm tx: %w", err) + } + ux.Logger.PrintToUser("Raw Tx Dump For Initializing Validator Registration. Please sign and commit it.") + ux.Logger.PrintToUser("0x%s", hex.EncodeToString(bs)) + return nil + } ux.Logger.PrintToUser("ValidationID: %s", validationID) txID, _, err := deployer.RegisterL1Validator(balance, blsInfo, signedMessage) @@ -566,21 +585,33 @@ func CallAddValidator( aggregatorCtx, aggregatorCancel = sdkutils.GetTimedContext(constants.SignatureAggregatorTimeout) defer aggregatorCancel() - if err := validatormanager.FinishValidatorRegistration( + rawTx, err = validatormanager.FinishValidatorRegistration( aggregatorCtx, app, network, rpcURL, chainSpec, + multisigValidatorManagerOwner, + sc.ValidatorManagerOwner, ownerPrivateKey, validationID, extraAggregatorPeers, aggregatorAllowPrivatePeers, aggregatorLogger, validatorManagerAddress, - ); err != nil { + ) + if err != nil { return err } + if rawTx != nil { + bs, err := rawTx.MarshalBinary() + if err != nil { + return fmt.Errorf("failure marshalling raw evm tx: %w", err) + } + ux.Logger.PrintToUser("Raw Tx Dump For Finish Validator Registration. Please sign and commit it.") + ux.Logger.PrintToUser("0x%s", hex.EncodeToString(bs)) + return nil + } ux.Logger.PrintToUser(" NodeID: %s", nodeID) ux.Logger.PrintToUser(" Network: %s", network.Name()) diff --git a/cmd/nodecmd/local.go b/cmd/nodecmd/local.go index 9bed7f0c5..a83c47e83 100644 --- a/cmd/nodecmd/local.go +++ b/cmd/nodecmd/local.go @@ -541,12 +541,14 @@ func addAsValidator(network models.Network, aggregatorCtx, aggregatorCancel := sdkutils.GetTimedContext(constants.SignatureAggregatorTimeout) defer aggregatorCancel() - signedMessage, validationID, err := validatormanager.InitValidatorRegistration( + signedMessage, validationID, _, err := validatormanager.InitValidatorRegistration( aggregatorCtx, app, network, rpcURL, chainSpec, + false, + "", payerPrivateKey, nodeID, blsInfo.PublicKey[:], @@ -585,12 +587,14 @@ func addAsValidator(network models.Network, aggregatorCtx, aggregatorCancel = sdkutils.GetTimedContext(constants.SignatureAggregatorTimeout) defer aggregatorCancel() - if err := validatormanager.FinishValidatorRegistration( + if _, err := validatormanager.FinishValidatorRegistration( aggregatorCtx, app, network, rpcURL, chainSpec, + false, + "", payerPrivateKey, validationID, extraAggregatorPeers, diff --git a/go.mod b/go.mod index 8a3107b4a..6bb08c51e 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module github.com/ava-labs/avalanche-cli go 1.22.10 +replace github.com/ava-labs/subnet-evm => ../subnet-evm + require ( github.com/ava-labs/apm v1.0.0 github.com/ava-labs/avalanche-network-runner v1.8.4-0.20250219173912-dbb9afce58c1 diff --git a/pkg/contract/contract.go b/pkg/contract/contract.go index c351cffc3..f013a5c00 100644 --- a/pkg/contract/contract.go +++ b/pkg/contract/contract.go @@ -289,25 +289,11 @@ func ParseSpec( return name, string(abiBytes), nil } -// Signer that just copy the raw Tx and returns error -// To be used on multisig flows where the user is going -// to sign and commit in separate flow -// -// Using this signer hack because it is the only setting that can be -// configured to get access to the raw tx before beign signed (subnet-evm -// transact function) -// -// Not multithread safe -var ( - rawTxCopy *types.Transaction - errRawTxCopy = errors.New("raw tx has been copied, not signed") -) -func rawTxCopySigner( +func idempotentSigner( _ common.Address, tx *types.Transaction, ) (*types.Transaction, error) { - rawTxCopy = tx - return nil, errRawTxCopy + return tx, nil } // get method name and types from [methodsSpec], then call it @@ -316,6 +302,7 @@ func rawTxCopySigner( func TxToMethod( rpcURL string, generateRawTxOnly bool, + from common.Address, privateKey string, contractAddress common.Address, payment *big.Int, @@ -341,21 +328,25 @@ func TxToMethod( } defer client.Close() contract := bind.NewBoundContract(contractAddress, *abi, client, client, client) - txOpts, err := evm.GetTxOptsWithSigner(client, privateKey) - if err != nil { - return nil, nil, err - } - txOpts.Value = payment + var txOpts *bind.TransactOpts if generateRawTxOnly { - txOpts.Signer = rawTxCopySigner + txOpts = &bind.TransactOpts{ + From: from, + Signer: idempotentSigner, + NoSend: true, + } + } else { + txOpts, err = evm.GetTxOptsWithSigner(client, privateKey) + if err != nil { + return nil, nil, err + } } + txOpts.Value = payment tx, err := contract.Transact(txOpts, methodName, params...) if err != nil { - if err == errRawTxCopy { - return rawTxCopy, nil, nil - } trace, traceCallErr := DebugTraceCall( rpcURL, + from, privateKey, contractAddress, payment, @@ -379,6 +370,9 @@ func TxToMethod( } return tx, nil, err } + if generateRawTxOnly { + return tx, nil, nil + } receipt, success, err := evm.WaitForTransaction(client, tx) if err != nil { return tx, nil, err @@ -402,6 +396,7 @@ func TxToMethod( func TxToMethodWithWarpMessage( rpcURL string, generateRawTxOnly bool, + from common.Address, privateKey string, contractAddress common.Address, warpMessage *avalancheWarp.Message, @@ -434,6 +429,7 @@ func TxToMethodWithWarpMessage( tx, err := evm.GetTxToMethodWithWarpMessage( client, generateRawTxOnly, + from, privateKey, warpMessage, contractAddress, @@ -443,6 +439,9 @@ func TxToMethodWithWarpMessage( if err != nil { return nil, nil, err } + if generateRawTxOnly { + return tx, nil, nil + } if err := evm.SendTransaction(client, tx); err != nil { return tx, nil, err } @@ -519,6 +518,7 @@ func DebugTraceTransaction( func DebugTraceCall( rpcURL string, + from common.Address, privateKey string, contractAddress common.Address, payment *big.Int, @@ -545,11 +545,13 @@ func DebugTraceCall( return nil, err } defer client.Close() - pk, err := crypto.HexToECDSA(privateKey) - if err != nil { - return nil, err + if from == (common.Address{}) { + pk, err := crypto.HexToECDSA(privateKey) + if err != nil { + return nil, err + } + from = crypto.PubkeyToAddress(pk.PublicKey) } - from := crypto.PubkeyToAddress(pk.PublicKey) data := map[string]string{ "from": from.Hex(), "to": contractAddress.Hex(), diff --git a/pkg/evm/evm.go b/pkg/evm/evm.go index 18edf6bc2..c5ceb07af 100644 --- a/pkg/evm/evm.go +++ b/pkg/evm/evm.go @@ -267,6 +267,7 @@ func FundAddress( func GetTxToMethodWithWarpMessage( client ethclient.Client, generateRawTxOnly bool, + from common.Address, privateKeyStr string, warpMessage *avalancheWarp.Message, contract common.Address, @@ -274,12 +275,20 @@ func GetTxToMethodWithWarpMessage( value *big.Int, ) (*types.Transaction, error) { const defaultGasLimit = 2_000_000 - privateKey, err := crypto.HexToECDSA(privateKeyStr) - if err != nil { - return nil, err + var ( + privateKey *ecdsa.PrivateKey + err error + ) + if privateKeyStr != "" { + privateKey, err = crypto.HexToECDSA(privateKeyStr) + if err != nil { + return nil, err + } + } + if from == (common.Address{}) { + from = crypto.PubkeyToAddress(privateKey.PublicKey) } - address := crypto.PubkeyToAddress(privateKey.PublicKey) - gasFeeCap, gasTipCap, nonce, err := CalculateTxParams(client, address.Hex()) + gasFeeCap, gasTipCap, nonce, err := CalculateTxParams(client, from.Hex()) if err != nil { return nil, err } @@ -294,7 +303,7 @@ func GetTxToMethodWithWarpMessage( }, } msg := interfaces.CallMsg{ - From: address, + From: from, To: &contract, GasPrice: nil, GasTipCap: gasTipCap, diff --git a/pkg/ictt/deploy.go b/pkg/ictt/deploy.go index 77a60003e..c9bf2f5ff 100644 --- a/pkg/ictt/deploy.go +++ b/pkg/ictt/deploy.go @@ -39,6 +39,7 @@ func RegisterRemote( _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, remoteAddress, nil, diff --git a/pkg/ictt/operate.go b/pkg/ictt/operate.go index 77dddc76f..87a4d5cde 100644 --- a/pkg/ictt/operate.go +++ b/pkg/ictt/operate.go @@ -229,6 +229,7 @@ func ERC20TokenHomeSend( if _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, tokenAddress, nil, @@ -253,6 +254,7 @@ func ERC20TokenHomeSend( _, _, err = contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, homeAddress, nil, @@ -301,6 +303,7 @@ func NativeTokenHomeSend( _, _, err = contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, homeAddress, amount, @@ -324,6 +327,7 @@ func ERC20TokenRemoteSend( if _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, remoteAddress, nil, @@ -358,6 +362,7 @@ func ERC20TokenRemoteSend( _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, remoteAddress, nil, @@ -402,6 +407,7 @@ func NativeTokenRemoteSend( _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, remoteAddress, amount, @@ -424,6 +430,7 @@ func NativeTokenHomeAddCollateral( _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, homeAddress, amount, @@ -451,6 +458,7 @@ func ERC20TokenHomeAddCollateral( if _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, tokenAddress, nil, @@ -465,6 +473,7 @@ func ERC20TokenHomeAddCollateral( _, _, err = contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, homeAddress, nil, diff --git a/pkg/interchain/operate.go b/pkg/interchain/operate.go index 456d85496..19a69a5d2 100644 --- a/pkg/interchain/operate.go +++ b/pkg/interchain/operate.go @@ -89,6 +89,7 @@ func SendCrossChainMessage( return contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, messengerAddress, nil, diff --git a/pkg/precompiles/allowlist.go b/pkg/precompiles/allowlist.go index c68b1f809..7180a1eea 100644 --- a/pkg/precompiles/allowlist.go +++ b/pkg/precompiles/allowlist.go @@ -20,6 +20,7 @@ func SetAdmin( _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, precompile, nil, @@ -40,6 +41,7 @@ func SetManager( _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, precompile, nil, @@ -60,6 +62,7 @@ func SetEnabled( _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, precompile, nil, @@ -80,6 +83,7 @@ func SetNone( _, _, err := contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, precompile, nil, diff --git a/pkg/validatormanager/proxy.go b/pkg/validatormanager/proxy.go index eb6d5a299..bf6620c5f 100644 --- a/pkg/validatormanager/proxy.go +++ b/pkg/validatormanager/proxy.go @@ -23,6 +23,7 @@ func SetupValidatorManagerAtProxy( return contract.TxToMethod( rpcURL, false, + common.Address{}, proxyManagerPrivateKey, common.HexToAddress(validatorManagerSDK.ProxyAdminContractAddress), big.NewInt(0), diff --git a/pkg/validatormanager/registration.go b/pkg/validatormanager/registration.go index 831cc1c6d..a12cf3425 100644 --- a/pkg/validatormanager/registration.go +++ b/pkg/validatormanager/registration.go @@ -83,6 +83,7 @@ func InitializeValidatorRegistrationPoSNative( return contract.TxToMethod( rpcURL, false, + common.Address{}, managerOwnerPrivateKey, managerAddress, stakeAmount, @@ -99,6 +100,8 @@ func InitializeValidatorRegistrationPoSNative( func InitializeValidatorRegistrationPoA( rpcURL string, managerAddress common.Address, + generateRawTxOnly bool, + managerOwnerAddress common.Address, managerOwnerPrivateKey string, nodeID ids.NodeID, blsPublicKey []byte, @@ -139,7 +142,8 @@ func InitializeValidatorRegistrationPoA( } return contract.TxToMethod( rpcURL, - false, + generateRawTxOnly, + managerOwnerAddress, managerOwnerPrivateKey, managerAddress, big.NewInt(0), @@ -319,12 +323,15 @@ func GetPChainSubnetValidatorRegistrationWarpMessage( func CompleteValidatorRegistration( rpcURL string, managerAddress common.Address, + generateRawTxOnly bool, + ownerAddress common.Address, privateKey string, // not need to be owner atm subnetValidatorRegistrationSignedMessage *warp.Message, ) (*types.Transaction, *types.Receipt, error) { return contract.TxToMethodWithWarpMessage( rpcURL, - false, + generateRawTxOnly, + ownerAddress, privateKey, managerAddress, subnetValidatorRegistrationSignedMessage, @@ -342,6 +349,8 @@ func InitValidatorRegistration( network models.Network, rpcURL string, chainSpec contract.ChainSpec, + generateRawTxOnly bool, + ownerAddressStr string, ownerPrivateKey string, nodeID ids.NodeID, blsPublicKey []byte, @@ -356,14 +365,14 @@ func InitValidatorRegistration( delegationFee uint16, stakeDuration time.Duration, validatorManagerAddressStr string, -) (*warp.Message, ids.ID, error) { +) (*warp.Message, ids.ID, *types.Transaction, error) { subnetID, err := contract.GetSubnetID( app, network, chainSpec, ) if err != nil { - return nil, ids.Empty, err + return nil, ids.Empty, nil, err } blockchainID, err := contract.GetBlockchainID( app, @@ -371,9 +380,10 @@ func InitValidatorRegistration( chainSpec, ) if err != nil { - return nil, ids.Empty, err + return nil, ids.Empty, nil, err } managerAddress := common.HexToAddress(validatorManagerAddressStr) + ownerAddress := common.HexToAddress(ownerAddressStr) alreadyInitialized := false if initWithPos { stakeAmount, err := PoSWeightToValue( @@ -382,7 +392,7 @@ func InitValidatorRegistration( weight, ) if err != nil { - return nil, ids.Empty, fmt.Errorf("failure obtaining value from weight: %w", err) + return nil, ids.Empty, nil, fmt.Errorf("failure obtaining value from weight: %w", err) } ux.Logger.PrintLineSeparator() ux.Logger.PrintToUser("Initializing validator registration with PoS validator manager") @@ -404,7 +414,7 @@ func InitValidatorRegistration( ) if err != nil { if !errors.Is(err, validatormanager.ErrNodeAlreadyRegistered) { - return nil, ids.Empty, evm.TransactionError(tx, err, "failure initializing validator registration") + return nil, ids.Empty, nil, evm.TransactionError(tx, err, "failure initializing validator registration") } ux.Logger.PrintToUser(logging.LightBlue.Wrap("The validator registration was already initialized. Proceeding to the next step")) alreadyInitialized = true @@ -415,6 +425,8 @@ func InitValidatorRegistration( tx, _, err := InitializeValidatorRegistrationPoA( rpcURL, managerAddress, + generateRawTxOnly, + ownerAddress, ownerPrivateKey, nodeID, blsPublicKey, @@ -425,15 +437,17 @@ func InitValidatorRegistration( ) if err != nil { if !errors.Is(err, validatormanager.ErrNodeAlreadyRegistered) { - return nil, ids.Empty, evm.TransactionError(tx, err, "failure initializing validator registration") + return nil, ids.Empty, nil, evm.TransactionError(tx, err, "failure initializing validator registration") } ux.Logger.PrintToUser(logging.LightBlue.Wrap("The validator registration was already initialized. Proceeding to the next step")) alreadyInitialized = true + } else if generateRawTxOnly { + return nil, ids.Empty, tx, nil } ux.Logger.PrintToUser(fmt.Sprintf("Validator weight: %d", weight)) } - return GetSubnetValidatorRegistrationMessage( + signedMessage, validationID, err := GetSubnetValidatorRegistrationMessage( ctx, rpcURL, network, @@ -452,6 +466,8 @@ func InitValidatorRegistration( weight, alreadyInitialized, ) + + return signedMessage, validationID, nil, err } func FinishValidatorRegistration( @@ -460,20 +476,22 @@ func FinishValidatorRegistration( network models.Network, rpcURL string, chainSpec contract.ChainSpec, + generateRawTxOnly bool, + ownerAddressStr string, privateKey string, validationID ids.ID, aggregatorExtraPeerEndpoints []info.Peer, aggregatorAllowPrivatePeers bool, aggregatorLogger logging.Logger, validatorManagerAddressStr string, -) error { +) (*types.Transaction, error) { subnetID, err := contract.GetSubnetID( app, network, chainSpec, ) if err != nil { - return err + return nil, err } managerAddress := common.HexToAddress(validatorManagerAddressStr) signedMessage, err := GetPChainSubnetValidatorRegistrationWarpMessage( @@ -489,28 +507,36 @@ func FinishValidatorRegistration( true, ) if err != nil { - return err + return nil, err } - if err := evm.SetupProposerVM( - rpcURL, - privateKey, - ); err != nil { - ux.Logger.RedXToUser("failure setting proposer VM on L1: %w", err) + if privateKey != "" { + if err := evm.SetupProposerVM( + rpcURL, + privateKey, + ); err != nil { + ux.Logger.RedXToUser("failure setting proposer VM on L1: %w", err) + } } + ownerAddress := common.HexToAddress(ownerAddressStr) tx, _, err := CompleteValidatorRegistration( rpcURL, managerAddress, + generateRawTxOnly, + ownerAddress, privateKey, signedMessage, ) if err != nil { if !errors.Is(err, validatormanager.ErrInvalidValidationID) { - return evm.TransactionError(tx, err, "failure completing validator registration") + return nil, evm.TransactionError(tx, err, "failure completing validator registration") } else { - return fmt.Errorf("the Validator was already fully registered on the Manager") + return nil, fmt.Errorf("the Validator was already fully registered on the Manager") } } - return nil + if generateRawTxOnly { + return tx, nil + } + return nil, nil } func GetRegistrationMessage( diff --git a/pkg/validatormanager/removal.go b/pkg/validatormanager/removal.go index fa906f17a..c5d08654c 100644 --- a/pkg/validatormanager/removal.go +++ b/pkg/validatormanager/removal.go @@ -43,6 +43,7 @@ func InitializeValidatorRemoval( return contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, managerAddress, big.NewInt(0), @@ -58,6 +59,7 @@ func InitializeValidatorRemoval( return contract.TxToMethodWithWarpMessage( rpcURL, false, + common.Address{}, privateKey, managerAddress, uptimeProofSignedMessage, @@ -74,6 +76,7 @@ func InitializeValidatorRemoval( return contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, managerAddress, big.NewInt(0), @@ -290,6 +293,7 @@ func CompleteValidatorRemoval( return contract.TxToMethodWithWarpMessage( rpcURL, false, + common.Address{}, privateKey, managerAddress, subnetValidatorRegistrationSignedMessage, diff --git a/sdk/validatormanager/root.go b/sdk/validatormanager/root.go index b60c7b9c8..3b4e8fb3c 100644 --- a/sdk/validatormanager/root.go +++ b/sdk/validatormanager/root.go @@ -284,6 +284,7 @@ func InitializeValidatorsSet( return contract.TxToMethodWithWarpMessage( rpcURL, false, + common.Address{}, privateKey, managerAddress, subnetConversionSignedMessage, diff --git a/sdk/validatormanager/validator_manager_poa.go b/sdk/validatormanager/validator_manager_poa.go index dee01ce04..f25696221 100644 --- a/sdk/validatormanager/validator_manager_poa.go +++ b/sdk/validatormanager/validator_manager_poa.go @@ -36,6 +36,7 @@ func PoAValidatorManagerInitialize( return contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, managerAddress, nil, diff --git a/sdk/validatormanager/validator_manager_pos.go b/sdk/validatormanager/validator_manager_pos.go index d716bf8d1..1d35546bf 100644 --- a/sdk/validatormanager/validator_manager_pos.go +++ b/sdk/validatormanager/validator_manager_pos.go @@ -47,6 +47,7 @@ func PoSValidatorManagerInitialize( return contract.TxToMethod( rpcURL, false, + common.Address{}, privateKey, managerAddress, nil,