github.com/InjectiveLabs/sdk-go@v1.53.0/examples/chain/exchange/9_MsgBatchUpdateOrders/example.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"time"
     8  
     9  	exchangeclient "github.com/InjectiveLabs/sdk-go/client/exchange"
    10  	"github.com/google/uuid"
    11  
    12  	"github.com/InjectiveLabs/sdk-go/client"
    13  	"github.com/InjectiveLabs/sdk-go/client/common"
    14  	"github.com/shopspring/decimal"
    15  
    16  	exchangetypes "github.com/InjectiveLabs/sdk-go/chain/exchange/types"
    17  	chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
    18  	rpchttp "github.com/cometbft/cometbft/rpc/client/http"
    19  )
    20  
    21  func main() {
    22  	network := common.LoadNetwork("testnet", "lb")
    23  	tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
    24  	if err != nil {
    25  		panic(err)
    26  	}
    27  
    28  	senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
    29  		os.Getenv("HOME")+"/.injectived",
    30  		"injectived",
    31  		"file",
    32  		"inj-user",
    33  		"12345678",
    34  		"5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
    35  		false,
    36  	)
    37  
    38  	if err != nil {
    39  		panic(err)
    40  	}
    41  
    42  	clientCtx, err := chainclient.NewClientContext(
    43  		network.ChainId,
    44  		senderAddress.String(),
    45  		cosmosKeyring,
    46  	)
    47  
    48  	if err != nil {
    49  		fmt.Println(err)
    50  		return
    51  	}
    52  
    53  	clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
    54  
    55  	exchangeClient, err := exchangeclient.NewExchangeClient(network)
    56  	if err != nil {
    57  		panic(err)
    58  	}
    59  
    60  	ctx := context.Background()
    61  	marketsAssistant, err := chainclient.NewMarketsAssistantInitializedFromChain(ctx, exchangeClient)
    62  	if err != nil {
    63  		panic(err)
    64  	}
    65  
    66  	chainClient, err := chainclient.NewChainClient(
    67  		clientCtx,
    68  		network,
    69  		common.OptionGasPrices(client.DefaultGasPriceWithDenom),
    70  	)
    71  
    72  	if err != nil {
    73  		fmt.Println(err)
    74  		return
    75  	}
    76  
    77  	defaultSubaccountID := chainClient.DefaultSubaccount(senderAddress)
    78  
    79  	smarketId := "0x0511ddc4e6586f3bfe1acb2dd905f8b8a82c97e1edaef654b12ca7e6031ca0fa"
    80  	samount := decimal.NewFromFloat(2)
    81  	sprice := decimal.NewFromFloat(22.5)
    82  	smarketIds := []string{"0xa508cb32923323679f29a032c70342c147c17d0145625922b0ef22e955c844c0"}
    83  
    84  	spot_order := chainClient.CreateSpotOrder(
    85  		defaultSubaccountID,
    86  		&chainclient.SpotOrderData{
    87  			OrderType:    exchangetypes.OrderType_BUY, //BUY SELL BUY_PO SELL_PO
    88  			Quantity:     samount,
    89  			Price:        sprice,
    90  			FeeRecipient: senderAddress.String(),
    91  			MarketId:     smarketId,
    92  			Cid:          uuid.NewString(),
    93  		},
    94  		marketsAssistant,
    95  	)
    96  
    97  	dmarketId := "0x4ca0f92fc28be0c9761326016b5a1a2177dd6375558365116b5bdda9abc229ce"
    98  	damount := decimal.NewFromFloat(0.01)
    99  	dprice := decimal.RequireFromString("31000") //31,000
   100  	dleverage := decimal.RequireFromString("2")
   101  	dmarketIds := []string{"0x4ca0f92fc28be0c9761326016b5a1a2177dd6375558365116b5bdda9abc229ce"}
   102  
   103  	derivative_order := chainClient.CreateDerivativeOrder(
   104  		defaultSubaccountID,
   105  		&chainclient.DerivativeOrderData{
   106  			OrderType:    exchangetypes.OrderType_BUY, //BUY SELL BUY_PO SELL_PO
   107  			Quantity:     damount,
   108  			Price:        dprice,
   109  			Leverage:     dleverage,
   110  			FeeRecipient: senderAddress.String(),
   111  			MarketId:     dmarketId,
   112  			IsReduceOnly: false,
   113  			Cid:          uuid.NewString(),
   114  		},
   115  		marketsAssistant,
   116  	)
   117  
   118  	msg := new(exchangetypes.MsgBatchUpdateOrders)
   119  	msg.Sender = senderAddress.String()
   120  	msg.SubaccountId = defaultSubaccountID.Hex()
   121  	msg.SpotOrdersToCreate = []*exchangetypes.SpotOrder{spot_order}
   122  	msg.DerivativeOrdersToCreate = []*exchangetypes.DerivativeOrder{derivative_order}
   123  	msg.SpotMarketIdsToCancelAll = smarketIds
   124  	msg.DerivativeMarketIdsToCancelAll = dmarketIds
   125  
   126  	simRes, err := chainClient.SimulateMsg(clientCtx, msg)
   127  
   128  	if err != nil {
   129  		fmt.Println(err)
   130  		return
   131  	}
   132  
   133  	MsgBatchUpdateOrdersResponse := exchangetypes.MsgBatchUpdateOrdersResponse{}
   134  	MsgBatchUpdateOrdersResponse.Unmarshal(simRes.Result.MsgResponses[0].Value)
   135  
   136  	fmt.Println("simulated spot order hashes", MsgBatchUpdateOrdersResponse.SpotOrderHashes)
   137  
   138  	fmt.Println("simulated derivative order hashes", MsgBatchUpdateOrdersResponse.DerivativeOrderHashes)
   139  
   140  	// AsyncBroadcastMsg, SyncBroadcastMsg, QueueBroadcastMsg
   141  	err = chainClient.QueueBroadcastMsg(msg)
   142  
   143  	if err != nil {
   144  		fmt.Println(err)
   145  		return
   146  	}
   147  
   148  	time.Sleep(time.Second * 5)
   149  
   150  	gasFee, err := chainClient.GetGasFee()
   151  
   152  	if err != nil {
   153  		fmt.Println(err)
   154  		return
   155  	}
   156  
   157  	fmt.Println("gas fee:", gasFee, "INJ")
   158  }