Skip to content
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

Add Vortex Deposit to Loadtest #699

Merged
merged 8 commits into from
Apr 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions loadtest/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@
"wasm_msg_types": {
"wasm_mint_nft": {
"contract_address": "sei1k83mp2vdgk57rgyuzrmm8yhume44lwtwmku5a7v3waanqe0qxkvssfjfvj"
},
"vortex": {
"contract_address": "sei12k3aacdygvjuran5hz60067pgu2uuuscz3styw2zk3q4aedj0v2sjq3tsj",
"num_orders_per_tx": 1
}
},
"contract_distribution": [
Expand Down
4 changes: 2 additions & 2 deletions loadtest/loadtest_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,9 @@ func (c *LoadTestClient) BuildTxs() (workgroups []*sync.WaitGroup, sendersList [
accountKeyPath := c.SignerClient.GetTestAccountKeyPath(uint64(account))
key := c.SignerClient.GetKey(accountIdentifier, "test", accountKeyPath)

msg, failureExpected, signer, gas, fee := c.generateMessage(config, key, config.MsgsPerTx)
msgs, failureExpected, signer, gas, fee := c.generateMessage(config, key, config.MsgsPerTx)
txBuilder := TestConfig.TxConfig.NewTxBuilder()
_ = txBuilder.SetMsgs(msg)
_ = txBuilder.SetMsgs(msgs...)
seqDelta := uint64(i / 2)
mode := typestx.BroadcastMode_BROADCAST_MODE_SYNC
if j == len(activeAccounts)-1 {
Expand Down
126 changes: 97 additions & 29 deletions loadtest/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ func (c *LoadTestClient) getRandomMessageType(messageTypes []string) string {
return messageType
}

func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey, msgPerTx uint64) (sdk.Msg, bool, cryptotypes.PrivKey, uint64, int64) {
var msg sdk.Msg
func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey, msgPerTx uint64) ([]sdk.Msg, bool, cryptotypes.PrivKey, uint64, int64) {
var msgs []sdk.Msg
messageTypes := strings.Split(config.MessageType, ",")
messageType := c.getRandomMessageType(messageTypes)
fmt.Printf("Message type: %s\n", messageType)
Expand All @@ -136,6 +136,10 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
}

switch messageType {
case Vortex:
price := config.PriceDistr.Sample()
quantity := config.QuantityDistr.Sample()
msgs = c.generateVortexOrder(config, key, config.WasmMsgTypes.Vortex.NumOrdersPerTx, price, quantity)
case WasmMintNft:
contract := config.WasmMsgTypes.MintNftType.ContractAddr
// TODO: Potentially just hard code the Funds amount here
Expand All @@ -145,31 +149,31 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
if err != nil {
panic(err)
}
msg = &wasmtypes.MsgExecuteContract{
msgs = []sdk.Msg{&wasmtypes.MsgExecuteContract{
Sender: sdk.AccAddress(key.PubKey().Address()).String(),
Contract: contract,
Msg: wasmtypes.RawContractMessage([]byte("{\"mint\":{\"owner\": \"sei1a27kj2j27c6uz58rn9zmhcjee9s3h3nhyhtvjj\"}}")),
Funds: amount,
}
}}
case Bank:
msg = &banktypes.MsgSend{
msgs = []sdk.Msg{&banktypes.MsgSend{
FromAddress: sdk.AccAddress(key.PubKey().Address()).String(),
ToAddress: sdk.AccAddress(key.PubKey().Address()).String(),
Amount: sdk.NewCoins(sdk.Coin{
Denom: "usei",
Amount: sdk.NewInt(1),
}),
}
}}
case DistributeRewards:
adminKey := c.SignerClient.GetAdminKey()
msg = &banktypes.MsgSend{
msgs = []sdk.Msg{&banktypes.MsgSend{
FromAddress: sdk.AccAddress(adminKey.PubKey().Address()).String(),
ToAddress: sdk.AccAddress(key.PubKey().Address()).String(),
Amount: sdk.NewCoins(sdk.Coin{
Denom: "usei",
Amount: sdk.NewInt(10000000),
}),
}
}}
signer = adminKey
gas = 10000000
fee = 1000000
Expand All @@ -182,10 +186,10 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
if err != nil {
panic(err.Error())
}
msg = distributiontypes.NewMsgWithdrawDelegatorReward(
msgs = []sdk.Msg{distributiontypes.NewMsgWithdrawDelegatorReward(
delegatorAddr,
randomValidatorAddr,
)
)}
fmt.Printf("Collecting rewards from %s \n", operatorAddress)
signer = adminKey
gas = 10000000
Expand All @@ -199,12 +203,12 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
if err != nil {
panic(err)
}
msg = &dextypes.MsgPlaceOrders{
msgs = []sdk.Msg{&dextypes.MsgPlaceOrders{
Creator: sdk.AccAddress(key.PubKey().Address()).String(),
Orders: orderPlacements,
ContractAddr: contract,
Funds: amount,
}
}}
case Staking:
delegatorAddr := sdk.AccAddress(key.PubKey().Address()).String()
chosenValidator := c.Validators[rand.Intn(len(c.Validators))].OperatorAddress
Expand All @@ -217,7 +221,7 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
srcAddr = k
break
}
msg = c.generateStakingMsg(delegatorAddr, chosenValidator, srcAddr)
msgs = []sdk.Msg{c.generateStakingMsg(delegatorAddr, chosenValidator, srcAddr)}
case Tokenfactory:
denomCreatorAddr := sdk.AccAddress(key.PubKey().Address()).String()
// No denoms, let's mint
Expand All @@ -227,21 +231,21 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
case !ok || randNum <= 0.33:
subDenom := fmt.Sprintf("tokenfactory-created-denom-%d", time.Now().UnixMilli())
denom = fmt.Sprintf("factory/%s/%s", denomCreatorAddr, subDenom)
msg = &tokenfactorytypes.MsgCreateDenom{
msgs = []sdk.Msg{&tokenfactorytypes.MsgCreateDenom{
Sender: denomCreatorAddr,
Subdenom: subDenom,
}
}}
c.TokenFactoryDenomOwner[denomCreatorAddr] = denom
case randNum <= 0.66:
msg = &tokenfactorytypes.MsgMint{
msgs = []sdk.Msg{&tokenfactorytypes.MsgMint{
Sender: denomCreatorAddr,
Amount: sdk.Coin{Denom: denom, Amount: sdk.NewInt(10)},
}
}}
default:
msg = &tokenfactorytypes.MsgBurn{
msgs = []sdk.Msg{&tokenfactorytypes.MsgBurn{
Sender: denomCreatorAddr,
Amount: sdk.Coin{Denom: denom, Amount: sdk.NewInt(1)},
}
}}
}
case FailureBankMalformed:
var denom string
Expand All @@ -250,25 +254,25 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
} else {
denom = "other"
}
msg = &banktypes.MsgSend{
msgs = []sdk.Msg{&banktypes.MsgSend{
FromAddress: sdk.AccAddress(key.PubKey().Address()).String(),
ToAddress: sdk.AccAddress(key.PubKey().Address()).String(),
Amount: sdk.NewCoins(sdk.Coin{
Denom: denom,
Amount: sdk.NewInt(1),
}),
}
}}
case FailureBankInvalid:
var amountUsei int64
amountUsei = 1000000000000000000
msg = &banktypes.MsgSend{
msgs = []sdk.Msg{&banktypes.MsgSend{
FromAddress: sdk.AccAddress(key.PubKey().Address()).String(),
ToAddress: sdk.AccAddress(key.PubKey().Address()).String(),
Amount: sdk.NewCoins(sdk.Coin{
Denom: "usei",
Amount: sdk.NewInt(amountUsei),
}),
}
}}
case FailureDexMalformed:
price := config.PriceDistr.InvalidSample()
quantity := config.QuantityDistr.InvalidSample()
Expand All @@ -278,12 +282,12 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
if err != nil {
panic(err)
}
msg = &dextypes.MsgPlaceOrders{
msgs = []sdk.Msg{&dextypes.MsgPlaceOrders{
Creator: sdk.AccAddress(key.PubKey().Address()).String(),
Orders: orderPlacements,
ContractAddr: contract,
Funds: amount,
}
}}
case FailureDexInvalid:
price := config.PriceDistr.Sample()
quantity := config.QuantityDistr.Sample()
Expand All @@ -299,21 +303,21 @@ func (c *LoadTestClient) generateMessage(config Config, key cryptotypes.PrivKey,
if err != nil {
panic(err)
}
msg = &dextypes.MsgPlaceOrders{
msgs = []sdk.Msg{&dextypes.MsgPlaceOrders{
Creator: sdk.AccAddress(key.PubKey().Address()).String(),
Orders: orderPlacements,
ContractAddr: contract,
Funds: amount,
}
}}

default:
fmt.Printf("Unrecognized message type %s", config.MessageType)
}

if strings.Contains(config.MessageType, "failure") {
return msg, true, signer, gas, int64(fee)
return msgs, true, signer, gas, int64(fee)
}
return msg, false, signer, gas, int64(fee)
return msgs, false, signer, gas, int64(fee)
}

