From 3e1130c0c4d92ad40dd66cabd5ea0c1f0187e414 Mon Sep 17 00:00:00 2001 From: Riordan Panayides Date: Thu, 20 May 2021 21:02:51 +0100 Subject: [PATCH 1/2] Add new token decimals, get token symbols from serum --- src/client.ts | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/client.ts b/src/client.ts index c5d81ae..91e9ac0 100644 --- a/src/client.ts +++ b/src/client.ts @@ -35,7 +35,14 @@ import { uiToNative, zeroKey, } from './utils'; -import { getFeeRates, getFeeTier, Market, OpenOrders, Orderbook } from '@project-serum/serum'; +import { + getFeeRates, + getFeeTier, + Market, + OpenOrders, + Orderbook, + TOKEN_MINTS +} from '@project-serum/serum'; import { SRM_DECIMALS } from '@project-serum/serum/lib/token-instructions'; import { Order } from '@project-serum/serum/lib/market'; import Wallet from '@project-serum/sol-wallet-adapter'; @@ -52,12 +59,13 @@ import { TOKEN_PROGRAM_ID } from '@solana/spl-token'; export const tokenToDecimals = { "BTC": 4, "ETH": 3, + "SOL": 2, + "SRM": 2, "USDT": 2, - "USDC": 2 + "USDC": 2, + "WUSDT": 2, } - - export class MangoGroup { publicKey: PublicKey; @@ -158,6 +166,9 @@ export class MangoGroup { getUiTotalBorrow(tokenIndex: number): number { return nativeToUi(this.totalBorrows[tokenIndex] * this.indexes[tokenIndex].borrow, this.mintDecimals[tokenIndex]) } + getTokenSymbol(tokenIndex: number): string { + return TOKEN_MINTS.find((m) => m.address.toString() === this.tokens[tokenIndex].toString())?.name || ''; + } } export class MarginAccount { @@ -223,16 +234,14 @@ export class MarginAccount { `${"Token".padEnd(5)} ${"Assets".padEnd(10)} ${"Deposits".padEnd(10)} ${"Borrows".padEnd(10)}`, ] - - const tokenNames = ["BTC", "ETH", "USDT"] // TODO pull this from somewhere - for (let i = 0; i < mangoGroup.tokens.length; i++) { - const decimals = tokenToDecimals[tokenNames[i]] + const tokenSymbol = mangoGroup.getTokenSymbol(i) + const decimals = tokenToDecimals[tokenSymbol] const assetStr = this.getAssets(mangoGroup)[i].toFixed(decimals).toString().padEnd(10) const depositStr = this.getUiDeposit(mangoGroup, i).toFixed(decimals).toString().padEnd(10) const borrowStr = this.getUiBorrow(mangoGroup, i).toFixed(decimals).toString().padEnd(10) lines.push( - `${tokenNames[i].padEnd(5)} ${assetStr} ${depositStr} ${borrowStr}` + `${tokenSymbol.padEnd(5)} ${assetStr} ${depositStr} ${borrowStr}` ) } From 90b5a0a2c0ac2a0c99d315b6a498c66774cb6917 Mon Sep 17 00:00:00 2001 From: Riordan Panayides Date: Thu, 20 May 2021 21:25:31 +0100 Subject: [PATCH 2/2] add hasBorrows to marginaccount layout, add function to get all accounts with borrows --- src/client.ts | 25 +++++++++++++++++++++---- src/layout.ts | 3 ++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/client.ts b/src/client.ts index 91e9ac0..df0bb60 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1335,23 +1335,27 @@ export class MangoClient { async getAllMarginAccounts( connection: Connection, programId: PublicKey, - mangoGroup: MangoGroup + mangoGroup: MangoGroup, + filters?: [any] ): Promise { - const filters = [ + const marginAccountsFilters = [ { memcmp: { offset: MarginAccountLayout.offsetOf('mangoGroup'), bytes: mangoGroup.publicKey.toBase58(), } }, - { dataSize: MarginAccountLayout.span, }, ]; - const marginAccountsProms = getFilteredProgramAccounts(connection, programId, filters) + if(filters && filters.length) { + marginAccountsFilters.push(...filters); + } + + const marginAccountsProms = getFilteredProgramAccounts(connection, programId, marginAccountsFilters) .then((accounts) => ( accounts.map(({ publicKey, accountInfo }) => new MarginAccount(publicKey, MarginAccountLayout.decode(accountInfo == null ? undefined : accountInfo.data)) @@ -1400,6 +1404,19 @@ export class MangoClient { return marginAccounts } + async getAllMarginAccountsWithBorrows( + connection: Connection, + programId: PublicKey, + mangoGroup: MangoGroup + ): Promise { + return await this.getAllMarginAccounts(connection, programId, mangoGroup, [{ + memcmp: { + offset: MarginAccountLayout.offsetOf('hasBorrows'), + bytes: 1 + } + }]) + } + async getMarginAccountsForOwner( connection: Connection, programId: PublicKey, diff --git a/src/layout.ts b/src/layout.ts index 0726015..db31af1 100644 --- a/src/layout.ts +++ b/src/layout.ts @@ -156,7 +156,8 @@ export const MarginAccountLayout = struct([ seq(U64F64(), NUM_TOKENS, 'borrows'), seq(publicKeyLayout(), NUM_MARKETS, 'openOrders'), u8('beingLiquidated'), - seq(u8(), 7, 'padding') + u8('hasBorrows'), + seq(u8(), 6, 'padding') ]); export const MangoSrmAccountLayout = struct([