-
Notifications
You must be signed in to change notification settings - Fork 114
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
[CT-520] Validatebasic for new MsgBatchCancel #1101
Changes from 1 commit
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 |
---|---|---|
@@ -0,0 +1,54 @@ | ||
package types | ||
|
||
import ( | ||
errorsmod "cosmossdk.io/errors" | ||
|
||
sdk "github.com/cosmos/cosmos-sdk/types" | ||
types "github.com/dydxprotocol/v4-chain/protocol/x/subaccounts/types" | ||
) | ||
|
||
var _ sdk.Msg = &MsgBatchCancel{} | ||
|
||
// NewMsgCancelOrderShortTerm constructs a MsgBatchCancel from an `OrderId` and a `GoodTilBlock`. | ||
func NewMsgBatchCancel(subaccountId types.SubaccountId, cancelBatch []OrderBatch, goodTilBlock uint32) *MsgBatchCancel { | ||
return &MsgBatchCancel{ | ||
SubaccountId: subaccountId, | ||
ShortTermCancels: cancelBatch, | ||
GoodTilBlock: goodTilBlock, | ||
} | ||
} | ||
|
||
// ValidateBasic performs stateless validation for | ||
func (msg *MsgBatchCancel) ValidateBasic() (err 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. so ValidateBasic is actually optional as of v0.50 - I think it's still supported for backwards compatibility but can you maybe spend 10-15 minutes to see how it works w/ the new version and what was the motivation? kind of curious about this 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. just wondering if transactions that are obviously wrong (e.g. failing ValidateBasic) can now enter mempool and be included in a block 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. Seems like they have moved all validation to the msg server. Example PRS Based on this comment |
||
subaccountId := msg.GetSubaccountId() | ||
if err := subaccountId.Validate(); err != nil { | ||
return err | ||
} | ||
|
||
cancelBatches := msg.GetShortTermCancels() | ||
totalNumberCancels := 0 | ||
for _, cancelBatch := range cancelBatches { | ||
totalNumberCancels += len(cancelBatch.GetClientIds()) | ||
seenClientIds := map[uint32]struct{}{} | ||
for _, clientId := range cancelBatch.GetClientIds() { | ||
if _, seen := seenClientIds[clientId]; seen { | ||
return errorsmod.Wrapf( | ||
ErrInvalidBatchCancel, | ||
"Batch cancel cannot have duplicate cancels. Duplicate clob pair id: %+v, client id: %+v", | ||
cancelBatch.GetClobPairId(), | ||
clientId, | ||
) | ||
} | ||
seenClientIds[clientId] = struct{}{} | ||
} | ||
} | ||
if uint32(totalNumberCancels) > MaxMsgBatchCancelBatchSize { | ||
return errorsmod.Wrapf( | ||
ErrInvalidBatchCancel, | ||
"Batch cancel cannot have over %+v orders. Order count: %+v", | ||
MaxMsgBatchCancelBatchSize, | ||
totalNumberCancels, | ||
) | ||
} | ||
return nil | ||
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
Overall, the method is logically sound but could benefit from minor refinements for clarity and maintainability. |
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
package types_test | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/dydxprotocol/v4-chain/protocol/testutil/constants" | ||
"github.com/dydxprotocol/v4-chain/protocol/x/clob/types" | ||
satypes "github.com/dydxprotocol/v4-chain/protocol/x/subaccounts/types" | ||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestMsgBatchCancel_ValidateBasic(t *testing.T) { | ||
oneOverMax := []uint32{} | ||
for i := uint32(0); i < types.MaxMsgBatchCancelBatchSize+1; i++ { | ||
oneOverMax = append(oneOverMax, i) | ||
} | ||
|
||
tests := map[string]struct { | ||
msg types.MsgBatchCancel | ||
err error | ||
}{ | ||
"invalid subaccount": { | ||
msg: *types.NewMsgBatchCancel( | ||
constants.InvalidSubaccountIdNumber, | ||
[]types.OrderBatch{ | ||
{ | ||
ClobPairId: 0, | ||
ClientIds: []uint32{ | ||
0, 1, 2, 3, | ||
}, | ||
}, | ||
}, | ||
10, | ||
), | ||
err: satypes.ErrInvalidSubaccountIdNumber, | ||
}, | ||
"over 100 cancels in for one clob pair id": { | ||
msg: *types.NewMsgBatchCancel( | ||
constants.Alice_Num0, | ||
[]types.OrderBatch{ | ||
{ | ||
ClobPairId: 0, | ||
ClientIds: oneOverMax, | ||
}, | ||
}, | ||
10, | ||
), | ||
err: types.ErrInvalidBatchCancel, | ||
}, | ||
"over 100 cancels split over two clob pair id": { | ||
msg: *types.NewMsgBatchCancel( | ||
constants.Alice_Num0, | ||
[]types.OrderBatch{ | ||
{ | ||
ClobPairId: 0, | ||
ClientIds: oneOverMax[:52], | ||
jonfung-dydx marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}, | ||
{ | ||
ClobPairId: 1, | ||
ClientIds: oneOverMax[:52], | ||
}, | ||
}, | ||
10, | ||
), | ||
err: types.ErrInvalidBatchCancel, | ||
}, | ||
"success: two clob pair id, 100 cancels": { | ||
msg: *types.NewMsgBatchCancel( | ||
constants.Alice_Num0, | ||
[]types.OrderBatch{ | ||
{ | ||
ClobPairId: 0, | ||
ClientIds: oneOverMax[:50], | ||
jonfung-dydx marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}, | ||
{ | ||
ClobPairId: 1, | ||
ClientIds: oneOverMax[:50], | ||
}, | ||
}, | ||
10, | ||
), | ||
err: nil, | ||
}, | ||
"success: one clob pair id, 100 cancels": { | ||
msg: *types.NewMsgBatchCancel( | ||
constants.Alice_Num0, | ||
[]types.OrderBatch{ | ||
{ | ||
ClobPairId: 0, | ||
ClientIds: oneOverMax[:types.MaxMsgBatchCancelBatchSize], | ||
}, | ||
}, | ||
10, | ||
), | ||
err: nil, | ||
}, | ||
"duplicate clob pair ids": { | ||
msg: *types.NewMsgBatchCancel( | ||
constants.Alice_Num0, | ||
[]types.OrderBatch{ | ||
{ | ||
ClobPairId: 0, | ||
ClientIds: []uint32{ | ||
0, 1, 2, 3, 1, | ||
}, | ||
}, | ||
}, | ||
10, | ||
), | ||
err: types.ErrInvalidBatchCancel, | ||
}, | ||
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. add cases where |
||
} | ||
for name, tc := range tests { | ||
t.Run(name, func(t *testing.T) { | ||
err := tc.msg.ValidateBasic() | ||
if tc.err != nil { | ||
require.ErrorIs(t, err, tc.err) | ||
return | ||
} | ||
require.NoError(t, err) | ||
}) | ||
} | ||
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 test cases in
Overall, the tests are well-structured and effectively validate the functionality of |
||
} |
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 constructor
NewMsgBatchCancel
is well-defined, correctly initializing aMsgBatchCancel
instance. However, the parameter namecancelBatch
might be misleading as it suggests a single batch, whereas it represents multiple batches. Consider renaming it tocancelBatches
for clarity.Committable suggestion