Mango Markets
Mango menyediakan satu tempat untuk meminjamkan, meminjam, menukar, dan memanfaatkan memperdagangkan aset kripto melalui mesin risiko on-chain.
Anda dapat terhubung ke program on-chain Mango menggunakan librari Client API. Anda juga memerlukan librari Solana javascript API.
"@blockworks-foundation/mango-client": "^3.3.27",
"@solana/web3.js": "^1.37.0"
Cara Mendapatkan Mango Group
A mango group adalah basket dari cross-margined tokens. Ini menyimpan info pasar yang luas tentang token, pasar dex serum, pasar pelaku, oracles, dana asuransi, dan brankas biaya. Setiap versi market Manggo menggunakan Grup Manggo yang berbeda yang mengandung token. Grup v3 saat ini adalah mainnet.1
. Berikut tabel yang menunjukkan berbagai grup:
Grup | Versi | Kluster |
---|---|---|
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 |
Catatan
Jika Anda ingin menggunakan grup v2, Anda harus menggunakan librari klien v2. Kamu bisa menemukannya disini
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);
Membuat Akun Mango
Akun Manggo dikaitkan dengan Grup Manggo, dan itu menyimpan token Anda dan memungkinkan Anda untuk memperdagangkan market Grup itu. Anda dapat menemukan referensi disini.
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(),
]
)?;
Cara Deposit USDC ke Akun Manggo
Setelah membuat akun mango, kita perlu mendanainya dengan tokens untuk trading. Temukan referensi untuk metode deposit disini.
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)
);
Cara Menempatkan Spot Order
Mango berinteraksi dengan Serum Protocol untuk menempatkan spot orders di markets. Anda dapat menempatkan spot order dengan melakukan ini. Anda dapat menemukan referensi untuk fungsi placeSpotOrder disini.
Mango memiliki file konfigurasi yang mengandung informasi tentang groups, markets, tokens dan oracles, Bisa ditemukan disini. Kami menggunakan informasi dari file tersebut untuk menemukan group dan market yang tepat.
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
);
Cara Load Bids
Mango menggunakan informasi markets dari Serum Protocol untuk load bids. Anda bisa me-load langsung dari Serum untuk bisa bekerja dengan Mango. Temukan lebih lanjut perihal Serum Markets disini
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);
Cara Load Asks
Mango menggunakan informasi market dariSerum Protocol untuk load asks. Kamu bisa load langsung dari Serum untuk bisa bekerja dengan Mango. Temukan lebih lanjut tentang Serum Markets disini
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);