Mango Markets
Mango bietet einen einzigen Ort um Kryptoassets über eine On-Chain-Risiko-Engine zum Verleihen, Leihen, Tauschen und Leverage Handeln. Sie können sich über die Client-API-Bibliotheken mit dem On-Chain-Programm von Mango verbinden. Sie benötigen außerdem die Solana-Javascript-API-Bibliothek.
"@blockworks-foundation/mango-client": "^3.3.27",
"@solana/web3.js": "^1.37.0"
So erhalten Sie eine Mango-Gruppe
Eine Mangogruppe ist ein Korb mit querrandigen Spielmarken. Es enthält umfassende Marktinformationen über Token, Serum-Dex-Märkte, Tätermärkte, Orakel, Versicherungsfonds und Gebührentresore. Jede Version von Mango Markets verwendet eine andere Mango-Gruppe, die andere enthält Token. Die aktuelle v3-Gruppe ist „mainnet.1“. Hier ist eine Tabelle mit den verschiedenen Gruppen:
Group | Version | Cluster |
---|---|---|
mainnet.1 | v3 | mainnet |
devnet.2 | v3 | devnet |
devnet.3 | v3 | devnet |
BTC_ETH_SOL_SRM_USDC | v2 | mainnet & devnet |
BTC_ETH_USDT | v2 | devnet |
BTC_ETH_USDC | v2 | testnet |
Note
Wenn Sie die v2-Gruppen verwenden möchten, müssen Sie die v2-Clientbibliothek verwenden. Du kannst es hier finden
import { Connection, PublicKey } from "@solana/web3.js";
import {
IDS,
MangoClient,
Config,
I80F48,
} from "@blockworks-foundation/mango-client";
(async () => {
const cluster = "devnet";
const group = "devnet.3";
const config = new Config(IDS);
const groupConfig = config.getGroup(cluster, group);
if (!groupConfig) {
throw new Error("unable to get mango group config");
}
const mangoGroupKey = groupConfig.publicKey;
const clusterData = IDS.groups.find((g) => {
return g.name == group && g.cluster == cluster;
});
const mangoProgramIdPk = new PublicKey(clusterData.mangoProgramId);
const clusterUrl = IDS.cluster_urls[cluster];
const connection = new Connection(clusterUrl, "singleGossip");
const client = new MangoClient(connection, mangoProgramIdPk);
const mangoGroup = await client.getMangoGroup(mangoGroupKey);
})();
const mangoGroup = await client.getMangoGroup(mangoGroupKey);
So erstellen Sie ein Mango-Konto
Ein Mango-Konto ist mit einer Mango-Gruppe verknüpft und enthält Ihre Tokens und Genehmigungen, die Märkte dieser Gruppe zu handeln. Die Referenz finden Sie hier.
import { useWallet } from "@solana/wallet-adapter-react";
import { Connection, PublicKey } from "@solana/web3.js";
import { IDS, MangoClient, Config } from "@blockworks-foundation/mango-client";
(async () => {
const { wallet } = useWallet();
const cluster = "devnet";
const group = "devnet.3";
const config = new Config(IDS);
const groupConfig = config.getGroup(cluster, group);
if (!groupConfig) {
throw new Error("unable to get mango group config");
}
const mangoGroupKey = groupConfig.publicKey;
const clusterData = IDS.groups.find((g) => {
return g.name == group && g.cluster == cluster;
});
const mangoProgramIdPk = new PublicKey(clusterData.mangoProgramId);
const clusterUrl = IDS.cluster_urls[cluster];
const connection = new Connection(clusterUrl, "singleGossip");
const client = new MangoClient(connection, mangoProgramIdPk);
const mangoGroup = await client.getMangoGroup(mangoGroupKey);
const mangoAccount = await client.createMangoAccount(
mangoGroup,
wallet?.adapter,
23
);
})();
const mangoAccount = await client.createMangoAccount(
mangoGroup,
wallet.adapter,
23
);
use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint::ProgramResult,
msg,
program::{invoke_signed},
program_error::ProgramError,
pubkey::Pubkey,
system_instruction,
system_program::ID as SYSTEM_PROGRAM_ID,
sysvar::{rent::Rent, Sysvar},
};
// Add this to Cargo.toml to be able to use the mango program repository as a crate
// mango = { version = "3.4.2", git = "https://github.com/blockworks-foundation/mango-v3.git", default-features=false, features = ["no-entrypoint", "program"] }
use mango::instruction::MangoInstruction;
use crate::instruction::ProgramInstruction;
pub struct Processor {}
impl Processor {
pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
let instruction = ProgramInstruction::try_from_slice(instruction_data)
.map_err(|_| ProgramError::InvalidInstructionData)?;
let accounts_iter = &mut accounts.iter();
match instruction {
ProgramInstruction::CreateMangoAccount { account_num } => {
msg!("Instruction: CreateMangoAccount");
let mango_group_ai = next_account_info(accounts_iter)?;
let mango_account_ai = next_account_info(accounts_iter)?;
let user = next_account_info(accounts_iter)?;
let mango_program = next_account_info(accounts_iter)?;
let system_program = next_account_info(accounts_iter)?;
invoke(
&mango::instruction::create_mango_account(
*mango_program.key,
*mango_account_ai.key,
*user.key,
*system_program.key,
*user.key,
*account_num
),
&[
mango_program.clone(),
user.clone(),
system_program.clone(),
mango_account_ai.clone(),
]
)?;
}
}
Ok(())
}
}
invoke(
&mango_v3::instruction::create_mango_account(
*mango_program.key,
*mango_account_ai.key,
*mango_account_ai.key,
*user.key,
*system_program.key,
*user.key,
*account_num
),
&[
mango_program.clone(),
user.clone(),
system_program.clone(),
mango_account_ai.clone(),
]
)?;
So zahlen Sie USDC auf ein Mango-Konto ein
Nachdem Sie ein Mango-Konto erstellt haben, müssen Sie es mit Token für den Handel aufladen. Die Referenz für die Einzahlungsmethode finden Sie hier.
import { useWallet } from "@solana/wallet-adapter-react";
import { Connection, PublicKey } from "@solana/web3.js";
import {
IDS,
MangoClient,
Config,
getTokenAccountsByOwnerWithWrappedSol,
} from "@blockworks-foundation/mango-client";
(async () => {
const { wallet } = useWallet();
const cluster = "devnet";
const group = "devnet.3";
const config = new Config(IDS);
const groupConfig = config.getGroup(cluster, group);
if (!groupConfig) {
throw new Error("unable to get mango group config");
}
const mangoGroupKey = groupConfig.publicKey;
const clusterData = IDS.groups.find((g) => {
return g.name == group && g.cluster == cluster;
});
const mangoProgramIdPk = new PublicKey(clusterData.mangoProgramId);
const clusterUrl = IDS.cluster_urls[cluster];
const connection = new Connection(clusterUrl, "singleGossip");
const client = new MangoClient(connection, mangoProgramIdPk);
const mangoGroup = await client.getMangoGroup(mangoGroupKey);
const mangoAccount = await client.createMangoAccount(
mangoGroup,
wallet?.adapter,
23
);
const tokenAccounts = await getTokenAccountsByOwnerWithWrappedSol(
connection,
wallet.adapter.publicKey
);
const tokenAccount = tokenAccounts.find((account) =>
account.mint.equals(
new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
)
); // USDC mint address
const tokenIndex = mangoGroup.getTokenIndex(tokenAccount.mint);
await client.deposit(
mangoGroup,
mangoAccount,
wallet?.adapter,
mangoGroup.tokens[tokenIndex].rootBank,
mangoGroup.rootBankAccounts[tokenIndex].nodeBankAccounts[0].publicKey,
mangoGroup.rootBankAccounts[tokenIndex].nodeBankAccounts[0].vault,
tokenAccount.publicKey,
Number(4)
);
})();
await client.deposit(
mangoGroup,
mangoAccount,
wallet?.adapter,
mangoGroup.tokens[tokenIndex].rootBank,
mangoGroup.rootBankAccounts[tokenIndex].nodeBankAccounts[0].publicKey,
mangoGroup.rootBankAccounts[tokenIndex].nodeBankAccounts[0].vault,
tokenAccount.publicKey,
Number(4)
);
So platzieren Sie eine Spot-Order
Mango interagiert mit dem Serum Protocol, um Spot-Orders auf den Märkten zu platzieren. Sie können eine Spot Order bestellen, indem Sie dies tun. Die Referenz für die placeSpotOrder-Funktion finden Sie hier. Mango hat eine Konfigurationsdatei, die Informationen zu Gruppen, Märkten, Token und Orakeln enthält. Sie finden es hier. Wir verwenden Informationen aus dieser Datei, um die richtige Gruppe und den richtigen Markt zu finden.
import { useWallet } from "@solana/wallet-adapter-react";
import { Connection, PublicKey } from "@solana/web3.js";
import { Market } from "@project-serum/serum";
import {
IDS,
MangoClient,
Config,
getSpotMarketByBaseSymbol,
} from "@blockworks-foundation/mango-client";
(async () => {
const { wallet } = useWallet();
const cluster = "devnet";
const group = "devnet.3";
const config = new Config(IDS);
const groupConfig = config.getGroup(cluster, group);
if (!groupConfig) {
throw new Error("unable to get mango group config");
}
const mangoGroupKey = groupConfig.publicKey;
const clusterData = IDS.groups.find((g) => {
return g.name == group && g.cluster == cluster;
});
const mangoProgramIdPk = new PublicKey(clusterData.mangoProgramId);
const clusterUrl = IDS.cluster_urls[cluster];
const connection = new Connection(clusterUrl, "singleGossip");
const client = new MangoClient(connection, mangoProgramIdPk);
const mangoGroup = await client.getMangoGroup(mangoGroupKey);
const mangoAccount = await client.createMangoAccount(
mangoGroup,
wallet?.adapter,
23
);
const marketConfig = getSpotMarketByBaseSymbol(groupConfig, "SOL");
const market = await Market.load(
connection,
marketConfig.publicKey,
{},
groupConfig.serumProgramId
);
await client.placeSpotOrder(
mangoGroup,
mangoAccount,
mangoGroup.mangoCache,
market,
wallet?.adapter,
"buy",
3,
3.5
);
})();
await client.placeSpotOrder(
mangoGroup,
mangoAccount,
mangoGroup.mangoCache,
market,
wallet?.adapter,
"buy",
3,
3.5
);
So laden Sie Gebote
Mango verwendet die Marktinformationen von Serum Protocol, um Gebote zu laden. Sie können sie direkt aus Serum laden, um mit Mango zu arbeiten. Sie können hier mehr über Serum Märkte erfahren
import { Connection, PublicKey } from "@solana/web3.js";
import { Market } from "@project-serum/serum";
import {
IDS,
Config,
getSpotMarketByBaseSymbol,
} from "@blockworks-foundation/mango-client";
(async () => {
const cluster = "devnet";
const group = "devnet.3";
const config = new Config(IDS);
const groupConfig = config.getGroup(cluster, group);
if (!groupConfig) {
throw new Error("unable to get mango group config");
}
const clusterUrl = IDS.cluster_urls[cluster];
const connection = new Connection(clusterUrl, "singleGossip");
const marketConfig = getSpotMarketByBaseSymbol(groupConfig, "SOL");
const market = await Market.load(
connection,
marketConfig.publicKey,
{},
groupConfig.serumProgramId
);
const bids = market.loadBids(connection);
})();
const bids = market.loadBids(connection);
How to load asks
Mango verwendet die Marktinformationen von Serum Protocol, um Anfragen zu laden. Sie können sie direkt aus Serum laden, um mit Mango zu arbeiten. Sie können hier mehr über die Märkte von Serum erfahren
import { Connection, PublicKey } from "@solana/web3.js";
import { Market } from "@project-serum/serum";
import {
IDS,
MangoClient,
Config,
getSpotMarketByBaseSymbol,
} from "@blockworks-foundation/mango-client";
(async () => {
const cluster = "devnet";
const group = "devnet.3";
const config = new Config(IDS);
const groupConfig = config.getGroup(cluster, group);
if (!groupConfig) {
throw new Error("unable to get mango group config");
}
const clusterUrl = IDS.cluster_urls[cluster];
const connection = new Connection(clusterUrl, "singleGossip");
const marketConfig = getSpotMarketByBaseSymbol(groupConfig, "SOL");
const market = await Market.load(
connection,
marketConfig.publicKey,
{},
groupConfig.serumProgramId
);
const asks = await market.loadBids(connection);
})();
const asks = await market.loadBids(connection);