mango-v4/ts/example.ts

182 lines
4.3 KiB
TypeScript
Raw Normal View History

import { Provider, Wallet } from '@project-serum/anchor';
import { Connection, Keypair, PublicKey } from '@solana/web3.js';
import fs from 'fs';
import os from 'os';
import { MangoClient } from './client';
import {
closeMangoAccount,
createGroup,
createMangoAccount,
deposit,
getBank,
getBankForGroupAndMint,
getGroupForAdmin,
getMangoAccount,
getMangoAccountsForGroupAndOwner,
registerToken,
withdraw,
} from './instructions';
async function main() {
const options = Provider.defaultOptions();
const connection = new Connection(
'https://mango.devnet.rpcpool.com',
options,
);
2022-03-31 02:15:39 -07:00
const admin = Keypair.fromSecretKey(
Buffer.from(
JSON.parse(
// 6pkqDeYxxnysUEvyhvXx1JWzWNoKQFSB95hYTxvHj4R3
fs.readFileSync(os.homedir() + '/.config/solana/dev2.json', 'utf-8'),
2022-03-31 02:15:39 -07:00
),
),
);
const adminWallet = new Wallet(admin);
2022-03-31 02:15:39 -07:00
const payer = Keypair.fromSecretKey(
Buffer.from(
JSON.parse(
fs.readFileSync(
os.homedir() + '/.config/solana/mango-devnet.json',
'utf-8',
),
),
),
);
const provider = new Provider(connection, adminWallet, options);
const client = await MangoClient.connect(provider, true);
2022-03-31 02:28:47 -07:00
//
// Find existing or create a new group
2022-03-31 02:28:47 -07:00
//
let groups = await getGroupForAdmin(client, admin.publicKey);
let group;
if (groups.length > 0) {
group = groups[0];
console.log(`Found group ${group.publicKey.toBase58()}`);
} else {
await createGroup(client, admin.publicKey, payer);
let groups = await getGroupForAdmin(client, admin.publicKey);
group = groups[0];
console.log(`Created group ${group.publicKey.toBase58()}`);
}
2022-03-31 02:28:47 -07:00
//
// Find existing or register a new token
2022-03-31 02:28:47 -07:00
//
const btcDevnetMint = new PublicKey(
2022-03-31 06:58:12 -07:00
'3UNBZ6o52WTWwjac2kPUb4FyodhU1vFkRJheu1Sh2TvU',
);
const btcDevnetOracle = new PublicKey(
2022-03-31 06:58:12 -07:00
'HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J',
);
let banks = await getBankForGroupAndMint(
client,
group.publicKey,
btcDevnetMint,
);
2022-03-31 02:28:47 -07:00
let bank;
if (banks.length > 0) {
bank = banks[0];
console.log(`Found bank ${bank.publicKey.toBase58()}`);
2022-03-31 02:28:47 -07:00
} else {
await registerToken(
client,
group.publicKey,
admin.publicKey,
btcDevnetMint,
btcDevnetOracle,
payer,
);
banks = await getBankForGroupAndMint(
client,
group.publicKey,
btcDevnetMint,
);
bank = banks[0];
console.log(`Registered token ${bank.publicKey.toBase58()}`);
2022-03-31 02:28:47 -07:00
}
2022-03-31 04:30:05 -07:00
//
// Create mango account
2022-03-31 04:30:05 -07:00
//
let accounts = await getMangoAccountsForGroupAndOwner(
client,
group.publicKey,
admin.publicKey,
2022-03-31 06:58:12 -07:00
);
let account;
if (accounts.length > 0) {
account = accounts[0];
console.log(`Found mango account ${account.publicKey.toBase58()}`);
} else {
await createMangoAccount(client, group.publicKey, admin.publicKey, payer);
accounts = await getMangoAccountsForGroupAndOwner(
client,
group.publicKey,
admin.publicKey,
);
account = accounts[0];
console.log(`Created mango account ${account.publicKey.toBase58()}`);
}
2022-03-31 06:58:12 -07:00
// deposit
console.log(`Depositing...1000`);
await deposit(
client,
group.publicKey,
account.publicKey,
bank.publicKey,
bank.vault,
// BTC token account
new PublicKey('CzCgYE7hcWSM6T5iN1ev5zNHbPmywAqZQkStefVcADAL'),
btcDevnetOracle,
admin.publicKey,
1000,
2022-03-31 06:58:12 -07:00
);
// withdraw
console.log(`Witdrawing...500`);
await withdraw(
client,
group.publicKey,
account.publicKey,
bank.publicKey,
bank.vault,
// BTC token account
new PublicKey('CzCgYE7hcWSM6T5iN1ev5zNHbPmywAqZQkStefVcADAL'),
btcDevnetOracle,
admin.publicKey,
500,
false,
2022-03-31 06:58:12 -07:00
);
// log
const freshBank = await getBank(client, bank.publicKey);
console.log(freshBank.toString());
2022-03-31 06:58:12 -07:00
const freshAccount = await getMangoAccount(client, account.publicKey);
console.log(
`Mango account ${freshAccount.getNativeDeposit(
freshBank,
)} Deposits for bank ${freshBank.tokenIndex}`,
2022-03-31 06:58:12 -07:00
);
// close
await closeMangoAccount(client, account.publicKey, admin.publicKey);
accounts = await getMangoAccountsForGroupAndOwner(
client,
group.publicKey,
admin.publicKey,
2022-03-31 06:58:12 -07:00
);
if (accounts.length === 0) {
console.log(`Closed account ${account.publicKey}`);
2022-03-31 04:30:05 -07:00
}
process.exit(0);
}
main();