diff --git a/pkg/contract/contract.go b/pkg/contract/contract.go index 2b862f2cd..c351cffc3 100644 --- a/pkg/contract/contract.go +++ b/pkg/contract/contract.go @@ -289,11 +289,33 @@ 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( + _ common.Address, + tx *types.Transaction, +) (*types.Transaction, error) { + rawTxCopy = tx + return nil, errRawTxCopy +} + // get method name and types from [methodsSpec], then call it // at the smart contract [contractAddress] with the given [params]. // also send [payment] tokens to it func TxToMethod( rpcURL string, + generateRawTxOnly bool, privateKey string, contractAddress common.Address, payment *big.Int, @@ -324,8 +346,14 @@ func TxToMethod( return nil, nil, err } txOpts.Value = payment + if generateRawTxOnly { + txOpts.Signer = rawTxCopySigner + } tx, err := contract.Transact(txOpts, methodName, params...) if err != nil { + if err == errRawTxCopy { + return rawTxCopy, nil, nil + } trace, traceCallErr := DebugTraceCall( rpcURL, privateKey, @@ -373,6 +401,7 @@ func TxToMethod( // also send [payment] tokens to it func TxToMethodWithWarpMessage( rpcURL string, + generateRawTxOnly bool, privateKey string, contractAddress common.Address, warpMessage *avalancheWarp.Message, @@ -402,8 +431,9 @@ func TxToMethodWithWarpMessage( return nil, nil, err } defer client.Close() - tx, err := evm.GetSignedTxToMethodWithWarpMessage( + tx, err := evm.GetTxToMethodWithWarpMessage( client, + generateRawTxOnly, privateKey, warpMessage, contractAddress, diff --git a/pkg/evm/evm.go b/pkg/evm/evm.go index a0c14ac33..18edf6bc2 100644 --- a/pkg/evm/evm.go +++ b/pkg/evm/evm.go @@ -264,8 +264,9 @@ func FundAddress( return nil } -func GetSignedTxToMethodWithWarpMessage( +func GetTxToMethodWithWarpMessage( client ethclient.Client, + generateRawTxOnly bool, privateKeyStr string, warpMessage *avalancheWarp.Message, contract common.Address, @@ -320,6 +321,9 @@ func GetSignedTxToMethodWithWarpMessage( Data: callData, AccessList: accessList, }) + if generateRawTxOnly { + return tx, nil + } txSigner := types.LatestSignerForChainID(chainID) return types.SignTx(tx, txSigner, privateKey) } diff --git a/pkg/ictt/deploy.go b/pkg/ictt/deploy.go index 724dcb96c..77a60003e 100644 --- a/pkg/ictt/deploy.go +++ b/pkg/ictt/deploy.go @@ -38,6 +38,7 @@ func RegisterRemote( } _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, remoteAddress, nil, diff --git a/pkg/ictt/operate.go b/pkg/ictt/operate.go index 00edabe65..77dddc76f 100644 --- a/pkg/ictt/operate.go +++ b/pkg/ictt/operate.go @@ -228,6 +228,7 @@ func ERC20TokenHomeSend( } if _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, tokenAddress, nil, @@ -251,6 +252,7 @@ func ERC20TokenHomeSend( } _, _, err = contract.TxToMethod( rpcURL, + false, privateKey, homeAddress, nil, @@ -298,6 +300,7 @@ func NativeTokenHomeSend( } _, _, err = contract.TxToMethod( rpcURL, + false, privateKey, homeAddress, amount, @@ -320,6 +323,7 @@ func ERC20TokenRemoteSend( ) error { if _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, remoteAddress, nil, @@ -353,6 +357,7 @@ func ERC20TokenRemoteSend( } _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, remoteAddress, nil, @@ -396,6 +401,7 @@ func NativeTokenRemoteSend( } _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, remoteAddress, amount, @@ -417,6 +423,7 @@ func NativeTokenHomeAddCollateral( ) error { _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, homeAddress, amount, @@ -443,6 +450,7 @@ func ERC20TokenHomeAddCollateral( } if _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, tokenAddress, nil, @@ -456,6 +464,7 @@ func ERC20TokenHomeAddCollateral( } _, _, err = contract.TxToMethod( rpcURL, + false, privateKey, homeAddress, nil, diff --git a/pkg/interchain/operate.go b/pkg/interchain/operate.go index da4182239..456d85496 100644 --- a/pkg/interchain/operate.go +++ b/pkg/interchain/operate.go @@ -88,6 +88,7 @@ func SendCrossChainMessage( } return contract.TxToMethod( rpcURL, + false, privateKey, messengerAddress, nil, diff --git a/pkg/precompiles/allowlist.go b/pkg/precompiles/allowlist.go index 7f8624285..c68b1f809 100644 --- a/pkg/precompiles/allowlist.go +++ b/pkg/precompiles/allowlist.go @@ -19,6 +19,7 @@ func SetAdmin( ) error { _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, precompile, nil, @@ -38,6 +39,7 @@ func SetManager( ) error { _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, precompile, nil, @@ -57,6 +59,7 @@ func SetEnabled( ) error { _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, precompile, nil, @@ -76,6 +79,7 @@ func SetNone( ) error { _, _, err := contract.TxToMethod( rpcURL, + false, privateKey, precompile, nil, diff --git a/pkg/validatormanager/proxy.go b/pkg/validatormanager/proxy.go index 688d0ebdd..eb6d5a299 100644 --- a/pkg/validatormanager/proxy.go +++ b/pkg/validatormanager/proxy.go @@ -22,6 +22,7 @@ func SetupValidatorManagerAtProxy( ) (*types.Transaction, *types.Receipt, error) { return contract.TxToMethod( rpcURL, + false, proxyManagerPrivateKey, common.HexToAddress(validatorManagerSDK.ProxyAdminContractAddress), big.NewInt(0), diff --git a/pkg/validatormanager/registration.go b/pkg/validatormanager/registration.go index b457ecf4a..831cc1c6d 100644 --- a/pkg/validatormanager/registration.go +++ b/pkg/validatormanager/registration.go @@ -82,6 +82,7 @@ func InitializeValidatorRegistrationPoSNative( return contract.TxToMethod( rpcURL, + false, managerOwnerPrivateKey, managerAddress, stakeAmount, @@ -138,6 +139,7 @@ func InitializeValidatorRegistrationPoA( } return contract.TxToMethod( rpcURL, + false, managerOwnerPrivateKey, managerAddress, big.NewInt(0), @@ -322,6 +324,7 @@ func CompleteValidatorRegistration( ) (*types.Transaction, *types.Receipt, error) { return contract.TxToMethodWithWarpMessage( rpcURL, + false, privateKey, managerAddress, subnetValidatorRegistrationSignedMessage, diff --git a/pkg/validatormanager/removal.go b/pkg/validatormanager/removal.go index da3bd86bc..fa906f17a 100644 --- a/pkg/validatormanager/removal.go +++ b/pkg/validatormanager/removal.go @@ -42,6 +42,7 @@ func InitializeValidatorRemoval( if force { return contract.TxToMethod( rpcURL, + false, privateKey, managerAddress, big.NewInt(0), @@ -56,6 +57,7 @@ func InitializeValidatorRemoval( // remove PoS validator with uptime proof return contract.TxToMethodWithWarpMessage( rpcURL, + false, privateKey, managerAddress, uptimeProofSignedMessage, @@ -71,6 +73,7 @@ func InitializeValidatorRemoval( // PoA case return contract.TxToMethod( rpcURL, + false, privateKey, managerAddress, big.NewInt(0), @@ -286,6 +289,7 @@ func CompleteValidatorRemoval( ) (*types.Transaction, *types.Receipt, error) { return contract.TxToMethodWithWarpMessage( rpcURL, + false, privateKey, managerAddress, subnetValidatorRegistrationSignedMessage, diff --git a/sdk/validatormanager/root.go b/sdk/validatormanager/root.go index a3150b660..b60c7b9c8 100644 --- a/sdk/validatormanager/root.go +++ b/sdk/validatormanager/root.go @@ -283,6 +283,7 @@ func InitializeValidatorsSet( } return contract.TxToMethodWithWarpMessage( rpcURL, + false, privateKey, managerAddress, subnetConversionSignedMessage, diff --git a/sdk/validatormanager/validator_manager_poa.go b/sdk/validatormanager/validator_manager_poa.go index a9a5ba952..dee01ce04 100644 --- a/sdk/validatormanager/validator_manager_poa.go +++ b/sdk/validatormanager/validator_manager_poa.go @@ -35,6 +35,7 @@ func PoAValidatorManagerInitialize( } return contract.TxToMethod( rpcURL, + false, privateKey, managerAddress, nil, diff --git a/sdk/validatormanager/validator_manager_pos.go b/sdk/validatormanager/validator_manager_pos.go index 4e08fbf0a..d716bf8d1 100644 --- a/sdk/validatormanager/validator_manager_pos.go +++ b/sdk/validatormanager/validator_manager_pos.go @@ -46,6 +46,7 @@ func PoSValidatorManagerInitialize( return contract.TxToMethod( rpcURL, + false, privateKey, managerAddress, nil,