IRpcClient rpcClient = ClientFactory.GetClient(Cluster.MainNet);
IStreamingRpcClient streamingRpcClient = ClientFactory.GetStreamingClient(Cluster.MainNet);
IMangoClient mangoClient = Solnet.Mango.ClientFactory.GetClient(rpcClient, streamingRpcClient);
PublicKey perpMarketPublicKey = new PublicKey("4GkJj2znAr2pE2PBbak66E12zjCs2jkmeafiJwDVM9Au"); // SRM-PERP
AccountResultWrapper<MangoGroup> mangoGroup = await mangoClient.GetMangoGroupAsync(Constants.MangoGroup);
IPythClient pythClient = Solnet.Pyth.ClientFactory.GetClient(rpcClient, streamingRpcClient);
AccountResultWrapper<MappingAccount> mappingAccount = await pythClient.GetMappingAccountAsync(Solnet.Pyth.Constants.MappingAccount);
MultipleAccountsResultWrapper<List<ProductAccount>> productAccounts = await pythClient.GetProductAccountsAsync(mappingAccount.ParsedResult);
ProductAccount productAccount = productAccounts.ParsedResult.First(x => x.Product.Symbol.Contains("SRM"));
PublicKey oracle = mangoGroup.ParsedResult.Oracles.First(x => x.Key == productAccount.PriceAccount.Key);
int perpetualMarketIndex = mangoGroup.ParsedResult.Oracles.IndexOf(oracle);
int marketIndex = mangoGroup.ParsedResult.GetPerpMarketIndex(perpMarketPublicKey);
TokenInfo token = mangoGroup.ParsedResult.Tokens[marketIndex];
TokenInfo quoteToken = mangoGroup.ParsedResult.GetQuoteTokenInfo();
AccountResultWrapper<PerpMarket> perpMarket = await mangoClient.GetPerpMarketAsync(perpMarketPublicKey);
(long bidPrice, long bidQuantity) = perpMarket.ParsedResult.UiToNativePriceQuantity(1.5, 14156.28539071348, token.Decimals, quoteToken.Decimals);
(long askPrice, long askQuantity) = perpMarket.ParsedResult.UiToNativePriceQuantity(2.1, 14156.28539071348, token.Decimals, quoteToken.Decimals);
PublicKey solanaWalletPublicKey = new PublicKey("__your_solana_wallet_public_key__");
PublicKey mangoAccountPublicKey = new PublicKey("__your_mango_account_public_key__");
AccountResultWrapper<MangoAccount> mangoAccount = await mangoClient.GetMangoAccountAsync(mangoAccountPublicKey, Commitment.Processed);
ulong expiryTimestamp = (ulong)new DateTimeOffset(DateTime.UtcNow.AddSeconds(250)).ToUnixTimeSeconds();
MangoProgram mangoProgram = MangoProgram.CreateMainNet();
TransactionInstruction bid = mangoProgram.PlacePerpOrder2(
mangoGroup: Constants.MangoGroup,
mangoAccount: mangoAccountPublicKey,
owner: solanaWalletPublicKey,
mangoCache: Constants.MangoCache,
perpetualMarket: mangoGroup.ParsedResult.PerpetualMarkets[perpetualMarketIndex].Market,
bids: perpMarket.ParsedResult.Bids,
asks: perpMarket.ParsedResult.Asks,
eventQueue: perpMarket.ParsedResult.EventQueue,
openOrdersAccounts: mangoAccount.ParsedResult.SpotOpenOrders,
orderType: PerpOrderType.PostOnly,
maxBaseQuantity: bidQuantity,
clientOrderId: 1_000_001ul,
expiryTimestamp: expiryTimestamp,
TransactionInstruction ask = mangoProgram.PlacePerpOrder2(
mangoGroup: Constants.MangoGroup,
mangoAccount: mangoAccountPublicKey,
owner: solanaWalletPublicKey,
mangoCache: Constants.MangoCache,
perpetualMarket: mangoGroup.ParsedResult.PerpetualMarkets[perpetualMarketIndex].Market,
bids: perpMarket.ParsedResult.Bids,
asks: perpMarket.ParsedResult.Asks,
eventQueue: perpMarket.ParsedResult.EventQueue,
openOrdersAccounts: mangoAccount.ParsedResult.SpotOpenOrders,
orderType: PerpOrderType.PostOnly,
maxBaseQuantity: askQuantity,
clientOrderId: 1_000_002ul,
expiryTimestamp: expiryTimestamp,
RequestResult<ResponseValue<BlockHash>> blockhashRequest = await rpcClient.GetRecentBlockHashAsync();
TransactionBuilder txBuilder = new TransactionBuilder().SetFeePayer(solanaWalletPublicKey).SetRecentBlockHash(blockhashRequest.Result.Value.Blockhash);
txBuilder.AddInstruction(bid);
txBuilder.AddInstruction(ask);
Wallet solanaWallet = new SolanaKeyStoreService().RestoreKeystoreFromFile("__location_of_your_json_wallet_file__");
byte[] txBytes = txBuilder.Build(new List<Account>() { solanaWallet.Account });
RequestResult<string> transaction = await mangoClient.RpcClient.SendTransactionAsync(txBytes, true, Commitment.Processed);