/// import { AccountInfo, BlockhashWithExpiryBlockHeight, Commitment, Connection, Keypair, PublicKey, Transaction, TransactionConfirmationStatus, TransactionSignature } from '@solana/web3.js'; import BN from 'bn.js'; import { AssetType, MangoCache } from './layout'; import MangoAccount from './MangoAccount'; import PerpMarket from './PerpMarket'; import RootBank from './RootBank'; import { Market } from '@project-serum/serum'; import { I80F48 } from './utils/fixednum'; import { Order } from '@project-serum/serum/lib/market'; import { PerpOrderType, Payer } from './utils/types'; import { PerpOrder } from './book'; import MangoGroup from './MangoGroup'; import { ReferrerIdRecord } from './layout'; /** * Get the current epoch timestamp in seconds with microsecond precision */ export declare const getUnixTs: () => number; declare type AccountWithPnl = { publicKey: PublicKey; pnl: I80F48; }; /** * A class for interacting with the Mango V3 Program * * @param connection A solana web.js Connection object * @param programId The PublicKey of the Mango V3 Program * @param opts An object used to configure the MangoClient. Accepts a postSendTxCallback */ export declare class MangoClient { connection: Connection; sendConnection?: Connection; programId: PublicKey; lastSlot: number; lastValidBlockHeight: number; timeout: number | null; blockhashCommitment: Commitment; postSendTxCallback?: ({ txid: string }: { txid: any; }) => void; prioritizationFee: number; constructor(connection: Connection, programId: PublicKey, opts?: { postSendTxCallback?: ({ txid }: { txid: string; }) => void; maxStoredBlockhashes?: number; blockhashCommitment?: Commitment; timeout?: number; sendConnection?: Connection; prioritizationFee?: number; }); sendTransactions(transactionAndSigners: { transaction: Transaction; signers?: Keypair[]; }[], payer: Payer, timeout?: number | null, confirmLevel?: TransactionConfirmationStatus): Promise; getCurrentBlockhash(): Promise; signTransaction({ transaction, payer, signers, currentBlockhash, }: { transaction: Transaction; payer: any; signers: Array; currentBlockhash?: BlockhashWithExpiryBlockHeight; }): Promise; signTransactions({ transactionsAndSigners, payer, currentBlockhash, }: { transactionsAndSigners: { transaction: Transaction; signers?: Array; }[]; payer: Payer; currentBlockhash?: BlockhashWithExpiryBlockHeight; }): Promise; /** * Send a transaction using the Solana Web3.js connection on the mango client * * @param transaction * @param payer * @param additionalSigners * @param timeout Retries sending the transaction and trying to confirm it until the given timeout. Passing null will disable the transaction confirmation check and always return success. */ sendTransaction(transaction: Transaction, payer: Payer, additionalSigners: Keypair[], timeout?: number | null, confirmLevel?: TransactionConfirmationStatus): Promise; sendSignedTransaction({ signedTransaction, timeout, confirmLevel, signedAtBlock, }: { signedTransaction: Transaction; timeout?: number | null; confirmLevel?: TransactionConfirmationStatus; signedAtBlock?: BlockhashWithExpiryBlockHeight; }): Promise; awaitTransactionSignatureConfirmation(txid: TransactionSignature, timeout: number, confirmLevel: TransactionConfirmationStatus, signedAtBlock?: BlockhashWithExpiryBlockHeight): Promise; /** * Create a new Mango group */ initMangoGroup(quoteMint: PublicKey, msrmMint: PublicKey, dexProgram: PublicKey, feesVault: PublicKey, // owned by Mango DAO token governance validInterval: number, quoteOptimalUtil: number, quoteOptimalRate: number, quoteMaxRate: number, payer: Payer): Promise; /** * Retrieve information about a Mango Group */ getMangoGroup(mangoGroup: PublicKey): Promise; /** * DEPRECATED - Create a new Mango Account on a given group */ initMangoAccount(mangoGroup: MangoGroup, owner: Payer): Promise; /** * Create a new Mango Account (PDA) on a given group */ createMangoAccount(mangoGroup: MangoGroup, owner: Payer, accountNum: number, payerPk?: PublicKey): Promise; /** * Upgrade a Mango Account from V0 (not deletable) to V1 (deletable) */ upgradeMangoAccountV0V1(mangoGroup: MangoGroup, owner: Payer, accountNum: number): Promise; /** * Retrieve information about a Mango Account */ getMangoAccount(mangoAccountPk: PublicKey, dexProgramId: PublicKey): Promise; /** * Create a new Mango Account and deposit some tokens in a single transaction * * @param rootBank The RootBank for the deposit currency * @param nodeBank The NodeBank asociated with the RootBank * @param vault The token account asociated with the NodeBank * @param tokenAcc The token account to transfer from * @param info An optional UI name for the account */ initMangoAccountAndDeposit(mangoGroup: MangoGroup, owner: Payer, rootBank: PublicKey, nodeBank: PublicKey, vault: PublicKey, tokenAcc: PublicKey, quantity: number, info?: string): Promise; /** * Create a new Mango Account (PDA) and deposit some tokens in a single transaction * * @param rootBank The RootBank for the deposit currency * @param nodeBank The NodeBank asociated with the RootBank * @param vault The token account asociated with the NodeBank * @param tokenAcc The token account to transfer from * @param info An optional UI name for the account */ createMangoAccountAndDeposit(mangoGroup: MangoGroup, owner: Payer, rootBank: PublicKey, nodeBank: PublicKey, vault: PublicKey, tokenAcc: PublicKey, quantity: number, accountNum: number, info?: string, referrerPk?: PublicKey, payerPk?: PublicKey): Promise<[string, TransactionSignature] | undefined>; /** * Deposit tokens in a Mango Account * * @param rootBank The RootBank for the deposit currency * @param nodeBank The NodeBank asociated with the RootBank * @param vault The token account asociated with the NodeBank * @param tokenAcc The token account to transfer from */ deposit(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, rootBank: PublicKey, nodeBank: PublicKey, vault: PublicKey, tokenAcc: PublicKey, quantity: number): Promise; /** * Withdraw tokens from a Mango Account * * @param rootBank The RootBank for the withdrawn currency * @param nodeBank The NodeBank asociated with the RootBank * @param vault The token account asociated with the NodeBank * @param allowBorrow Whether to borrow tokens if there are not enough deposits for the withdrawal */ withdraw(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, rootBank: PublicKey, nodeBank: PublicKey, vault: PublicKey, quantity: number, allowBorrow: boolean): Promise; /** * Withdraw tokens from a Mango Account, only passing open orders accounts in the margin basket * * @param rootBank The RootBank for the withdrawn currency * @param nodeBank The NodeBank asociated with the RootBank * @param vault The token account asociated with the NodeBank * @param allowBorrow Whether to borrow tokens if there are not enough deposits for the withdrawal */ withdraw2(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, rootBank: PublicKey, nodeBank: PublicKey, vault: PublicKey, quantity: number, allowBorrow: boolean): Promise; withdrawAll(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer): Promise; /** * Called by the Keeper to cache interest rates from the RootBanks */ cacheRootBanks(mangoGroup: PublicKey, mangoCache: PublicKey, rootBanks: PublicKey[], payer: Payer): Promise; /** * Called by the Keeper to cache prices from the Oracles */ cachePrices(mangoGroup: PublicKey, mangoCache: PublicKey, oracles: PublicKey[], payer: Payer): Promise; /** * Called by the Keeper to cache perp market funding */ cachePerpMarkets(mangoGroup: PublicKey, mangoCache: PublicKey, perpMarkets: PublicKey[], payer: Keypair): Promise; /** * Called by the Keeper to update interest rates on the RootBanks */ updateRootBank(mangoGroup: MangoGroup, rootBank: PublicKey, nodeBanks: PublicKey[], payer: Payer): Promise; /** * Called by the Keeper to process events on the Perp order book */ consumeEvents(mangoGroup: MangoGroup, perpMarket: PerpMarket, mangoAccounts: PublicKey[], payer: Keypair, limit: BN): Promise; /** * Called by the Keeper to update funding on the perp markets */ updateFunding(mangoGroup: PublicKey, mangoCache: PublicKey, perpMarket: PublicKey, bids: PublicKey, asks: PublicKey, payer: Keypair): Promise; /** * Retrieve information about a perp market */ getPerpMarket(perpMarketPk: PublicKey, baseDecimal: number, quoteDecimal: number): Promise; /** * Place an order on a perp market * * @param clientOrderId An optional id that can be used to correlate events related to your order * @param bookSideInfo Account info for asks if side === bid, bids if side === ask. If this is given, crank instruction is added */ placePerpOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, mangoCache: PublicKey, // TODO - remove; already in MangoGroup perpMarket: PerpMarket, owner: Payer, side: 'buy' | 'sell', price: number, quantity: number, orderType?: PerpOrderType, clientOrderId?: number, bookSideInfo?: AccountInfo, reduceOnly?: boolean, referrerMangoAccountPk?: PublicKey): Promise; /** * Place an order on a perp market * * @param clientOrderId An optional id that can be used to correlate events related to your order * @param bookSideInfo Account info for asks if side === bid, bids if side === ask. If this is given, crank instruction is added */ placePerpOrder2(mangoGroup: MangoGroup, mangoAccount: MangoAccount, perpMarket: PerpMarket, owner: Payer, side: 'buy' | 'sell', price: number, quantity: number, options?: { maxQuoteQuantity?: number; limit?: number; orderType?: PerpOrderType; clientOrderId?: number; bookSideInfo?: AccountInfo; reduceOnly?: boolean; referrerMangoAccountPk?: PublicKey; expiryTimestamp?: number; }): Promise; /** * Cancel an order on a perp market * * @param invalidIdOk Don't throw error if order is invalid */ cancelPerpOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, perpMarket: PerpMarket, order: PerpOrder, invalidIdOk?: boolean): Promise; /** * Cancel all perp orders across all markets */ cancelAllPerpOrders(group: MangoGroup, perpMarkets: PerpMarket[], mangoAccount: MangoAccount, owner: Payer, ownerIsSigner?: boolean): Promise; /** * Add a new oracle to a group */ addOracle(mangoGroup: MangoGroup, oracle: PublicKey, admin: Keypair): Promise; /** * Set the price of a 'stub' type oracle */ setOracle(mangoGroup: MangoGroup, oracle: PublicKey, admin: Keypair, price: I80F48): Promise; addSpotMarket(mangoGroup: MangoGroup, oracle: PublicKey, spotMarket: PublicKey, mint: PublicKey, admin: Keypair, maintLeverage: number, initLeverage: number, liquidationFee: number, optimalUtil: number, optimalRate: number, maxRate: number): Promise; /** * Make sure mangoAccount has recent and valid inMarginBasket and spotOpenOrders */ placeSpotOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, mangoCache: PublicKey, spotMarket: Market, owner: Payer, side: 'buy' | 'sell', price: number, size: number, orderType?: 'limit' | 'ioc' | 'postOnly', clientId?: BN): Promise; /** * Make sure mangoAccount has recent and valid inMarginBasket and spotOpenOrders */ placeSpotOrder2(mangoGroup: MangoGroup, mangoAccount: MangoAccount, spotMarket: Market, owner: Payer, side: 'buy' | 'sell', price: number, size: number, orderType?: 'limit' | 'ioc' | 'postOnly', clientOrderId?: BN, useMsrmVault?: boolean | undefined): Promise; cancelSpotOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, spotMarket: Market, order: Order): Promise; settleFunds(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, spotMarket: Market): Promise; /** * Assumes spotMarkets contains all Markets in MangoGroup in order */ settleAll(mangoGroup: MangoGroup, mangoAccount: MangoAccount, spotMarkets: Market[], owner: Payer): Promise; fetchTopPnlAccountsFromRPC(mangoGroup: MangoGroup, mangoCache: MangoCache, perpMarket: PerpMarket, price: I80F48, // should be the MangoCache price sign: number, mangoAccounts?: MangoAccount[]): Promise; fetchTopPnlAccountsFromDB(mangoGroup: MangoGroup, perpMarket: PerpMarket, sign: number): Promise; /** * Automatically fetch MangoAccounts for this PerpMarket * Pick enough MangoAccounts that have opposite sign and send them in to get settled */ settlePnl(mangoGroup: MangoGroup, mangoCache: MangoCache, mangoAccount: MangoAccount, perpMarket: PerpMarket, quoteRootBank: RootBank, price: I80F48, // should be the MangoCache price owner: Payer, mangoAccounts?: MangoAccount[]): Promise; /** * Settle all perp accounts with positive pnl */ settlePosPnl(mangoGroup: MangoGroup, mangoCache: MangoCache, mangoAccount: MangoAccount, perpMarkets: PerpMarket[], quoteRootBank: RootBank, owner: Payer, mangoAccounts?: MangoAccount[]): Promise; /** * Settle all perp accounts with any pnl */ settleAllPerpPnl(mangoGroup: MangoGroup, mangoCache: MangoCache, mangoAccount: MangoAccount, perpMarkets: PerpMarket[], quoteRootBank: RootBank, owner: Payer, mangoAccounts?: MangoAccount[]): Promise<(TransactionSignature | null)[]>; getMangoAccountsForOwner(mangoGroup: MangoGroup, owner: PublicKey, includeOpenOrders?: boolean): Promise; /** * Get all MangoAccounts where `delegate` pubkey has authority */ getMangoAccountsForDelegate(mangoGroup: MangoGroup, delegate: PublicKey, includeOpenOrders?: boolean): Promise; getAllMangoAccounts(mangoGroup: MangoGroup, filters?: any[], includeOpenOrders?: boolean): Promise; addStubOracle(mangoGroupPk: PublicKey, admin: Keypair): Promise; setStubOracle(mangoGroupPk: PublicKey, oraclePk: PublicKey, admin: Keypair, price: number): Promise; addPerpMarket(mangoGroup: MangoGroup, oraclePk: PublicKey, mngoMintPk: PublicKey, admin: Keypair, maintLeverage: number, initLeverage: number, liquidationFee: number, makerFee: number, takerFee: number, baseLotSize: number, quoteLotSize: number, maxNumEvents: number, rate: number, // liquidity mining params; set rate == 0 if no liq mining maxDepthBps: number, targetPeriodLength: number, mngoPerPeriod: number, exp: number): Promise; createPerpMarket(mangoGroup: MangoGroup, oraclePk: PublicKey, mngoMintPk: PublicKey, admin: Payer, maintLeverage: number, initLeverage: number, liquidationFee: number, makerFee: number, takerFee: number, baseLotSize: number, quoteLotSize: number, maxNumEvents: number, rate: number, // liquidity mining params; set rate == 0 if no liq mining maxDepthBps: number, targetPeriodLength: number, mngoPerPeriod: number, exp: number, version: number, lmSizeShift: number, baseDecimals: number): Promise; forceCancelSpotOrders(mangoGroup: MangoGroup, liqeeMangoAccount: MangoAccount, spotMarket: Market, baseRootBank: RootBank, quoteRootBank: RootBank, payer: Keypair, limit: BN): Promise; /** * Send multiple instructions to cancel all perp orders in this market */ forceCancelAllPerpOrdersInMarket(mangoGroup: MangoGroup, liqee: MangoAccount, perpMarket: PerpMarket, payer: Payer, limitPerInstruction: number): Promise; forceCancelPerpOrders(mangoGroup: MangoGroup, liqeeMangoAccount: MangoAccount, perpMarket: PerpMarket, payer: Keypair, limit: BN): Promise; liquidateTokenAndToken(mangoGroup: MangoGroup, liqeeMangoAccount: MangoAccount, liqorMangoAccount: MangoAccount, assetRootBank: RootBank, liabRootBank: RootBank, payer: Keypair, maxLiabTransfer: I80F48): Promise; liquidateTokenAndPerp(mangoGroup: MangoGroup, liqeeMangoAccount: MangoAccount, liqorMangoAccount: MangoAccount, rootBank: RootBank, payer: Keypair, assetType: AssetType, assetIndex: number, liabType: AssetType, liabIndex: number, maxLiabTransfer: I80F48): Promise; liquidatePerpMarket(mangoGroup: MangoGroup, liqeeMangoAccount: MangoAccount, liqorMangoAccount: MangoAccount, perpMarket: PerpMarket, payer: Keypair, baseTransferRequest: BN): Promise; settleFees(mangoGroup: MangoGroup, mangoAccount: MangoAccount, perpMarket: PerpMarket, rootBank: RootBank, payer: Keypair): Promise; resolvePerpBankruptcy(mangoGroup: MangoGroup, liqeeMangoAccount: MangoAccount, liqorMangoAccount: MangoAccount, perpMarket: PerpMarket, rootBank: RootBank, payer: Keypair, liabIndex: number, maxLiabTransfer: I80F48): Promise; resolveTokenBankruptcy(mangoGroup: MangoGroup, liqeeMangoAccount: MangoAccount, liqorMangoAccount: MangoAccount, quoteRootBank: RootBank, liabRootBank: RootBank, payer: Keypair, maxLiabTransfer: I80F48): Promise; redeemMngo(mangoGroup: MangoGroup, mangoAccount: MangoAccount, perpMarket: PerpMarket, payer: Payer, mngoRootBank: PublicKey, mngoNodeBank: PublicKey, mngoVault: PublicKey): Promise; redeemAllMngo(mangoGroup: MangoGroup, mangoAccount: MangoAccount, payer: Payer, mngoRootBank: PublicKey, mngoNodeBank: PublicKey, mngoVault: PublicKey): Promise; addMangoAccountInfo(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, info: string): Promise; depositMsrm(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, msrmAccount: PublicKey, quantity: number): Promise; withdrawMsrm(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, msrmAccount: PublicKey, quantity: number): Promise; changePerpMarketParams(mangoGroup: MangoGroup, perpMarket: PerpMarket, admin: Payer, maintLeverage: number | undefined, initLeverage: number | undefined, liquidationFee: number | undefined, makerFee: number | undefined, takerFee: number | undefined, rate: number | undefined, maxDepthBps: number | undefined, targetPeriodLength: number | undefined, mngoPerPeriod: number | undefined, exp: number | undefined): Promise; changePerpMarketParams2(mangoGroup: MangoGroup, perpMarket: PerpMarket, admin: Payer, maintLeverage: number | undefined, initLeverage: number | undefined, liquidationFee: number | undefined, makerFee: number | undefined, takerFee: number | undefined, rate: number | undefined, maxDepthBps: number | undefined, targetPeriodLength: number | undefined, mngoPerPeriod: number | undefined, exp: number | undefined, version: number | undefined, lmSizeShift: number | undefined): Promise; setGroupAdmin(mangoGroup: MangoGroup, newAdmin: PublicKey, admin: Payer): Promise; /** * Add allowance for orders to be cancelled and replaced in a single transaction */ modifySpotOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, mangoCache: PublicKey, spotMarket: Market, owner: Payer, order: Order, side: 'buy' | 'sell', price: number, size: number, orderType?: 'limit' | 'ioc' | 'postOnly'): Promise; modifyPerpOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, mangoCache: PublicKey, perpMarket: PerpMarket, owner: Payer, order: PerpOrder, side: 'buy' | 'sell', price: number, quantity: number, orderType?: PerpOrderType, clientOrderId?: number, bookSideInfo?: AccountInfo, // ask if side === bid, bids if side === ask; if this is given; crank instruction is added invalidIdOk?: boolean, // Don't throw error if order is invalid referrerMangoAccountPk?: PublicKey): Promise; addPerpTriggerOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, perpMarket: PerpMarket, owner: Payer, orderType: PerpOrderType, side: 'buy' | 'sell', price: number, quantity: number, triggerCondition: 'above' | 'below', triggerPrice: number, reduceOnly: boolean, clientOrderId?: number): Promise; removeAdvancedOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, owner: Payer, orderIndex: number): Promise; executePerpTriggerOrder(mangoGroup: MangoGroup, mangoAccount: MangoAccount, mangoCache: MangoCache, perpMarket: PerpMarket, payer: Payer, orderIndex: number): Promise; closeAdvancedOrders(mangoGroup: MangoGroup, mangoAccount: MangoAccount, payer: Payer): Promise; closeSpotOpenOrders(mangoGroup: MangoGroup, mangoAccount: MangoAccount, payer: Payer, marketIndex: number, ownerIsSigner?: boolean): Promise; closeMangoAccount(mangoGroup: MangoGroup, mangoAccount: MangoAccount, payer: Payer): Promise; createDustAccount(mangoGroup: MangoGroup, payer: Payer): Promise; resolveDust(mangoGroup: MangoGroup, mangoAccount: MangoAccount, rootBank: RootBank, mangoCache: MangoCache, payer: Payer): Promise; updateMarginBasket(mangoGroup: MangoGroup, mangoAccount: MangoAccount, payer: Payer): Promise; resolveAllDust(mangoGroup: MangoGroup, mangoAccount: MangoAccount, mangoCache: MangoCache, payer: Payer): Promise; emptyAndCloseMangoAccount(mangoGroup: MangoGroup, mangoAccount: MangoAccount, mangoCache: MangoCache, mngoIndex: number, payer: Payer): Promise; cancelPerpOrderSide(mangoGroup: MangoGroup, mangoAccount: MangoAccount, perpMarket: PerpMarket, payer: Payer, side: 'buy' | 'sell', limit: number): Promise; setDelegate(mangoGroup: MangoGroup, mangoAccount: MangoAccount, payer: Payer, delegate: PublicKey): Promise; changeSpotMarketParams(mangoGroup: MangoGroup, spotMarket: Market, rootBank: RootBank, admin: Payer, maintLeverage: number | undefined, initLeverage: number | undefined, liquidationFee: number | undefined, optimalUtil: number | undefined, optimalRate: number | undefined, maxRate: number | undefined, version: number | undefined): Promise; /** * Change the referral fee params * @param mangoGroup * @param admin * @param refSurcharge normal units 0.0001 -> 1 basis point * @param refShare * @param refMngoRequired ui units -> 1 -> 1_000_000 MNGO */ changeReferralFeeParams(mangoGroup: MangoGroup, admin: Payer, refSurcharge: number, refShare: number, refMngoRequired: number): Promise; setReferrerMemory(mangoGroup: MangoGroup, mangoAccount: MangoAccount, payer: Payer, // must be also owner of mangoAccount referrerMangoAccountPk: PublicKey): Promise; getReferrerPda(mangoGroup: MangoGroup, referrerId: string): Promise<{ referrerPda: PublicKey; encodedReferrerId: Buffer; }>; registerReferrerId(mangoGroup: MangoGroup, referrerMangoAccount: MangoAccount, payer: Payer, // will also owner of referrerMangoAccount referrerId: string): Promise; getReferrerIdsForMangoAccount(mangoAccount: MangoAccount): Promise; cancelAllSpotOrders(mangoGroup: MangoGroup, mangoAccount: MangoAccount, spotMarket: Market, owner: Payer, limit: number, ownerIsSigner?: boolean): Promise; ensureOpenOrdersAccount(mangoAccount: MangoAccount, mangoGroup: MangoGroup, payer: Keypair, spotMarket: Market, spotMarketConfig: any): Promise; } export {}; //# sourceMappingURL=client.d.ts.map