func sampleDexOrderType(config Config) (orderType dextypes.OrderType) {
Expand Down Expand Up @@ -409,6 +413,70 @@ func (c *LoadTestClient) generateStakingMsg(delegatorAddr string, chosenValidato
return msg
}

// generateVortexOrder generates Vortex order messages. If short order, creates a deposit message first
func (c *LoadTestClient) generateVortexOrder(config Config, key cryptotypes.PrivKey, numOrders int64, price sdk.Dec, quantity sdk.Dec) []sdk.Msg {
var msgs []sdk.Msg
contract := config.WasmMsgTypes.Vortex.ContractAddr

// Randomly select Position Direction
var direction dextypes.PositionDirection
if rand.Float64() < 0.5 {
direction = dextypes.PositionDirection_LONG
} else {
direction = dextypes.PositionDirection_SHORT
}

orderType := sampleDexOrderType(config)

// If placing short order on vortex, first deposit for buying power
if direction == dextypes.PositionDirection_SHORT {
// TODO: Considering depositing more up front when numOrders > 1
amountDeposit, err := sdk.ParseCoinsNormalized(fmt.Sprintf("%d%s", price.Mul(quantity).Ceil().RoundInt64(), "usei"))
if err != nil {
panic(err)
}
vortexDeposit := &wasmtypes.MsgExecuteContract{
Sender: sdk.AccAddress(key.PubKey().Address()).String(),
Contract: contract,
Msg: wasmtypes.RawContractMessage([]byte("{\"deposit\":{}}")),
Funds: amountDeposit,
}
msgs = append(msgs, vortexDeposit)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deposit before submitting short order

}

// Create a MsgPlaceOrders with numOrders Orders
var orderPlacements []*dextypes.Order
for j := 0; j < int(numOrders); j++ {
vortexOrder := &dextypes.Order{
Account: sdk.AccAddress(key.PubKey().Address()).String(),
ContractAddr: contract,
PositionDirection: direction,
Price: price.Quo(FromMili),
Quantity: quantity.Quo(FromMili),
PriceDenom: "SEI",
AssetDenom: "ATOM",
OrderType: orderType,
Data: VortexData,
}
orderPlacements = append(orderPlacements, vortexOrder)
}

amount, err := sdk.ParseCoinsNormalized(fmt.Sprintf("%d%s", price.Mul(quantity).Ceil().RoundInt64(), "usei"))
if err != nil {
panic(err)
}
vortexOrderMsg := &dextypes.MsgPlaceOrders{
Creator: sdk.AccAddress(key.PubKey().Address()).String(),
Orders: orderPlacements,
ContractAddr: contract,
Funds: amount,
}

msgs = append(msgs, vortexOrderMsg)

return msgs
}

func getLastHeight(blockchainEndpoint string) int {
out, err := exec.Command("curl", blockchainEndpoint).Output()
if err != nil {
Expand Down
7 changes: 7 additions & 0 deletions loadtest/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const (
Limit string = "limit"
Market string = "market"
WasmMintNft string = "wasm_mint_nft"
Vortex string = "vortex"
)

type Config struct {
Expand Down Expand Up @@ -106,6 +107,7 @@ type MsgTypeDistribution struct {
// TODO: Abstract interface for any wasm type + execute msg
type WasmMessageTypes struct {
MintNftType WasmMintNftType `json:"wasm_mint_nft"`
Vortex VortexContract `json:"vortex"`
}

type WasmMintNftType struct {
Expand Down Expand Up @@ -157,3 +159,8 @@ type ContractDistribution struct {
ContractAddr string `json:"contract_address"`
Percentage sdk.Dec `json:"percentage"`
}

type VortexContract struct {
ContractAddr string `json:"contract_address"`
NumOrdersPerTx int64 `json:"num_orders_per_tx"`
}