[ENG-597]: Front-running Protection (#27)

This commit is contained in:
David Terpay 2023-03-16 09:38:59 -04:00 committed by GitHub
parent 560639f1e0
commit 34fef8f45b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 128 additions and 51 deletions

View File

@ -39,4 +39,7 @@ message Params {
(amino.dont_omitempty) = true,
(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
];
// front_running_protection specifies whether front running and sandwich attack protection
// is enabled.
bool front_running_protection = 6;
}

View File

@ -25,11 +25,18 @@ func (k Keeper) ValidateAuctionMsg(ctx sdk.Context, bidder sdk.AccAddress, bid s
return err
}
// Validate the bundle of transactions.
if err := k.ValidateAuctionBundle(ctx, bidder, transactions); err != nil {
// Validate the bundle of transactions if front-running protection is enabled.
protectionEnabled, err := k.FrontRunningProtectionEnabled(ctx)
if err != nil {
return err
}
if protectionEnabled {
if err := k.ValidateAuctionBundle(ctx, bidder, transactions); err != nil {
return err
}
}
return nil
}

View File

@ -21,10 +21,11 @@ func (suite *IntegrationTestSuite) TestValidateAuctionMsg() {
bid = sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(1000)))
// Auction params
maxBundleSize uint32 = 10
reserveFee = sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(1000)))
minBuyInFee = sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(1000)))
escrowAddress = sdk.AccAddress([]byte("escrow"))
maxBundleSize uint32 = 10
reserveFee = sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(1000)))
minBuyInFee = sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(1000)))
escrowAddress = sdk.AccAddress([]byte("escrow"))
frontRunningProtection = true
)
rnd := rand.New(rand.NewSource(time.Now().Unix()))
@ -114,6 +115,14 @@ func (suite *IntegrationTestSuite) TestValidateAuctionMsg() {
},
false,
},
{
"disabled front-running protection",
func() {
accounts = RandomAccounts(rnd, 10)
frontRunningProtection = false
},
true,
},
}
for _, tc := range cases {
@ -134,10 +143,11 @@ func (suite *IntegrationTestSuite) TestValidateAuctionMsg() {
suite.authorityAccount.String(),
)
params := auctiontypes.Params{
MaxBundleSize: maxBundleSize,
ReserveFee: reserveFee,
MinBuyInFee: minBuyInFee,
EscrowAccountAddress: escrowAddress.String(),
MaxBundleSize: maxBundleSize,
ReserveFee: reserveFee,
MinBuyInFee: minBuyInFee,
EscrowAccountAddress: escrowAddress.String(),
FrontRunningProtection: frontRunningProtection,
}
suite.auctionKeeper.SetParams(suite.ctx, params)

View File

@ -139,3 +139,13 @@ func (k Keeper) GetMinBidIncrement(ctx sdk.Context) (sdk.Coins, error) {
return params.MinBidIncrement, nil
}
// FrontRunningProtectionEnabled returns true if front-running protection is enabled.
func (k Keeper) FrontRunningProtectionEnabled(ctx sdk.Context) (bool, error) {
params, err := k.GetParams(ctx)
if err != nil {
return false, err
}
return params.FrontRunningProtection, nil
}

View File

@ -86,6 +86,9 @@ type Params struct {
// min_bid_increment specifies the minimum amount that the next bid must be
// greater than the previous bid.
MinBidIncrement github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,5,rep,name=min_bid_increment,json=minBidIncrement,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"min_bid_increment"`
// front_running_protection specifies whether front running and sandwich attack protection
// is enabled.
FrontRunningProtection bool `protobuf:"varint,6,opt,name=front_running_protection,json=frontRunningProtection,proto3" json:"front_running_protection,omitempty"`
}
func (m *Params) Reset() { *m = Params{} }
@ -156,6 +159,13 @@ func (m *Params) GetMinBidIncrement() github_com_cosmos_cosmos_sdk_types.Coins {
return nil
}
func (m *Params) GetFrontRunningProtection() bool {
if m != nil {
return m.FrontRunningProtection
}
return false
}
func init() {
proto.RegisterType((*GenesisState)(nil), "skipmev.pob.auction.v1.GenesisState")
proto.RegisterType((*Params)(nil), "skipmev.pob.auction.v1.Params")
@ -164,36 +174,37 @@ func init() {
func init() { proto.RegisterFile("pob/auction/v1/genesis.proto", fileDescriptor_9ed8651e43f855a1) }
var fileDescriptor_9ed8651e43f855a1 = []byte{
// 450 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x92, 0x31, 0x6f, 0x13, 0x31,
0x14, 0xc7, 0x73, 0xa4, 0x44, 0xc2, 0xa1, 0x54, 0x3d, 0x55, 0x55, 0x28, 0xc8, 0x8d, 0x3a, 0x40,
0x54, 0xa9, 0xb6, 0x52, 0x60, 0x41, 0x2c, 0x09, 0x12, 0xa8, 0x12, 0x03, 0x4a, 0x37, 0x16, 0xcb,
0xf6, 0x3d, 0x82, 0x55, 0x6c, 0x1f, 0x67, 0xdf, 0x91, 0x54, 0x7c, 0x02, 0x26, 0x3e, 0x06, 0x62,
0xea, 0xc7, 0xe8, 0xd8, 0x91, 0x09, 0x50, 0x32, 0x74, 0xe5, 0x23, 0xa0, 0xb3, 0x0f, 0xe8, 0xd0,
0x35, 0xcb, 0xdd, 0xe9, 0xfd, 0xff, 0xef, 0xfd, 0xde, 0x3b, 0xfd, 0xd1, 0xfd, 0xdc, 0x0a, 0xca,
0x4b, 0xe9, 0x95, 0x35, 0xb4, 0x1a, 0xd2, 0x29, 0x18, 0x70, 0xca, 0x91, 0xbc, 0xb0, 0xde, 0xa6,
0xdb, 0xee, 0x44, 0xe5, 0x1a, 0x2a, 0x92, 0x5b, 0x41, 0x1a, 0x17, 0xa9, 0x86, 0x3b, 0x5b, 0x53,
0x3b, 0xb5, 0xc1, 0x42, 0xeb, 0xaf, 0xe8, 0xde, 0xc1, 0xd2, 0x3a, 0x6d, 0x1d, 0x15, 0xdc, 0x01,
0xad, 0x86, 0x02, 0x3c, 0x1f, 0x52, 0x69, 0x95, 0x69, 0xf4, 0x4d, 0xae, 0x95, 0xb1, 0x34, 0x3c,
0x63, 0x69, 0xef, 0x15, 0xba, 0xfd, 0x32, 0x12, 0x8f, 0x3d, 0xf7, 0x90, 0x3e, 0x43, 0x9d, 0x9c,
0x17, 0x5c, 0xbb, 0x5e, 0xd2, 0x4f, 0x06, 0xdd, 0x43, 0x4c, 0xae, 0xdf, 0x80, 0xbc, 0x0e, 0xae,
0xf1, 0xda, 0xf9, 0x8f, 0xdd, 0xd6, 0xa4, 0xe9, 0xd9, 0xfb, 0xdd, 0x46, 0x9d, 0x28, 0xa4, 0x0f,
0xd0, 0x86, 0xe6, 0x33, 0x26, 0x4a, 0x93, 0xbd, 0x07, 0xe6, 0xd4, 0x29, 0x84, 0x89, 0xeb, 0x93,
0x75, 0xcd, 0x67, 0xe3, 0x50, 0x3d, 0x56, 0xa7, 0x90, 0x3e, 0x46, 0xdb, 0xe0, 0x64, 0x61, 0x3f,
0x32, 0x2e, 0xa5, 0x2d, 0x8d, 0x67, 0x3c, 0xcb, 0x0a, 0x70, 0xae, 0x77, 0xa3, 0x9f, 0x0c, 0x6e,
0x4d, 0xb6, 0xa2, 0x3a, 0x8a, 0xe2, 0x28, 0x6a, 0xe9, 0x07, 0xd4, 0x2d, 0xc0, 0x41, 0x51, 0x01,
0x7b, 0x0b, 0xd0, 0x6b, 0xf7, 0xdb, 0x83, 0xee, 0xe1, 0x5d, 0x12, 0xef, 0x27, 0xf5, 0xfd, 0xa4,
0xb9, 0x9f, 0x3c, 0xb7, 0xca, 0x8c, 0x9f, 0xd4, 0x6b, 0x7e, 0xfb, 0xb9, 0x3b, 0x98, 0x2a, 0xff,
0xae, 0x14, 0x44, 0x5a, 0x4d, 0x9b, 0x9f, 0x15, 0x5f, 0x07, 0x2e, 0x3b, 0xa1, 0x7e, 0x9e, 0x83,
0x0b, 0x0d, 0xee, 0xeb, 0xe5, 0xd9, 0x7e, 0x32, 0x41, 0x0d, 0xe4, 0x05, 0x40, 0x5a, 0xa2, 0x3b,
0x5a, 0x19, 0x26, 0xca, 0x39, 0x53, 0x26, 0x50, 0xd7, 0x56, 0x44, 0xed, 0x6a, 0x65, 0xc6, 0xe5,
0xfc, 0xc8, 0xd4, 0xd8, 0x4f, 0x68, 0x33, 0x60, 0x55, 0xc6, 0x94, 0x91, 0x05, 0x68, 0x30, 0xbe,
0x77, 0x73, 0x45, 0xe4, 0x8d, 0x9a, 0xac, 0xb2, 0xa3, 0xbf, 0xa0, 0xa7, 0xfd, 0xcf, 0x97, 0x67,
0xfb, 0xf7, 0xae, 0xb4, 0xcc, 0xfe, 0x65, 0xb5, 0x09, 0xc0, 0xe8, 0x7c, 0x81, 0x93, 0x8b, 0x05,
0x4e, 0x7e, 0x2d, 0x70, 0xf2, 0x65, 0x89, 0x5b, 0x17, 0x4b, 0xdc, 0xfa, 0xbe, 0xc4, 0xad, 0x37,
0x0f, 0xaf, 0xb0, 0xeb, 0x10, 0x1d, 0x68, 0xa8, 0x68, 0x9d, 0xf6, 0xff, 0x33, 0xc2, 0x02, 0xa2,
0x13, 0xa2, 0xf8, 0xe8, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x29, 0x90, 0x62, 0x0b, 0x03,
0x00, 0x00,
// 480 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x93, 0xb1, 0x6e, 0xd4, 0x30,
0x18, 0xc7, 0x2f, 0xf4, 0x38, 0x81, 0x8f, 0x52, 0x35, 0xaa, 0x4e, 0xa1, 0xa0, 0x34, 0xea, 0x00,
0x51, 0xa5, 0xda, 0xba, 0x02, 0x12, 0x42, 0x2c, 0x77, 0x48, 0xa0, 0x4a, 0x0c, 0x55, 0xba, 0xb1,
0x58, 0x4e, 0xf2, 0x35, 0x58, 0xc5, 0x76, 0x88, 0x9d, 0x70, 0x57, 0xf1, 0x04, 0x4c, 0x3c, 0x06,
0xea, 0xd4, 0xc7, 0xe8, 0xd8, 0x91, 0x09, 0xd0, 0xdd, 0xd0, 0xd7, 0x40, 0xb1, 0x43, 0xe9, 0xc0,
0xda, 0x25, 0x89, 0xfc, 0xfb, 0xec, 0xdf, 0xf7, 0x45, 0x7f, 0xa3, 0x47, 0xa5, 0x4a, 0x09, 0xab,
0x33, 0xc3, 0x95, 0x24, 0xcd, 0x98, 0x14, 0x20, 0x41, 0x73, 0x8d, 0xcb, 0x4a, 0x19, 0xe5, 0x8f,
0xf4, 0x31, 0x2f, 0x05, 0x34, 0xb8, 0x54, 0x29, 0xee, 0xaa, 0x70, 0x33, 0xde, 0xdc, 0x28, 0x54,
0xa1, 0x6c, 0x09, 0x69, 0xbf, 0x5c, 0xf5, 0x66, 0x98, 0x29, 0x2d, 0x94, 0x26, 0x29, 0xd3, 0x40,
0x9a, 0x71, 0x0a, 0x86, 0x8d, 0x49, 0xa6, 0xb8, 0xec, 0xf8, 0x3a, 0x13, 0x5c, 0x2a, 0x62, 0x9f,
0x6e, 0x69, 0xfb, 0x1d, 0xba, 0xf7, 0xd6, 0x19, 0x0f, 0x0d, 0x33, 0xe0, 0xbf, 0x42, 0x83, 0x92,
0x55, 0x4c, 0xe8, 0xc0, 0x8b, 0xbc, 0x78, 0xb8, 0x17, 0xe2, 0xff, 0x77, 0x80, 0x0f, 0x6c, 0xd5,
0xb4, 0x7f, 0xfe, 0x73, 0xab, 0x97, 0x74, 0x7b, 0xb6, 0x4f, 0xfb, 0x68, 0xe0, 0x80, 0xff, 0x18,
0xad, 0x09, 0x36, 0xa3, 0x69, 0x2d, 0xf3, 0x8f, 0x40, 0x35, 0x3f, 0x01, 0x7b, 0xe2, 0x6a, 0xb2,
0x2a, 0xd8, 0x6c, 0x6a, 0x57, 0x0f, 0xf9, 0x09, 0xf8, 0xcf, 0xd0, 0x08, 0x74, 0x56, 0xa9, 0xcf,
0x94, 0x65, 0x99, 0xaa, 0xa5, 0xa1, 0x2c, 0xcf, 0x2b, 0xd0, 0x3a, 0xb8, 0x15, 0x79, 0xf1, 0xdd,
0x64, 0xc3, 0xd1, 0x89, 0x83, 0x13, 0xc7, 0xfc, 0x4f, 0x68, 0x58, 0x81, 0x86, 0xaa, 0x01, 0x7a,
0x04, 0x10, 0xac, 0x44, 0x2b, 0xf1, 0x70, 0xef, 0x01, 0x76, 0xf3, 0xe3, 0x76, 0x7e, 0xdc, 0xcd,
0x8f, 0x5f, 0x2b, 0x2e, 0xa7, 0xcf, 0xdb, 0x36, 0x4f, 0x7f, 0x6d, 0xc5, 0x05, 0x37, 0x1f, 0xea,
0x14, 0x67, 0x4a, 0x90, 0xee, 0x67, 0xb9, 0xd7, 0xae, 0xce, 0x8f, 0x89, 0x99, 0x97, 0xa0, 0xed,
0x06, 0xfd, 0xfd, 0xf2, 0x6c, 0xc7, 0x4b, 0x50, 0x27, 0x79, 0x03, 0xe0, 0xd7, 0xe8, 0xbe, 0xe0,
0x92, 0xa6, 0xf5, 0x9c, 0x72, 0x69, 0xad, 0xfd, 0x1b, 0xb2, 0x0e, 0x05, 0x97, 0xd3, 0x7a, 0xbe,
0x2f, 0x5b, 0xed, 0x17, 0xb4, 0x6e, 0xb5, 0x3c, 0xa7, 0x5c, 0x66, 0x15, 0x08, 0x90, 0x26, 0xb8,
0x7d, 0x43, 0xe6, 0xb5, 0xd6, 0xcc, 0xf3, 0xfd, 0xbf, 0x22, 0xff, 0x05, 0x0a, 0x8e, 0x2a, 0x25,
0x0d, 0xad, 0x6a, 0x29, 0xb9, 0x2c, 0x68, 0x9b, 0x1a, 0xb0, 0x21, 0x08, 0x06, 0x91, 0x17, 0xdf,
0x49, 0x46, 0x96, 0x27, 0x0e, 0x1f, 0x5c, 0xd1, 0x97, 0xd1, 0xd7, 0xcb, 0xb3, 0x9d, 0x87, 0xd7,
0x64, 0xb3, 0xab, 0x94, 0x77, 0xd1, 0x99, 0x9c, 0x2f, 0x42, 0xef, 0x62, 0x11, 0x7a, 0xbf, 0x17,
0xa1, 0xf7, 0x6d, 0x19, 0xf6, 0x2e, 0x96, 0x61, 0xef, 0xc7, 0x32, 0xec, 0xbd, 0x7f, 0x72, 0xad,
0xeb, 0x36, 0x7e, 0xbb, 0x02, 0x1a, 0xd2, 0xde, 0x93, 0x7f, 0x67, 0xd8, 0xd6, 0xd3, 0x81, 0x0d,
0xf1, 0xd3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x96, 0x16, 0x18, 0xc6, 0x45, 0x03, 0x00, 0x00,
}
func (m *GenesisState) Marshal() (dAtA []byte, err error) {
@ -249,6 +260,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.FrontRunningProtection {
i--
if m.FrontRunningProtection {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x30
}
if len(m.MinBidIncrement) > 0 {
for iNdEx := len(m.MinBidIncrement) - 1; iNdEx >= 0; iNdEx-- {
{
@ -359,6 +380,9 @@ func (m *Params) Size() (n int) {
n += 1 + l + sovGenesis(uint64(l))
}
}
if m.FrontRunningProtection {
n += 2
}
return n
}
@ -633,6 +657,26 @@ func (m *Params) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 6:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field FrontRunningProtection", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenesis
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.FrontRunningProtection = bool(v != 0)
default:
iNdEx = preIndex
skippy, err := skipGenesis(dAtA[iNdEx:])

View File

@ -7,21 +7,23 @@ import (
)
var (
DefaultMaxBundleSize uint32 = 2
DefaultEscrowAccountAddress string
DefaultReserveFee = sdk.Coins{}
DefaultMinBuyInFee = sdk.Coins{}
DefaultMinBidIncrement = sdk.Coins{}
DefaultMaxBundleSize uint32 = 2
DefaultEscrowAccountAddress string
DefaultReserveFee = sdk.Coins{}
DefaultMinBuyInFee = sdk.Coins{}
DefaultMinBidIncrement = sdk.Coins{}
DefaultFrontRunningProtection = true
)
// NewParams returns a new Params instance with the provided values.
func NewParams(maxBundleSize uint32, escrowAccountAddress string, reserveFee, minBuyInFee, minBidIncrement sdk.Coins) Params {
func NewParams(maxBundleSize uint32, escrowAccountAddress string, reserveFee, minBuyInFee, minBidIncrement sdk.Coins, frontRunningProtection bool) Params {
return Params{
MaxBundleSize: maxBundleSize,
EscrowAccountAddress: escrowAccountAddress,
ReserveFee: reserveFee,
MinBuyInFee: minBuyInFee,
MinBidIncrement: minBidIncrement,
MaxBundleSize: maxBundleSize,
EscrowAccountAddress: escrowAccountAddress,
ReserveFee: reserveFee,
MinBuyInFee: minBuyInFee,
MinBidIncrement: minBidIncrement,
FrontRunningProtection: frontRunningProtection,
}
}
@ -33,6 +35,7 @@ func DefaultParams() Params {
DefaultReserveFee,
DefaultMinBuyInFee,
DefaultMinBidIncrement,
DefaultFrontRunningProtection,
)
}