Liquidation test: Fix scripts
This commit is contained in:
parent
511db72f8e
commit
22dc07df1d
|
@ -13,7 +13,7 @@ const GROUP_NUM = process.env.GROUP_NUM;
|
|||
|
||||
async function main() {
|
||||
const options = AnchorProvider.defaultOptions();
|
||||
const connection = new Connection(process.env.MB_CLUSTER_URL, options);
|
||||
const connection = new Connection(process.env.MB_CLUSTER_URL!, options);
|
||||
|
||||
const admin = Keypair.fromSecretKey(
|
||||
Buffer.from(
|
||||
|
@ -27,6 +27,8 @@ async function main() {
|
|||
adminProvider,
|
||||
'mainnet-beta',
|
||||
MANGO_V4_ID['mainnet-beta'],
|
||||
{},
|
||||
'get-program-accounts',
|
||||
);
|
||||
|
||||
const groups = await (async () => {
|
||||
|
@ -53,16 +55,19 @@ async function main() {
|
|||
}
|
||||
|
||||
// close all banks
|
||||
for (const bank of group.banksMap.values()) {
|
||||
sig = await client.tokenDeregister(group, bank.name);
|
||||
for (const banks of group.banksMapByMint.values()) {
|
||||
sig = await client.tokenDeregister(group, banks[0].mint);
|
||||
console.log(
|
||||
`Removed token ${bank.name}, sig https://explorer.solana.com/tx/${sig}`,
|
||||
`Removed token ${banks[0].name}, sig https://explorer.solana.com/tx/${sig}`,
|
||||
);
|
||||
}
|
||||
|
||||
// deregister all serum markets
|
||||
for (const market of group.serum3MarketsMap.values()) {
|
||||
sig = await client.serum3deregisterMarket(group, market.name);
|
||||
for (const market of group.serum3MarketsMapByExternal.values()) {
|
||||
sig = await client.serum3deregisterMarket(
|
||||
group,
|
||||
market.serumMarketExternal,
|
||||
);
|
||||
console.log(
|
||||
`Deregistered serum market ${market.name}, sig https://explorer.solana.com/tx/${sig}`,
|
||||
);
|
||||
|
|
|
@ -10,7 +10,7 @@ import { MANGO_V4_ID } from '../constants';
|
|||
//
|
||||
|
||||
// default to group 1, to not conflict with the normal group
|
||||
const GROUP_NUM = Number(process.env.GROUP_NUM || 1);
|
||||
const GROUP_NUM = Number(process.env.GROUP_NUM || 200);
|
||||
|
||||
const MAINNET_MINTS = new Map([
|
||||
['USDC', 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'],
|
||||
|
@ -24,9 +24,16 @@ const STUB_PRICES = new Map([
|
|||
['SOL', 0.04], // sol has 9 decimals, equivalent to $40 per SOL
|
||||
]);
|
||||
|
||||
// External markets are matched with those in https://github.com/blockworks-foundation/mango-client-v3/blob/main/src/ids.json
|
||||
// and verified to have best liquidity for pair on https://openserum.io/
|
||||
const MAINNET_SERUM3_MARKETS = new Map([
|
||||
['BTC/USDC', 'A8YFbxQYFVqKZaoYJLLUVcQiWP7G2MeEgW5wsAQgMvFw'],
|
||||
['SOL/USDC', '9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT'],
|
||||
]);
|
||||
|
||||
async function main() {
|
||||
const options = AnchorProvider.defaultOptions();
|
||||
const connection = new Connection(process.env.CLUSTER_URL, options);
|
||||
const connection = new Connection(process.env.CLUSTER_URL!, options);
|
||||
|
||||
const admin = Keypair.fromSecretKey(
|
||||
Buffer.from(
|
||||
|
@ -42,6 +49,8 @@ async function main() {
|
|||
adminProvider,
|
||||
'mainnet-beta',
|
||||
MANGO_V4_ID['mainnet-beta'],
|
||||
{},
|
||||
'get-program-accounts',
|
||||
);
|
||||
|
||||
// group
|
||||
|
@ -61,7 +70,7 @@ async function main() {
|
|||
console.log(`Creating stub oracle for ${name}...`);
|
||||
const mintPk = new PublicKey(mint);
|
||||
try {
|
||||
const price = STUB_PRICES.get(name);
|
||||
const price = STUB_PRICES.get(name)!;
|
||||
await client.stubOracleCreate(group, mintPk, price);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
@ -71,37 +80,6 @@ async function main() {
|
|||
oracles.set(name, oracle.publicKey);
|
||||
}
|
||||
|
||||
// register token 1
|
||||
console.log(`Registering BTC...`);
|
||||
const btcMainnetMint = new PublicKey(MAINNET_MINTS.get('BTC')!);
|
||||
const btcMainnetOracle = oracles.get('BTC');
|
||||
try {
|
||||
await client.tokenRegister(
|
||||
group,
|
||||
btcMainnetMint,
|
||||
btcMainnetOracle,
|
||||
0.1,
|
||||
1,
|
||||
'BTC',
|
||||
0.01,
|
||||
0.4,
|
||||
0.07,
|
||||
0.7,
|
||||
0.88,
|
||||
1.5,
|
||||
0.0,
|
||||
0.0001,
|
||||
0.9,
|
||||
0.8,
|
||||
1.1,
|
||||
1.2,
|
||||
0.05,
|
||||
);
|
||||
await group.reloadAll(client);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
|
||||
// register token 0
|
||||
console.log(`Registering USDC...`);
|
||||
const usdcMainnetMint = new PublicKey(MAINNET_MINTS.get('USDC')!);
|
||||
|
@ -133,6 +111,37 @@ async function main() {
|
|||
console.log(error);
|
||||
}
|
||||
|
||||
// register token 1
|
||||
console.log(`Registering BTC...`);
|
||||
const btcMainnetMint = new PublicKey(MAINNET_MINTS.get('BTC')!);
|
||||
const btcMainnetOracle = oracles.get('BTC');
|
||||
try {
|
||||
await client.tokenRegister(
|
||||
group,
|
||||
btcMainnetMint,
|
||||
btcMainnetOracle,
|
||||
0.1,
|
||||
1,
|
||||
'BTC',
|
||||
0.01,
|
||||
0.4,
|
||||
0.07,
|
||||
0.7,
|
||||
0.88,
|
||||
1.5,
|
||||
0.0,
|
||||
0.0001,
|
||||
0.9,
|
||||
0.8,
|
||||
1.1,
|
||||
1.2,
|
||||
0.05,
|
||||
);
|
||||
await group.reloadAll(client);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
|
||||
// register token 2
|
||||
console.log(`Registering SOL...`);
|
||||
const solMainnetMint = new PublicKey(MAINNET_MINTS.get('SOL')!);
|
||||
|
@ -165,7 +174,7 @@ async function main() {
|
|||
}
|
||||
|
||||
// log tokens/banks
|
||||
for (const bank of await group.banksMap.values()) {
|
||||
for (const bank of await group.banksMapByMint.values()) {
|
||||
console.log(`${bank.toString()}`);
|
||||
}
|
||||
|
||||
|
|
|
@ -8,12 +8,12 @@ import { MANGO_V4_ID } from '../constants';
|
|||
// This script deposits some tokens, so other liquidation scripts can borrow.
|
||||
//
|
||||
|
||||
const GROUP_NUM = Number(process.env.GROUP_NUM || 1);
|
||||
const GROUP_NUM = Number(process.env.GROUP_NUM || 200);
|
||||
const ACCOUNT_NUM = Number(process.env.ACCOUNT_NUM || 0);
|
||||
|
||||
async function main() {
|
||||
const options = AnchorProvider.defaultOptions();
|
||||
const connection = new Connection(process.env.CLUSTER_URL, options);
|
||||
const connection = new Connection(process.env.CLUSTER_URL!, options);
|
||||
|
||||
const admin = Keypair.fromSecretKey(
|
||||
Buffer.from(
|
||||
|
@ -28,6 +28,8 @@ async function main() {
|
|||
userProvider,
|
||||
'mainnet-beta',
|
||||
MANGO_V4_ID['mainnet-beta'],
|
||||
{},
|
||||
'get-program-accounts',
|
||||
);
|
||||
console.log(`User ${userWallet.publicKey.toBase58()}`);
|
||||
|
||||
|
@ -37,26 +39,31 @@ async function main() {
|
|||
|
||||
// create + fetch account
|
||||
console.log(`Creating mangoaccount...`);
|
||||
const mangoAccount = await client.getOrCreateMangoAccount(
|
||||
const mangoAccount = (await client.getOrCreateMangoAccount(
|
||||
group,
|
||||
admin.publicKey,
|
||||
ACCOUNT_NUM,
|
||||
);
|
||||
'LIQTEST, FUNDING',
|
||||
))!;
|
||||
console.log(`...created/found mangoAccount ${mangoAccount.publicKey}`);
|
||||
console.log(mangoAccount.toString());
|
||||
|
||||
const usdcMint = group.banksMapByName.get('USDC')![0].mint;
|
||||
const btcMint = group.banksMapByName.get('BTC')![0].mint;
|
||||
const solMint = group.banksMapByName.get('SOL')![0].mint;
|
||||
|
||||
// deposit
|
||||
try {
|
||||
console.log(`...depositing 10 USDC`);
|
||||
await client.tokenDeposit(group, mangoAccount, 'USDC', 10);
|
||||
await client.tokenDeposit(group, mangoAccount, usdcMint, 10);
|
||||
await mangoAccount.reload(client, group);
|
||||
|
||||
console.log(`...depositing 0.0004 BTC`);
|
||||
await client.tokenDeposit(group, mangoAccount, 'BTC', 0.0004);
|
||||
await client.tokenDeposit(group, mangoAccount, btcMint, 0.0004);
|
||||
await mangoAccount.reload(client, group);
|
||||
|
||||
console.log(`...depositing 0.25 SOL`);
|
||||
await client.tokenDeposit(group, mangoAccount, 'SOL', 0.25);
|
||||
await client.tokenDeposit(group, mangoAccount, solMint, 0.25);
|
||||
await mangoAccount.reload(client, group);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
|
|
@ -8,7 +8,7 @@ import { MANGO_V4_ID } from '../constants';
|
|||
// This script creates liquidation candidates
|
||||
//
|
||||
|
||||
const GROUP_NUM = Number(process.env.GROUP_NUM || 1);
|
||||
const GROUP_NUM = Number(process.env.GROUP_NUM || 200);
|
||||
|
||||
// native prices
|
||||
const PRICES = {
|
||||
|
@ -33,7 +33,7 @@ const SCENARIOS: [string, string, number, string, number][] = [
|
|||
|
||||
async function main() {
|
||||
const options = AnchorProvider.defaultOptions();
|
||||
const connection = new Connection(process.env.CLUSTER_URL, options);
|
||||
const connection = new Connection(process.env.CLUSTER_URL!, options);
|
||||
|
||||
const admin = Keypair.fromSecretKey(
|
||||
Buffer.from(
|
||||
|
@ -48,6 +48,8 @@ async function main() {
|
|||
userProvider,
|
||||
'mainnet-beta',
|
||||
MANGO_V4_ID['mainnet-beta'],
|
||||
{},
|
||||
'get-program-accounts',
|
||||
);
|
||||
console.log(`User ${userWallet.publicKey.toBase58()}`);
|
||||
|
||||
|
@ -66,34 +68,37 @@ async function main() {
|
|||
|
||||
// create account
|
||||
console.log(`Creating mangoaccount...`);
|
||||
let mangoAccount = await client.getOrCreateMangoAccount(
|
||||
let mangoAccount = (await client.getOrCreateMangoAccount(
|
||||
group,
|
||||
admin.publicKey,
|
||||
maxAccountNum + 1,
|
||||
);
|
||||
))!;
|
||||
maxAccountNum = maxAccountNum + 1;
|
||||
console.log(
|
||||
`...created mangoAccount ${mangoAccount.publicKey} for ${name}`,
|
||||
);
|
||||
|
||||
const assetMint = new PublicKey(MAINNET_MINTS.get(assetName)!);
|
||||
const liabMint = new PublicKey(MAINNET_MINTS.get(liabName)!);
|
||||
|
||||
await client.tokenDepositNative(
|
||||
group,
|
||||
mangoAccount,
|
||||
assetName,
|
||||
assetMint,
|
||||
assetAmount,
|
||||
);
|
||||
await mangoAccount.reload(client, group);
|
||||
|
||||
if (liabAmount > 0) {
|
||||
// temporarily drop the borrowed token value, so the borrow goes through
|
||||
const oracle = group.banksMap.get(liabName).oracle;
|
||||
const oracle = group.banksMapByName.get(liabName)![0].oracle;
|
||||
try {
|
||||
await client.stubOracleSet(group, oracle, PRICES[liabName] / 2);
|
||||
|
||||
await client.tokenWithdrawNative(
|
||||
group,
|
||||
mangoAccount,
|
||||
liabName,
|
||||
liabMint,
|
||||
liabAmount,
|
||||
true,
|
||||
);
|
||||
|
|
|
@ -9,7 +9,7 @@ import { MANGO_V4_ID } from '../constants';
|
|||
// by MANGO_MAINNET_PAYER_KEYPAIR in the group.
|
||||
//
|
||||
|
||||
const GROUP_NUM = Number(process.env.GROUP_NUM || 2);
|
||||
const GROUP_NUM = Number(process.env.GROUP_NUM || 200);
|
||||
const CLUSTER_URL =
|
||||
process.env.CLUSTER_URL ||
|
||||
'https://mango.rpcpool.com/946ef7337da3f5b8d3e4a34e7f88';
|
||||
|
@ -18,7 +18,7 @@ const MANGO_MAINNET_PAYER_KEYPAIR =
|
|||
|
||||
async function main() {
|
||||
const options = AnchorProvider.defaultOptions();
|
||||
const connection = new Connection(CLUSTER_URL, options);
|
||||
const connection = new Connection(CLUSTER_URL!, options);
|
||||
|
||||
const admin = Keypair.fromSecretKey(
|
||||
Buffer.from(
|
||||
|
@ -31,6 +31,8 @@ async function main() {
|
|||
userProvider,
|
||||
'mainnet-beta',
|
||||
MANGO_V4_ID['mainnet-beta'],
|
||||
{},
|
||||
'get-program-accounts'
|
||||
);
|
||||
console.log(`User ${userWallet.publicKey.toBase58()}`);
|
||||
|
||||
|
@ -50,7 +52,7 @@ async function main() {
|
|||
// first, settle all borrows
|
||||
for (let token of account.tokensActive()) {
|
||||
const bank = group.getFirstBankByTokenIndex(token.tokenIndex);
|
||||
const amount = token.native(bank).toNumber();
|
||||
const amount = token.balance(bank).toNumber();
|
||||
if (amount < 0) {
|
||||
try {
|
||||
await client.tokenDepositNative(
|
||||
|
@ -76,7 +78,7 @@ async function main() {
|
|||
// withdraw all funds
|
||||
for (let token of account.tokensActive()) {
|
||||
const bank = group.getFirstBankByTokenIndex(token.tokenIndex);
|
||||
const amount = token.native(bank).toNumber();
|
||||
const amount = token.balance(bank).toNumber();
|
||||
if (amount > 0) {
|
||||
try {
|
||||
const allowBorrow = false;
|
||||
|
|
Loading…
Reference in New Issue