github.com/InjectiveLabs/sdk-go@v1.53.0/examples/chain/authz/2_MsgExec/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  
    11  	"github.com/InjectiveLabs/sdk-go/client"
    12  	"github.com/InjectiveLabs/sdk-go/client/common"
    13  	"github.com/shopspring/decimal"
    14  
    15  	exchangetypes "github.com/InjectiveLabs/sdk-go/chain/exchange/types"
    16  	chainclient "github.com/InjectiveLabs/sdk-go/client/chain"
    17  	rpchttp "github.com/cometbft/cometbft/rpc/client/http"
    18  	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
    19  	sdk "github.com/cosmos/cosmos-sdk/types"
    20  	authztypes "github.com/cosmos/cosmos-sdk/x/authz"
    21  )
    22  
    23  func main() {
    24  	network := common.LoadNetwork("testnet", "lb")
    25  	tmClient, err := rpchttp.New(network.TmEndpoint, "/websocket")
    26  	if err != nil {
    27  		panic(err)
    28  	}
    29  
    30  	granterAddress, _, err := chainclient.InitCosmosKeyring(
    31  		os.Getenv("HOME")+"/.injectived",
    32  		"injectived",
    33  		"file",
    34  		"inj-user",
    35  		"12345678",
    36  		"5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e", // keyring will be used if pk not provided
    37  		false,
    38  	)
    39  
    40  	if err != nil {
    41  		panic(err)
    42  	}
    43  
    44  	senderAddress, cosmosKeyring, err := chainclient.InitCosmosKeyring(
    45  		os.Getenv("HOME")+"/.injectived",
    46  		"injectived",
    47  		"file",
    48  		"inj-user",
    49  		"12345678",
    50  		"f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3", // keyring will be used if pk not provided
    51  		false,
    52  	)
    53  
    54  	if err != nil {
    55  		panic(err)
    56  	}
    57  
    58  	clientCtx, err := chainclient.NewClientContext(
    59  		network.ChainId,
    60  		senderAddress.String(),
    61  		cosmosKeyring,
    62  	)
    63  
    64  	if err != nil {
    65  		panic(err)
    66  	}
    67  
    68  	clientCtx = clientCtx.WithNodeURI(network.TmEndpoint).WithClient(tmClient)
    69  
    70  	exchangeClient, err := exchangeclient.NewExchangeClient(network)
    71  	if err != nil {
    72  		panic(err)
    73  	}
    74  
    75  	ctx := context.Background()
    76  	marketsAssistant, err := chainclient.NewMarketsAssistantInitializedFromChain(ctx, exchangeClient)
    77  	if err != nil {
    78  		panic(err)
    79  	}
    80  
    81  	txFactory := chainclient.NewTxFactory(clientCtx)
    82  	txFactory = txFactory.WithGasPrices(client.DefaultGasPriceWithDenom)
    83  	chainClient, err := chainclient.NewChainClient(
    84  		clientCtx,
    85  		network,
    86  		common.OptionTxFactory(&txFactory),
    87  	)
    88  
    89  	if err != nil {
    90  		panic(err)
    91  	}
    92  
    93  	// note that we use grantee keyring to send the msg on behalf of granter here
    94  	// sender, subaccount are from granter
    95  	granter := granterAddress.String()
    96  	grantee := "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r"
    97  	defaultSubaccountID := chainClient.DefaultSubaccount(granterAddress)
    98  
    99  	marketId := "0x0511ddc4e6586f3bfe1acb2dd905f8b8a82c97e1edaef654b12ca7e6031ca0fa"
   100  
   101  	amount := decimal.NewFromFloat(2)
   102  	price := decimal.NewFromFloat(22.55)
   103  	order := chainClient.CreateSpotOrder(
   104  		defaultSubaccountID,
   105  		&chainclient.SpotOrderData{
   106  			OrderType:    exchangetypes.OrderType_BUY,
   107  			Quantity:     amount,
   108  			Price:        price,
   109  			FeeRecipient: senderAddress.String(),
   110  			MarketId:     marketId,
   111  		},
   112  		marketsAssistant,
   113  	)
   114  
   115  	// manually pack msg into Any type
   116  	msg0 := exchangetypes.MsgCreateSpotLimitOrder{
   117  		Sender: granter,
   118  		Order:  *order,
   119  	}
   120  	msg0Bytes, _ := msg0.Marshal()
   121  	msg0Any := &codectypes.Any{}
   122  	msg0Any.TypeUrl = sdk.MsgTypeURL(&msg0)
   123  	msg0Any.Value = msg0Bytes
   124  	msg := &authztypes.MsgExec{
   125  		Grantee: grantee,
   126  		Msgs:    []*codectypes.Any{msg0Any},
   127  	}
   128  
   129  	// AsyncBroadcastMsg, SyncBroadcastMsg, QueueBroadcastMsg
   130  	err = chainClient.QueueBroadcastMsg(msg)
   131  
   132  	if err != nil {
   133  		fmt.Println(err)
   134  	}
   135  
   136  	time.Sleep(time.Second * 5)
   137  
   138  	gasFee, err := chainClient.GetGasFee()
   139  
   140  	if err != nil {
   141  		fmt.Println(err)
   142  		return
   143  	}
   144  
   145  	fmt.Println("gas fee:", gasFee, "INJ")
   146  }