From 79c37c6aaf010af517ce5fc2975c9c8caab37bae Mon Sep 17 00:00:00 2001 From: qevan Date: Mon, 8 Sep 2025 18:28:58 -0700 Subject: [PATCH] Handle builder validation errors --- action/action_test.go | 21 ++--- action/builder.go | 18 ++--- action/builder_test.go | 20 ++++- action/candidate_transfer_ownership_test.go | 3 +- action/candidateregister_test.go | 3 +- action/candidateupdate_test.go | 3 +- action/claimreward_test.go | 6 +- action/depositreward_test.go | 3 +- action/envelope_test.go | 8 +- action/execution_test.go | 9 ++- action/grantreward_test.go | 3 +- action/putpollresult_test.go | 3 +- action/rlp_tx_test.go | 8 +- action/sealedenvelope_test.go | 6 +- action/signedaction.go | 87 ++++++++++++++++----- action/stake_changecandidate_test.go | 6 +- action/stake_transferownership_test.go | 3 +- action/stakeadddeposit_test.go | 3 +- action/stakecreate_test.go | 3 +- action/stakereclaim_test.go | 6 +- action/stakerestake_test.go | 3 +- action/transfer_test.go | 9 ++- action/tx_blob_test.go | 3 +- 23 files changed, 171 insertions(+), 66 deletions(-) diff --git a/action/action_test.go b/action/action_test.go index 8fb6a00344..52d1093429 100644 --- a/action/action_test.go +++ b/action/action_test.go @@ -25,10 +25,10 @@ func TestActionProtoAndVerify(t *testing.T) { v := NewExecution("", big.NewInt(10), data) t.Run("no error", func(t *testing.T) { bd := &EnvelopeBuilder{} - elp := bd.SetGasPrice(big.NewInt(10)). + elp, err := bd.SetGasPrice(big.NewInt(10)). SetGasLimit(uint64(100000)). SetAction(v).Build() - + require.NoError(err) selp, err := Sign(elp, identityset.PrivateKey(28)) require.NoError(err) require.Equal(65, len(selp.SrcPubkey().Bytes())) @@ -45,10 +45,10 @@ func TestActionProtoAndVerify(t *testing.T) { }) t.Run("empty public key", func(t *testing.T) { bd := &EnvelopeBuilder{} - elp := bd.SetGasPrice(big.NewInt(10)). + elp, err := bd.SetGasPrice(big.NewInt(10)). SetGasLimit(uint64(100000)). SetAction(v).Build() - + require.NoError(err) selp, err := Sign(elp, identityset.PrivateKey(28)) require.NoError(err) @@ -58,10 +58,10 @@ func TestActionProtoAndVerify(t *testing.T) { }) t.Run("invalid signature", func(t *testing.T) { bd := &EnvelopeBuilder{} - elp := bd.SetGasPrice(big.NewInt(10)). + elp, err := bd.SetGasPrice(big.NewInt(10)). SetGasLimit(uint64(100000)). SetAction(v).Build() - + require.NoError(err) selp, err := Sign(elp, identityset.PrivateKey(28)) require.NoError(err) selp.signature = []byte("invalid signature") @@ -107,19 +107,22 @@ func TestIsSystemAction(t *testing.T) { require := require.New(t) builder := EnvelopeBuilder{} actClaimFromRewarding := ClaimFromRewardingFund{} - act := builder.SetAction(&actClaimFromRewarding).Build() + act, err := builder.SetAction(&actClaimFromRewarding).Build() + require.NoError(err) sel, err := Sign(act, identityset.PrivateKey(1)) require.NoError(err) require.False(IsSystemAction(sel)) actGrantReward := NewGrantReward(EpochReward, 1) - act = builder.SetAction(actGrantReward).Build() + act, err = builder.SetAction(actGrantReward).Build() + require.NoError(err) sel, err = Sign(act, identityset.PrivateKey(1)) require.NoError(err) require.True(IsSystemAction(sel)) actPollResult := NewPutPollResult(1, nil) - act = builder.SetAction(actPollResult).Build() + act, err = builder.SetAction(actPollResult).Build() + require.NoError(err) sel, err = Sign(act, identityset.PrivateKey(1)) require.NoError(err) require.True(IsSystemAction(sel)) diff --git a/action/builder.go b/action/builder.go index 4a72d7d9cb..a92f841d07 100644 --- a/action/builder.go +++ b/action/builder.go @@ -161,11 +161,11 @@ func (b *EnvelopeBuilder) SetBlobTxData( } // Build builds a new action. -func (b *EnvelopeBuilder) Build() Envelope { +func (b *EnvelopeBuilder) Build() (Envelope, error) { return b.build() } -func (b *EnvelopeBuilder) build() Envelope { +func (b *EnvelopeBuilder) build() (Envelope, error) { if b.ab.gasPrice == nil { b.ab.gasPrice = big.NewInt(0) } @@ -174,13 +174,13 @@ func (b *EnvelopeBuilder) build() Envelope { b.ab.version = version.ProtocolVersion } if err := b.ab.validateTx(); err != nil { - panic(err.Error()) + return nil, err } if b.elp.payload == nil { - panic("cannot build Envelope w/o a valid payload") + return nil, errors.New("cannot build Envelope w/o a valid payload") } b.elp.common = b.ab.convertToTx() - return &b.elp + return &b.elp, nil } // BuildTransfer loads transfer action into envelope @@ -192,7 +192,7 @@ func (b *EnvelopeBuilder) BuildTransfer(tx *types.Transaction) (Envelope, error) return nil, err } b.elp.payload = NewTransfer(tx.Value(), getRecipientAddr(tx.To()), tx.Data()) - return b.build(), nil + return b.build() } func (b *EnvelopeBuilder) setEnvelopeCommonFields(tx *types.Transaction) error { @@ -248,7 +248,7 @@ func (b *EnvelopeBuilder) BuildExecution(tx *types.Transaction) (Envelope, error return nil, err } b.elp.payload = NewExecution(getRecipientAddr(tx.To()), tx.Value(), tx.Data()) - return b.build(), nil + return b.build() } // BuildStakingAction loads staking action into envelope from abi-encoded data @@ -264,7 +264,7 @@ func (b *EnvelopeBuilder) BuildStakingAction(tx *types.Transaction) (Envelope, e return nil, err } b.elp.payload = act - return b.build(), nil + return b.build() } // BuildRewardingAction loads rewarding action into envelope from abi-encoded data @@ -280,7 +280,7 @@ func (b *EnvelopeBuilder) BuildRewardingAction(tx *types.Transaction) (Envelope, return nil, err } b.elp.payload = act - return b.build(), nil + return b.build() } func newStakingActionFromABIBinary(data []byte, value *big.Int) (actionPayload, error) { diff --git a/action/builder_test.go b/action/builder_test.go index 00e592e57f..591aa1c22d 100644 --- a/action/builder_test.go +++ b/action/builder_test.go @@ -45,6 +45,23 @@ func TestActionBuilder(t *testing.T) { r.Equal(big.NewInt(10004), act.GasPrice()) } +func TestEnvelopeBuilderBuildError(t *testing.T) { + r := require.New(t) + + b := &EnvelopeBuilder{} + // build without payload + _, err := b.Build() + r.Error(err) + + // invalid tx type + _, err = b.SetTxType(255).SetAction(&Transfer{}).Build() + r.Error(err) + + // BuildTransfer with nil recipient should return error, not panic + _, err = (&EnvelopeBuilder{}).BuildTransfer(types.NewTx(&types.LegacyTx{Nonce: 1, GasPrice: big.NewInt(1), Gas: 1})) + r.Error(err) +} + func TestBuildRewardingAction(t *testing.T) { r := require.New(t) @@ -159,8 +176,9 @@ func TestEthTxUtils(t *testing.T) { addr, err := address.FromHex("0xA576C141e5659137ddDa4223d209d4744b2106BE") r.NoError(err) act := NewClaimFromRewardingFund(big.NewInt(1), addr, []byte("any")) - elp := (&EnvelopeBuilder{}).SetNonce(100).SetGasLimit(21000). + elp, err := (&EnvelopeBuilder{}).SetNonce(100).SetGasLimit(21000). SetGasPrice(big.NewInt(101)).SetAction(act).Build() + r.NoError(err) tx, err := elp.ToEthTx(chainID, iotextypes.Encoding_ETHEREUM_EIP155) r.NoError(err) diff --git a/action/candidate_transfer_ownership_test.go b/action/candidate_transfer_ownership_test.go index cd315c188d..d44cc10724 100644 --- a/action/candidate_transfer_ownership_test.go +++ b/action/candidate_transfer_ownership_test.go @@ -71,8 +71,9 @@ func TestCandidateTransferOwnership(t *testing.T) { if err != nil { continue } - elp := (&EnvelopeBuilder{}).SetNonce(test.nonce).SetGasLimit(test.gasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(test.nonce).SetGasLimit(test.gasLimit). SetGasPrice(test.gasPrice).SetAction(cr).Build() + require.NoError(err) err = elp.SanityCheck() require.Equal(test.sanityCheck, errors.Cause(err)) if err != nil { diff --git a/action/candidateregister_test.go b/action/candidateregister_test.go index 186e46f24b..41c3670de5 100644 --- a/action/candidateregister_test.go +++ b/action/candidateregister_test.go @@ -77,8 +77,9 @@ func TestCandidateRegister(t *testing.T) { if err != nil { continue } - elp := (&EnvelopeBuilder{}).SetNonce(test.Nonce).SetGasLimit(test.GasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(test.Nonce).SetGasLimit(test.GasLimit). SetGasPrice(test.GasPrice).SetAction(cr).Build() + require.NoError(err) err = elp.SanityCheck() require.Equal(test.SanityCheck, errors.Cause(err)) if err != nil { diff --git a/action/candidateupdate_test.go b/action/candidateupdate_test.go index cacb66c3a4..9781244465 100644 --- a/action/candidateupdate_test.go +++ b/action/candidateupdate_test.go @@ -27,8 +27,9 @@ func TestCandidateUpdate(t *testing.T) { require := require.New(t) cu, err := NewCandidateUpdate(_cuName, _cuOperatorAddrStr, _cuRewardAddrStr) require.NoError(err) - elp := (&EnvelopeBuilder{}).SetNonce(_cuNonce).SetGasLimit(_cuGasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(_cuNonce).SetGasLimit(_cuGasLimit). SetGasPrice(_cuGasPrice).SetAction(cu).Build() + require.NoError(err) t.Run("proto", func(t *testing.T) { ser := cu.Serialize() require.Equal("0a04746573741229696f31636c36726c32657635646661393838716d677a673278346866617a6d7039766e326736366e671a29696f316a757678356730363365753474733833326e756b7034766763776b32676e6335637539617964", hex.EncodeToString(ser)) diff --git a/action/claimreward_test.go b/action/claimreward_test.go index c7ff274c73..db5a4c6709 100644 --- a/action/claimreward_test.go +++ b/action/claimreward_test.go @@ -47,7 +47,8 @@ func TestClaimReward(t *testing.T) { t.Run("cost", func(t *testing.T) { rc := &ClaimFromRewardingFund{} builder := (&EnvelopeBuilder{}).SetGasPrice(big.NewInt(1000000000000)) - elp := builder.SetAction(rc).Build() + elp, err := builder.SetAction(rc).Build() + r.NoError(err) cost, err := elp.Cost() r.NoError(err) r.Equal("10000000000000000", cost.String()) @@ -193,8 +194,9 @@ func TestClaimFromRewardingFund(t *testing.T) { r.NoError(c.SanityCheck()) intrinsicGas, err := c.IntrinsicGas() r.NoError(err) - elp := (&EnvelopeBuilder{}).SetGasPrice(big.NewInt(10)). + elp, err := (&EnvelopeBuilder{}).SetGasPrice(big.NewInt(10)). SetAction(c).Build() + r.NoError(err) cost, err := elp.Cost() r.NoError(err) gas := new(big.Int).SetUint64(intrinsicGas) diff --git a/action/depositreward_test.go b/action/depositreward_test.go index 363b6d221b..575ac60561 100644 --- a/action/depositreward_test.go +++ b/action/depositreward_test.go @@ -58,8 +58,9 @@ func TestDepositRewardSerialize(t *testing.T) { }) t.Run("cost", func(t *testing.T) { rp := &DepositToRewardingFund{amount: big.NewInt(100)} - elp := (&EnvelopeBuilder{}).SetGasPrice(_defaultGasPrice). + elp, err := (&EnvelopeBuilder{}).SetGasPrice(_defaultGasPrice). SetAction(rp).Build() + r.NoError(err) cost, err := elp.Cost() r.NoError(err) r.EqualValues("10000000000000100", cost.String()) diff --git a/action/envelope_test.go b/action/envelope_test.go index fecd439d6a..eed816cfb8 100644 --- a/action/envelope_test.go +++ b/action/envelope_test.go @@ -116,8 +116,9 @@ func TestEnvelope_Actions(t *testing.T) { if txtype == BlobTxType { bd.SetBlobTxData(uint256.NewInt(1), []common.Hash{}, nil) } - elp := bd.SetNonce(1).SetGasLimit(_gasLimit).SetGasPrice(_gasPrice). + elp, err := bd.SetNonce(1).SetGasLimit(_gasLimit).SetGasPrice(_gasPrice). SetTxType(txtype).SetAction(test).SetChainID(1).Build() + require.NoError(err) evlp := envelope{} require.NoError(evlp.LoadProto(elp.Proto())) require.Equal(elp.TxType(), evlp.TxType()) @@ -134,9 +135,12 @@ func createEnvelope(chainID uint32) (Envelope, *Transfer) { tsf := NewTransfer(unit.ConvertIotxToRau(1000+int64(10)), identityset.Address(10%identityset.Size()).String(), nil) - evlp := (&EnvelopeBuilder{}).SetAction(tsf).SetGasLimit(20010). + evlp, err := (&EnvelopeBuilder{}).SetAction(tsf).SetGasLimit(20010). SetGasPrice(unit.ConvertIotxToRau(11)).SetNonce(10). SetVersion(1).SetChainID(chainID).Build() + if err != nil { + panic(err) + } return evlp, tsf } diff --git a/action/execution_test.go b/action/execution_test.go index 857754cc6f..5380864e69 100644 --- a/action/execution_test.go +++ b/action/execution_test.go @@ -29,8 +29,9 @@ func TestExecutionSignVerify(t *testing.T) { require.EqualValues(66, ex.Size()) bd := &EnvelopeBuilder{} - eb := bd.SetNonce(2).SetGasLimit(100000).SetGasPrice(big.NewInt(10)). + eb, err := bd.SetNonce(2).SetGasLimit(100000).SetGasPrice(big.NewInt(10)). SetAction(ex).Build() + require.NoError(err) elp, ok := eb.(*envelope) require.True(ok) require.EqualValues(87, eb.Size()) @@ -79,7 +80,8 @@ func TestExecutionSanityCheck(t *testing.T) { t.Run("Negative gas price", func(t *testing.T) { ex := NewExecution(identityset.Address(29).String(), big.NewInt(100), []byte{}) - elp := (&EnvelopeBuilder{}).SetGasPrice(big.NewInt(-1)).SetAction(ex).Build() + elp, err := (&EnvelopeBuilder{}).SetGasPrice(big.NewInt(-1)).SetAction(ex).Build() + require.NoError(err) require.Equal(ErrNegativeValue, errors.Cause(elp.SanityCheck())) }) } @@ -125,8 +127,9 @@ func TestExecutionAccessList(t *testing.T) { identityset.Address(29).String(), big.NewInt(20), []byte("test")) - elp := (&EnvelopeBuilder{}).SetTxType(AccessListTxType).SetNonce(1).SetAccessList(v.list). + elp, err := (&EnvelopeBuilder{}).SetTxType(AccessListTxType).SetNonce(1).SetAccessList(v.list). SetGasPrice(big.NewInt(1000000)).SetGasLimit(100).SetAction(ex).Build() + require.NoError(err) require.NoError(ex1.LoadProto(ex.Proto())) require.Equal(ex, ex1) gas, err := elp.IntrinsicGas() diff --git a/action/grantreward_test.go b/action/grantreward_test.go index fe4893f335..d23541867e 100644 --- a/action/grantreward_test.go +++ b/action/grantreward_test.go @@ -32,8 +32,9 @@ func TestGrandReward(t *testing.T) { intrinsicGas, err := g.IntrinsicGas() require.NoError(err) require.Zero(intrinsicGas) - elp := (&EnvelopeBuilder{}).SetGasPrice(_defaultGasPrice). + elp, err := (&EnvelopeBuilder{}).SetGasPrice(_defaultGasPrice). SetAction(g).Build() + require.NoError(err) cost, err := elp.Cost() require.NoError(err) require.Equal(big.NewInt(0), cost) diff --git a/action/putpollresult_test.go b/action/putpollresult_test.go index 595ef5ff77..0edece067c 100644 --- a/action/putpollresult_test.go +++ b/action/putpollresult_test.go @@ -28,8 +28,9 @@ func TestPutPollResult(t *testing.T) { igas, err := r.IntrinsicGas() assert.NoError(t, err) assert.Zero(t, igas) - elp := (&EnvelopeBuilder{}).SetNonce(1).SetGasLimit(uint64(100000)). + elp, err := (&EnvelopeBuilder{}).SetNonce(1).SetGasLimit(uint64(100000)). SetAction(r).Build() + assert.NoError(t, err) cost, err := elp.Cost() assert.NoError(t, err) assert.Equal(t, big.NewInt(0), cost) diff --git a/action/rlp_tx_test.go b/action/rlp_tx_test.go index d539553625..afbb6a1138 100644 --- a/action/rlp_tx_test.go +++ b/action/rlp_tx_test.go @@ -68,7 +68,8 @@ func TestGenerateRlp(t *testing.T) { data: _signByte, }, _validSig, "", hash.BytesToHash256(MustNoErrorV(hex.DecodeString("fee3db88ee7d7defa9eded672d08fc8641f760f3a11d404a53276ad6f412b8a5")))}, } { - elp := builder.SetAction(v.act).Build() + elp, err := builder.SetAction(v.act).Build() + require.NoError(err) tx, err := elp.ToEthTx(0, iotextypes.Encoding_ETHEREUM_EIP155) if err != nil { require.Contains(err.Error(), v.err) @@ -826,7 +827,10 @@ func TestEthTxDecodeVerifyV2(t *testing.T) { } // build eth tx from test case var ( - elp = elpbuilder.SetAction(tt.action).Build() + elp, err = elpbuilder.SetAction(tt.action).Build() + ) + require.NoError(t, err) + var ( tx = MustNoErrorV(elp.ToEthTx(chainID, tt.encoding)) signer = MustNoErrorV(NewEthSigner(tt.encoding, chainID)) signature = MustNoErrorV(sk.Sign(tx.Hash().Bytes())) diff --git a/action/sealedenvelope_test.go b/action/sealedenvelope_test.go index ea65798633..816a68bcac 100644 --- a/action/sealedenvelope_test.go +++ b/action/sealedenvelope_test.go @@ -56,8 +56,9 @@ func TestSealedEnvelope_InvalidType(t *testing.T) { candidates := state.CandidateList{} r := NewPutPollResult(10001, candidates) - elp := (&EnvelopeBuilder{}).SetNonce(1).SetAction(r). + elp, err := (&EnvelopeBuilder{}).SetNonce(1).SetAction(r). SetGasLimit(100000).Build() + require.NoError(err) selp := FakeSeal(elp, identityset.PrivateKey(27).PublicKey()) selp.encoding = iotextypes.Encoding_ETHEREUM_EIP155 hash1, err := selp.envelopeHash() @@ -102,9 +103,10 @@ func TestSealedEnvelope_Actions(t *testing.T) { for _, test := range tests { bd := &EnvelopeBuilder{} - elp := bd.SetNonce(1). + elp, err := bd.SetNonce(1). SetAction(test). SetGasLimit(100000).Build() + require.NoError(err) selp := FakeSeal(elp, identityset.PrivateKey(27).PublicKey()) rlp, err := selp.ToEthTx() require.NoError(err) diff --git a/action/signedaction.go b/action/signedaction.go index 4a554321a4..30075e6241 100644 --- a/action/signedaction.go +++ b/action/signedaction.go @@ -38,7 +38,10 @@ func SignedTransfer(recipientAddr string, senderPriKey crypto.PrivateKey, nonce for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, senderPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign transfer %v", elp) @@ -57,7 +60,10 @@ func SignedExecution(contractAddr string, executorPriKey crypto.PrivateKey, nonc for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, executorPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign execution %v", elp) @@ -90,7 +96,10 @@ func SignedCandidateRegister( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, registererPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign candidate register %v", elp) @@ -119,7 +128,10 @@ func SignedCandidateUpdate( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, registererPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign candidate update %v", elp) @@ -145,7 +157,10 @@ func SignedCandidateActivate( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, registererPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign candidate selfstake %v", elp) @@ -172,7 +187,10 @@ func SignedCandidateEndorsementLegacy( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, registererPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign candidate endorsement %v", elp) @@ -202,7 +220,10 @@ func SignedCandidateEndorsement( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, registererPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign candidate endorsement %v", elp) @@ -233,7 +254,10 @@ func SignedCreateStake(nonce uint64, for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, stakerPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign create stake %v", elp) @@ -259,14 +283,20 @@ func SignedReclaimStake( for _, opt := range options { opt(bd) } - var elp Envelope + var ( + elp Envelope + err error + ) // unstake if !withdraw { us := NewUnstake(bucketIndex, payload) - elp = bd.SetAction(us).Build() + elp, err = bd.SetAction(us).Build() } else { w := NewWithdrawStake(bucketIndex, payload) - elp = bd.SetAction(w).Build() + elp, err = bd.SetAction(w).Build() + } + if err != nil { + return nil, err } selp, err := Sign(elp, reclaimerPriKey) if err != nil { @@ -295,7 +325,10 @@ func SignedChangeCandidate( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, stakerPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign change candidate %v", elp) @@ -326,7 +359,10 @@ func SignedTransferStake( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, stakerPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign transfer stake %v", elp) @@ -357,7 +393,10 @@ func SignedDepositToStake( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, depositorPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign deposit to stake %v", elp) @@ -386,7 +425,10 @@ func SignedRestake( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, restakerPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign restake %v", elp) @@ -416,7 +458,10 @@ func SignedCandidateTransferOwnership( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, senderPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign candidate transfer ownership %v", elp) @@ -441,7 +486,10 @@ func SignedMigrateStake( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, senderPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign candidate transfer ownership %v", elp) @@ -480,7 +528,10 @@ func SignedClaimReward( for _, opt := range options { opt(bd) } - elp := bd.Build() + elp, err := bd.Build() + if err != nil { + return nil, err + } selp, err := Sign(elp, senderPriKey) if err != nil { return nil, errors.Wrapf(err, "failed to sign candidate transfer ownership %v", elp) diff --git a/action/stake_changecandidate_test.go b/action/stake_changecandidate_test.go index 1a1132b856..bb655c869c 100644 --- a/action/stake_changecandidate_test.go +++ b/action/stake_changecandidate_test.go @@ -18,8 +18,9 @@ import ( func TestChangeCandidate(t *testing.T) { require := require.New(t) stake := NewChangeCandidate(_canName, _index, _payload) - elp := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). SetGasPrice(_gasPrice).SetAction(stake).Build() + require.NoError(err) t.Run("proto", func(t *testing.T) { ser := stake.Serialize() require.Equal("080a120a63616e646964617465311a077061796c6f6164", hex.EncodeToString(ser)) @@ -47,8 +48,9 @@ func TestChangeCandidate(t *testing.T) { }) t.Run("Invalid Gas Price", func(t *testing.T) { cc := NewChangeCandidate(_canName, _index, _payload) - elp := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). SetGasPrice(big.NewInt(-1)).SetAction(cc).Build() + require.NoError(err) require.Equal(ErrNegativeValue, errors.Cause(elp.SanityCheck())) }) t.Run("sign and verify", func(t *testing.T) { diff --git a/action/stake_transferownership_test.go b/action/stake_transferownership_test.go index 418f4d9611..b5e68c8170 100644 --- a/action/stake_transferownership_test.go +++ b/action/stake_transferownership_test.go @@ -12,8 +12,9 @@ func TestStakingTransfer(t *testing.T) { require := require.New(t) stake, err := NewTransferStake(_canAddress, _index, _payload) require.NoError(err) - elp := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). SetGasPrice(_gasPrice).SetAction(stake).Build() + require.NoError(err) t.Run("proto", func(t *testing.T) { ser := stake.Serialize() require.Equal("080a1229696f3178707136326177383575717a72636367397935686e727976386c64326e6b7079636333677a611a077061796c6f6164", hex.EncodeToString(ser)) diff --git a/action/stakeadddeposit_test.go b/action/stakeadddeposit_test.go index 5f24a2e72b..f38e2538d9 100644 --- a/action/stakeadddeposit_test.go +++ b/action/stakeadddeposit_test.go @@ -63,8 +63,9 @@ func TestDeposit(t *testing.T) { if err != nil { continue } - elp := (&EnvelopeBuilder{}).SetNonce(test.Nonce).SetGasLimit(test.GasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(test.Nonce).SetGasLimit(test.GasLimit). SetGasPrice(test.GasPrice).SetAction(stake).Build() + require.NoError(err) err = elp.SanityCheck() require.Equal(test.SanityCheck, errors.Cause(err)) if err != nil { diff --git a/action/stakecreate_test.go b/action/stakecreate_test.go index a7d7c00ddd..d493f10829 100644 --- a/action/stakecreate_test.go +++ b/action/stakecreate_test.go @@ -66,8 +66,9 @@ func TestCreateStake(t *testing.T) { if err != nil { continue } - elp := (&EnvelopeBuilder{}).SetNonce(test.Nonce).SetGasLimit(test.GasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(test.Nonce).SetGasLimit(test.GasLimit). SetGasPrice(test.GasPrice).SetAction(stake).Build() + require.NoError(err) err = elp.SanityCheck() require.Equal(test.SanityCheck, errors.Cause(err)) if err != nil { diff --git a/action/stakereclaim_test.go b/action/stakereclaim_test.go index e2a9e4f434..6195507f6d 100644 --- a/action/stakereclaim_test.go +++ b/action/stakereclaim_test.go @@ -30,8 +30,9 @@ var ( func TestUnstake(t *testing.T) { require := require.New(t) stake := NewUnstake(_index, _payload) - elp := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). SetGasPrice(_gasPrice).SetAction(stake).Build() + require.NoError(err) t.Run("proto", func(t *testing.T) { ser := stake.Serialize() require.Equal("080a12077061796c6f6164", hex.EncodeToString(ser)) @@ -79,8 +80,9 @@ func TestUnstake(t *testing.T) { func TestWithdraw(t *testing.T) { require := require.New(t) stake := NewWithdrawStake(_index, _payload) - elp := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). SetGasPrice(_gasPrice).SetAction(stake).Build() + require.NoError(err) t.Run("proto", func(t *testing.T) { ser := stake.Serialize() require.Equal("080a12077061796c6f6164", hex.EncodeToString(ser)) diff --git a/action/stakerestake_test.go b/action/stakerestake_test.go index 48e54ff72a..ba66228fc9 100644 --- a/action/stakerestake_test.go +++ b/action/stakerestake_test.go @@ -21,8 +21,9 @@ var ( func TestRestake(t *testing.T) { require := require.New(t) stake := NewRestake(_index, _duration, _autoStake, _payload) - elp := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). + elp, err := (&EnvelopeBuilder{}).SetNonce(_nonce).SetGasLimit(_gasLimit). SetGasPrice(_gasPrice).SetAction(stake).Build() + require.NoError(err) t.Run("proto", func(t *testing.T) { ser := stake.Serialize() require.Equal("080a10e807180122077061796c6f6164", hex.EncodeToString(ser)) diff --git a/action/transfer_test.go b/action/transfer_test.go index 3fa1616080..7d1e419bf2 100644 --- a/action/transfer_test.go +++ b/action/transfer_test.go @@ -24,8 +24,9 @@ func TestTransferSignVerify(t *testing.T) { require.EqualValues(66, tsf.Size()) bd := &EnvelopeBuilder{} - eb := bd.SetNonce(1).SetGasLimit(100000).SetGasPrice(big.NewInt(10)). + eb, err := bd.SetNonce(1).SetGasLimit(100000).SetGasPrice(big.NewInt(10)). SetAction(tsf).Build() + require.NoError(err) elp, ok := eb.(*envelope) require.True(ok) require.EqualValues(87, eb.Size()) @@ -51,8 +52,9 @@ func TestTransfer(t *testing.T) { tsf := NewTransfer(big.NewInt(10), recipientAddr.String(), []byte{}) bd := &EnvelopeBuilder{} - eb := bd.SetGasLimit(uint64(100000)).SetGasPrice(big.NewInt(10)). + eb, err := bd.SetGasLimit(uint64(100000)).SetGasPrice(big.NewInt(10)). SetAction(tsf).Build() + require.NoError(err) elp, ok := eb.(*envelope) require.True(ok) require.EqualValues(87, eb.Size()) @@ -90,8 +92,9 @@ func TestTransfer(t *testing.T) { }) t.Run("Negative gas fee", func(t *testing.T) { tsf := NewTransfer(big.NewInt(100), identityset.Address(28).String(), nil) - elp := (&EnvelopeBuilder{}).SetGasLimit(100000). + elp, err := (&EnvelopeBuilder{}).SetGasLimit(100000). SetGasPrice(big.NewInt(-1)).SetAction(tsf).Build() + require.NoError(err) require.Equal(ErrNegativeValue, errors.Cause(elp.SanityCheck())) }) } diff --git a/action/tx_blob_test.go b/action/tx_blob_test.go index c28fac44df..202ef6abff 100644 --- a/action/tx_blob_test.go +++ b/action/tx_blob_test.go @@ -99,10 +99,11 @@ func TestBlobTx(t *testing.T) { r.Equal(expect, blob) }) t.Run("build from setter", func(t *testing.T) { - tx := (&EnvelopeBuilder{}).SetTxType(BlobTxType).SetChainID(expect.ChainID()).SetNonce(expect.Nonce()). + tx, err := (&EnvelopeBuilder{}).SetTxType(BlobTxType).SetChainID(expect.ChainID()).SetNonce(expect.Nonce()). SetGasLimit(expect.Gas()).SetDynamicGas(expect.GasFeeCap(), expect.GasTipCap()). SetAccessList(expect.AccessList()).SetBlobTxData(testBlob.blobFeeCap, testBlob.blobHashes, testBlob.sidecar). SetAction(&Transfer{}).Build() + r.NoError(err) blob, ok := tx.(*envelope).common.(*BlobTx) r.True(ok) r.EqualValues(BlobTxType, blob.TxType())