forked from dydxprotocol/v4-chain
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[CT-647] construct the initial orderbook snapshot (dydxprotocol#1147)
* [CT-647] construct the initial orderbook snapshot * [CT-647] initialize new streams and send orderbook snapshot (dydxprotocol#1152) * [CT-647] initialize new streams and send orderbook snapshot * use sync once * comments Signed-off-by: Eric <eric.warehime@gmail.com>
- Loading branch information
1 parent
c67a3c6
commit b7942b3
Showing
12 changed files
with
271 additions
and
8 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package memclob | ||
|
||
import ( | ||
sdk "github.com/cosmos/cosmos-sdk/types" | ||
"github.com/dydxprotocol/v4-chain/protocol/indexer/off_chain_updates" | ||
"github.com/dydxprotocol/v4-chain/protocol/lib" | ||
"github.com/dydxprotocol/v4-chain/protocol/x/clob/types" | ||
) | ||
|
||
// GetOffchainUpdatesForOrderbookSnapshot returns the offchain updates for the orderbook snapshot. | ||
// This is used by the gRPC streaming server to send the orderbook snapshot to the client. | ||
func (m *MemClobPriceTimePriority) GetOffchainUpdatesForOrderbookSnapshot( | ||
ctx sdk.Context, | ||
clobPairId types.ClobPairId, | ||
) (offchainUpdates *types.OffchainUpdates) { | ||
offchainUpdates = types.NewOffchainUpdates() | ||
|
||
if orderbook, exists := m.openOrders.orderbooksMap[clobPairId]; exists { | ||
// Generate the offchain updates for buy orders. | ||
// Updates are sorted in descending order of price. | ||
buyPriceLevels := lib.GetSortedKeys[lib.Sortable[types.Subticks]](orderbook.Bids) | ||
for i := len(buyPriceLevels) - 1; i >= 0; i-- { | ||
subticks := buyPriceLevels[i] | ||
level := orderbook.Bids[subticks] | ||
|
||
// For each price level, generate offchain updates for each order in the level. | ||
level.LevelOrders.Front.Each( | ||
func(order types.ClobOrder) { | ||
offchainUpdates.Append( | ||
m.GetOffchainUpdatesForOrder(ctx, order.Order), | ||
) | ||
}, | ||
) | ||
} | ||
|
||
// Generate the offchain updates for sell orders. | ||
// Updates are sorted in ascending order of price. | ||
sellPriceLevels := lib.GetSortedKeys[lib.Sortable[types.Subticks]](orderbook.Asks) | ||
for i := 0; i < len(sellPriceLevels); i++ { | ||
subticks := sellPriceLevels[i] | ||
level := orderbook.Asks[subticks] | ||
|
||
// For each price level, generate offchain updates for each order in the level. | ||
level.LevelOrders.Front.Each( | ||
func(order types.ClobOrder) { | ||
offchainUpdates.Append( | ||
m.GetOffchainUpdatesForOrder(ctx, order.Order), | ||
) | ||
}, | ||
) | ||
} | ||
} | ||
|
||
return offchainUpdates | ||
} | ||
|
||
// GetOffchainUpdatesForOrder returns a place order offchain message and | ||
// a update order offchain message used to construct an order for | ||
// the orderbook snapshot grpc stream. | ||
func (m *MemClobPriceTimePriority) GetOffchainUpdatesForOrder( | ||
ctx sdk.Context, | ||
order types.Order, | ||
) (offchainUpdates *types.OffchainUpdates) { | ||
offchainUpdates = types.NewOffchainUpdates() | ||
orderId := order.OrderId | ||
|
||
// Generate a order place message. | ||
if message, success := off_chain_updates.CreateOrderPlaceMessage( | ||
ctx, | ||
order, | ||
); success { | ||
offchainUpdates.AddPlaceMessage(orderId, message) | ||
} | ||
|
||
// Get the current fill amount of the order. | ||
fillAmount := m.GetOrderFilledAmount(ctx, orderId) | ||
|
||
// Generate an update message updating the total filled amount of order. | ||
if message, success := off_chain_updates.CreateOrderUpdateMessage( | ||
ctx, | ||
orderId, | ||
fillAmount, | ||
); success { | ||
offchainUpdates.AddUpdateMessage(orderId, message) | ||
} | ||
|
||
return offchainUpdates | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
package memclob | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/dydxprotocol/v4-chain/protocol/mocks" | ||
"github.com/dydxprotocol/v4-chain/protocol/testutil/constants" | ||
sdktest "github.com/dydxprotocol/v4-chain/protocol/testutil/sdk" | ||
"github.com/dydxprotocol/v4-chain/protocol/x/clob/types" | ||
satypes "github.com/dydxprotocol/v4-chain/protocol/x/subaccounts/types" | ||
"github.com/stretchr/testify/mock" | ||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestGetOffchainUpdatesForOrderbookSnapshot_Buy(t *testing.T) { | ||
ctx, _, _ := sdktest.NewSdkContextWithMultistore() | ||
|
||
clobKeeper := &mocks.MemClobKeeper{} | ||
clobKeeper.On( | ||
"GetOrderFillAmount", | ||
mock.Anything, | ||
mock.Anything, | ||
).Return(false, satypes.BaseQuantums(0), uint32(0)) | ||
|
||
memclob := NewMemClobPriceTimePriority(false) | ||
memclob.SetClobKeeper(clobKeeper) | ||
|
||
memclob.CreateOrderbook(ctx, constants.ClobPair_Btc) | ||
|
||
orders := []types.Order{ | ||
constants.Order_Alice_Num0_Id1_Clob0_Buy15_Price10_GTB18_PO, | ||
constants.Order_Alice_Num0_Id0_Clob0_Buy10_Price10_GTB16, | ||
constants.Order_Bob_Num0_Id12_Clob0_Buy5_Price40_GTB20, | ||
} | ||
|
||
for _, order := range orders { | ||
memclob.mustAddOrderToOrderbook(ctx, order, false) | ||
} | ||
|
||
offchainUpdates := memclob.GetOffchainUpdatesForOrderbookSnapshot( | ||
ctx, | ||
constants.ClobPair_Btc.GetClobPairId(), | ||
) | ||
|
||
expected := types.NewOffchainUpdates() | ||
// Buy orders are in descending order. | ||
expected.Append(memclob.GetOffchainUpdatesForOrder(ctx, orders[2])) | ||
expected.Append(memclob.GetOffchainUpdatesForOrder(ctx, orders[0])) | ||
expected.Append(memclob.GetOffchainUpdatesForOrder(ctx, orders[1])) | ||
|
||
require.Equal(t, expected, offchainUpdates) | ||
} | ||
|
||
func TestGetOffchainUpdatesForOrderbookSnapshot_Sell(t *testing.T) { | ||
ctx, _, _ := sdktest.NewSdkContextWithMultistore() | ||
|
||
clobKeeper := &mocks.MemClobKeeper{} | ||
clobKeeper.On( | ||
"GetOrderFillAmount", | ||
mock.Anything, | ||
mock.Anything, | ||
).Return(false, satypes.BaseQuantums(0), uint32(0)) | ||
|
||
memclob := NewMemClobPriceTimePriority(false) | ||
memclob.SetClobKeeper(clobKeeper) | ||
|
||
memclob.CreateOrderbook(ctx, constants.ClobPair_Btc) | ||
|
||
orders := []types.Order{ | ||
constants.Order_Bob_Num0_Id12_Clob0_Sell20_Price35_GTB32, | ||
constants.Order_Alice_Num0_Id0_Clob0_Sell5_Price10_GTB20, | ||
constants.Order_Alice_Num0_Id1_Clob0_Sell15_Price10_GTB18_PO, | ||
} | ||
|
||
for _, order := range orders { | ||
memclob.mustAddOrderToOrderbook(ctx, order, false) | ||
} | ||
|
||
offchainUpdates := memclob.GetOffchainUpdatesForOrderbookSnapshot( | ||
ctx, | ||
constants.ClobPair_Btc.GetClobPairId(), | ||
) | ||
|
||
expected := types.NewOffchainUpdates() | ||
// Sell orders are in ascending order. | ||
expected.Append(memclob.GetOffchainUpdatesForOrder(ctx, orders[1])) | ||
expected.Append(memclob.GetOffchainUpdatesForOrder(ctx, orders[2])) | ||
expected.Append(memclob.GetOffchainUpdatesForOrder(ctx, orders[0])) | ||
|
||
require.Equal(t, expected, offchainUpdates) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters