-
Notifications
You must be signed in to change notification settings - Fork 43
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Option to disable attempts to fix sequence mismatch during broadcasting of txs #213
Changes from 4 commits
f036da9
0fd3579
2a7da1e
b4bd99b
a9ea38c
8e00488
ca39171
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -423,7 +423,7 @@ | |
// if the account number and/or the account sequence number are zero (not set), | ||
// they will be queried for and set on the provided Factory. A new Factory with | ||
// the updated fields will be returned. | ||
func (c *chainClient) prepareFactory(clientCtx client.Context, txf tx.Factory) (tx.Factory, error) { | ||
func prepareFactory(clientCtx client.Context, txf tx.Factory) (tx.Factory, error) { | ||
from := clientCtx.GetFromAddress() | ||
|
||
if err := txf.AccountRetriever().EnsureExists(clientCtx, from); err != nil { | ||
|
@@ -605,7 +605,7 @@ | |
res, err := c.broadcastTx(c.ctx, c.txFactory, true, msgs...) | ||
|
||
if err != nil { | ||
if strings.Contains(err.Error(), "account sequence mismatch") { | ||
if c.opts.FixSeqMismatch && strings.Contains(err.Error(), "account sequence mismatch") { | ||
c.syncNonce() | ||
sequence := c.getAccSeq() | ||
c.txFactory = c.txFactory.WithSequence(sequence) | ||
|
@@ -633,7 +633,7 @@ | |
func (c *chainClient) SimulateMsg(clientCtx client.Context, msgs ...sdk.Msg) (*txtypes.SimulateResponse, error) { | ||
c.txFactory = c.txFactory.WithSequence(c.accSeq) | ||
c.txFactory = c.txFactory.WithAccountNumber(c.accNum) | ||
txf, err := c.prepareFactory(clientCtx, c.txFactory) | ||
txf, err := prepareFactory(clientCtx, c.txFactory) | ||
if err != nil { | ||
err = errors.Wrap(err, "failed to prepareFactory") | ||
return nil, err | ||
|
@@ -668,7 +668,7 @@ | |
c.txFactory = c.txFactory.WithAccountNumber(c.accNum) | ||
res, err := c.broadcastTx(c.ctx, c.txFactory, false, msgs...) | ||
if err != nil { | ||
if strings.Contains(err.Error(), "account sequence mismatch") { | ||
if c.opts.FixSeqMismatch && strings.Contains(err.Error(), "account sequence mismatch") { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar to the synchronous broadcast method, the asynchronous transaction broadcasting method now includes logic to handle sequence mismatches. This change is also not covered by tests. It's important to extend the testing suite to include scenarios that exercise the new asynchronous sequence mismatch handling logic. Ensuring comprehensive test coverage will help maintain the robustness of the transaction broadcasting feature. |
||
c.syncNonce() | ||
sequence := c.getAccSeq() | ||
c.txFactory = c.txFactory.WithSequence(sequence) | ||
|
@@ -682,13 +682,14 @@ | |
return nil, err | ||
} | ||
} | ||
|
||
return res, nil | ||
} | ||
|
||
func (c *chainClient) BuildSignedTx(clientCtx client.Context, accNum, accSeq, initialGas uint64, msgs ...sdk.Msg) ([]byte, error) { | ||
txf := NewTxFactory(clientCtx).WithSequence(accSeq).WithAccountNumber(accNum).WithGas(initialGas) | ||
return c.buildSignedTx(clientCtx, txf, msgs...) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The It's crucial to add tests for the |
||
} | ||
|
||
func (c *chainClient) buildSignedTx(clientCtx client.Context, txf tx.Factory, msgs ...sdk.Msg) ([]byte, error) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The Adding unit tests for the |
||
if clientCtx.Simulate { | ||
simTxBytes, err := txf.BuildSimTx(msgs...) | ||
if err != nil { | ||
|
@@ -709,7 +710,7 @@ | |
c.gasWanted = adjustedGas | ||
} | ||
|
||
txf, err := c.prepareFactory(clientCtx, txf) | ||
txf, err := prepareFactory(clientCtx, txf) | ||
if err != nil { | ||
return nil, errors.Wrap(err, "failed to prepareFactory") | ||
} | ||
|
@@ -800,48 +801,9 @@ | |
await bool, | ||
msgs ...sdk.Msg, | ||
) (*txtypes.BroadcastTxResponse, error) { | ||
txf, err := c.prepareFactory(clientCtx, txf) | ||
if err != nil { | ||
err = errors.Wrap(err, "failed to prepareFactory") | ||
return nil, err | ||
} | ||
ctx := context.Background() | ||
if clientCtx.Simulate { | ||
simTxBytes, err := txf.BuildSimTx(msgs...) | ||
if err != nil { | ||
err = errors.Wrap(err, "failed to build sim tx bytes") | ||
return nil, err | ||
} | ||
ctx := c.getCookie(ctx) | ||
simRes, err := c.txClient.Simulate(ctx, &txtypes.SimulateRequest{TxBytes: simTxBytes}) | ||
if err != nil { | ||
err = errors.Wrap(err, "failed to CalculateGas") | ||
return nil, err | ||
} | ||
|
||
adjustedGas := uint64(txf.GasAdjustment() * float64(simRes.GasInfo.GasUsed)) | ||
txf = txf.WithGas(adjustedGas) | ||
|
||
c.gasWanted = adjustedGas | ||
} | ||
|
||
txn, err := txf.BuildUnsignedTx(msgs...) | ||
|
||
if err != nil { | ||
err = errors.Wrap(err, "failed to BuildUnsignedTx") | ||
return nil, err | ||
} | ||
|
||
txn.SetFeeGranter(clientCtx.GetFeeGranterAddress()) | ||
err = tx.Sign(txf, clientCtx.GetFromName(), txn, true) | ||
if err != nil { | ||
err = errors.Wrap(err, "failed to Sign Tx") | ||
return nil, err | ||
} | ||
|
||
txBytes, err := clientCtx.TxConfig.TxEncoder()(txn.GetTx()) | ||
txBytes, err := c.buildSignedTx(clientCtx, txf, msgs...) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The Adding tests for the |
||
if err != nil { | ||
err = errors.Wrap(err, "failed TxEncoder to encode Tx") | ||
err = errors.Wrap(err, "failed to build signed Tx") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The error handling logic in the Consider adding tests to cover the error handling logic in the |
||
return nil, err | ||
} | ||
|
||
|
@@ -850,7 +812,7 @@ | |
Mode: txtypes.BroadcastMode_BROADCAST_MODE_SYNC, | ||
} | ||
// use our own client to broadcast tx | ||
ctx = c.getCookie(ctx) | ||
ctx := c.getCookie(context.Background()) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The use of Adding tests to verify the correct setting of metadata in the context by the |
||
res, err := c.txClient.BroadcastTx(ctx, &req) | ||
if !await || err != nil { | ||
return res, err | ||
|
@@ -925,7 +887,7 @@ | |
log.Debugln("broadcastTx with nonce", sequence) | ||
res, err := c.broadcastTx(c.ctx, c.txFactory, true, toSubmit...) | ||
if err != nil { | ||
if strings.Contains(err.Error(), "account sequence mismatch") { | ||
if c.opts.FixSeqMismatch && strings.Contains(err.Error(), "account sequence mismatch") { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The logic for handling sequence mismatches during the batch broadcast of transactions is a valuable addition. However, like the other related changes, this update lacks test coverage. Adding tests for the batch broadcast functionality, especially with the new sequence mismatch handling logic, is crucial for ensuring the reliability and correctness of this feature. |
||
c.syncNonce() | ||
sequence := c.getAccSeq() | ||
c.txFactory = c.txFactory.WithSequence(sequence) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -176,7 +176,21 @@ | |
|
||
func LoadNetwork(name string, node string) Network { | ||
switch name { | ||
|
||
case "local": | ||
return Network{ | ||
LcdEndpoint: "", | ||
TmEndpoint: "tcp://localhost:26657", | ||
ChainGrpcEndpoint: "tcp://localhost:9900", | ||
ChainStreamGrpcEndpoint: "", | ||
ExchangeGrpcEndpoint: "", | ||
ExplorerGrpcEndpoint: "", | ||
ChainId: "injective-1", | ||
Fee_denom: "inj", | ||
Name: "local-1", | ||
chainCookieAssistant: &DisabledCookieAssistant{}, | ||
exchangeCookieAssistant: &DisabledCookieAssistant{}, | ||
explorerCookieAssistant: &DisabledCookieAssistant{}, | ||
} | ||
Comment on lines
+179
to
+193
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The addition of the Would you like assistance in creating tests for this new network configuration? |
||
case "devnet-1": | ||
return Network{ | ||
LcdEndpoint: "https://devnet-1.lcd.injective.dev", | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,15 +19,18 @@ | |
} | ||
|
||
type ClientOptions struct { | ||
GasPrices string | ||
TLSCert credentials.TransportCredentials | ||
TxFactory *tx.Factory | ||
GasPrices string | ||
TLSCert credentials.TransportCredentials | ||
TxFactory *tx.Factory | ||
FixSeqMismatch bool | ||
} | ||
|
||
type ClientOption func(opts *ClientOptions) error | ||
|
||
func DefaultClientOptions() *ClientOptions { | ||
return &ClientOptions{} | ||
return &ClientOptions{ | ||
FixSeqMismatch: true, | ||
} | ||
Comment on lines
+31
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The default setting of Would you like assistance in creating tests for this new default setting? |
||
} | ||
|
||
func OptionGasPrices(gasPrices string) ClientOption { | ||
|
@@ -61,3 +64,10 @@ | |
return nil | ||
} | ||
} | ||
|
||
func OptionFixSeqMismatch(fixSeqMismatch bool) ClientOption { | ||
return func(opts *ClientOptions) error { | ||
opts.FixSeqMismatch = fixSeqMismatch | ||
return nil | ||
} | ||
Comment on lines
+68
to
+72
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The Would you like assistance in creating tests for this configuration option? |
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The logic to handle sequence mismatches during synchronous transaction broadcasting has been updated to check the
FixSeqMismatch
option. However, this change lacks test coverage.Consider adding unit tests to cover the new logic introduced for handling sequence mismatches. This will ensure the feature works as expected and will help catch any potential issues or edge cases.