cleanup tcs
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
parent
5008d3253c
commit
ef2df16f83
|
@ -1,7 +1,6 @@
|
|||
import { AnchorProvider, Wallet } from '@coral-xyz/anchor';
|
||||
import { Cluster, Connection, Keypair, PublicKey } from '@solana/web3.js';
|
||||
import fs from 'fs';
|
||||
import { TokenIndex } from '../../src/accounts/bank';
|
||||
import { MangoClient } from '../../src/client';
|
||||
import { MANGO_V4_ID } from '../../src/constants';
|
||||
|
||||
|
@ -38,30 +37,32 @@ async function main(): Promise<void> {
|
|||
);
|
||||
|
||||
let account = await client.getMangoAccount(new PublicKey(MANGO_ACCOUNT_PK));
|
||||
await Promise.all(
|
||||
account.tokenConditionalSwaps.map((tcs, i) => {
|
||||
if (!tcs.hasData) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
client.tokenConditionalSwapCancel(group, account, i, tcs.id);
|
||||
}),
|
||||
);
|
||||
// await Promise.all(
|
||||
// account.tokenConditionalSwaps.map((tcs, i) => {
|
||||
// if (!tcs.hasData) {
|
||||
// return Promise.resolve();
|
||||
// }
|
||||
// client.tokenConditionalSwapCancel(group, account, i, tcs.id);
|
||||
// }),
|
||||
// );
|
||||
|
||||
await client.tokenConditionalSwapStopLoss(
|
||||
group,
|
||||
account,
|
||||
group.getFirstBankByTokenIndex(0 as TokenIndex).mint,
|
||||
group.getFirstBankByTokenIndex(6 as TokenIndex).mint,
|
||||
account.getTokenBalanceUi(
|
||||
group.getFirstBankByTokenIndex(6 as TokenIndex),
|
||||
),
|
||||
null,
|
||||
group.getFirstBankByTokenIndex(6 as TokenIndex).uiPrice * 1.1,
|
||||
0,
|
||||
2,
|
||||
);
|
||||
// console.log(group.getPriceImpactByTokenIndex(6 as TokenIndex, 10000));
|
||||
|
||||
account = await client.getMangoAccount(new PublicKey(MANGO_ACCOUNT_PK));
|
||||
// await client.tokenConditionalSwapStopLoss(
|
||||
// group,
|
||||
// account,
|
||||
// group.getFirstBankByTokenIndex(0 as TokenIndex).mint,
|
||||
// group.getFirstBankByTokenIndex(6 as TokenIndex).mint,
|
||||
// account.getTokenBalanceUi(
|
||||
// group.getFirstBankByTokenIndex(6 as TokenIndex),
|
||||
// ),
|
||||
// null,
|
||||
// group.getFirstBankByTokenIndex(6 as TokenIndex).uiPrice * 1.1,
|
||||
// 0,
|
||||
// 2,
|
||||
// );
|
||||
|
||||
// account = await client.getMangoAccount(new PublicKey(MANGO_ACCOUNT_PK));
|
||||
console.log(account.tokenConditionalSwaps[0].toString(group));
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
|
|
@ -506,7 +506,7 @@ export class Group {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns a price impact, between 0 to 1 for a token,
|
||||
* Returns a price impact in percentage, between 0 to 100 for a token,
|
||||
* returns -1 if data is bad
|
||||
*/
|
||||
public getPriceImpactByTokenIndex(
|
||||
|
|
|
@ -204,10 +204,6 @@ export class MangoAccount {
|
|||
return this.perps.filter((perp) => perp.isActive());
|
||||
}
|
||||
|
||||
public tokenConditionalSwapsActive(): TokenConditionalSwap[] {
|
||||
return this.tokenConditionalSwaps.filter((tcs) => tcs.hasData);
|
||||
}
|
||||
|
||||
public perpOrdersActive(): PerpOo[] {
|
||||
return this.perpOpenOrders.filter(
|
||||
(oo) => oo.orderMarket !== PerpOo.OrderMarketUnset,
|
||||
|
@ -1835,7 +1831,7 @@ export class TokenConditionalSwap {
|
|||
return toUiDecimals(this.sold, sellBank.mintDecimals);
|
||||
}
|
||||
|
||||
getExpiryTimestamp(): number {
|
||||
getExpiryTimestampInEpochSeconds(): number {
|
||||
return this.expiryTimestamp.toNumber();
|
||||
}
|
||||
|
||||
|
|
|
@ -66,7 +66,12 @@ import {
|
|||
TokenEditParams,
|
||||
buildIxGate,
|
||||
} from './clientIxParamBuilder';
|
||||
import { MANGO_V4_ID, OPENBOOK_PROGRAM_ID, RUST_U64_MAX } from './constants';
|
||||
import {
|
||||
MANGO_V4_ID,
|
||||
OPENBOOK_PROGRAM_ID,
|
||||
RUST_U64_MAX,
|
||||
USDC_MINT,
|
||||
} from './constants';
|
||||
import { Id } from './ids';
|
||||
import { IDL, MangoV4 } from './mango_v4';
|
||||
import { I80F48 } from './numbers/I80F48';
|
||||
|
@ -3369,29 +3374,62 @@ export class MangoClient {
|
|||
return await this.sendAndConfirmTransactionForGroup(group, [ix]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example:
|
||||
* For a stop loss on SOL, assuming SOL/USDC pair
|
||||
* priceLowerLimit - e.g.
|
||||
*
|
||||
* @param group
|
||||
* @param account
|
||||
* @param sellMintPk - would be SOL mint
|
||||
* @param priceLowerLimit - priceLowerLimit would be greater than priceUpperLimit e.g. if SOL is at 25$, then priceLowerLimit could be 22$
|
||||
* @param buyMintPk - would be USDC mint
|
||||
* @param priceUpperLimit - priceLowerLimit would be greater than priceUpperLimit e.g. if SOL is at 25$, then priceUpperLimit could be 0$
|
||||
* @param maxSell - max ui amount of tokens to sell, e.g. account.getTokenBalanceUi(solBank)
|
||||
* @param pricePremiumFraction - premium in % the liquidator earns for executing this stop loss, this can be the slippage usually found for a particular size plus some buffer
|
||||
* @param expiryTimestamp - is epoch in seconds at which this stop loss should expire, set null if you want it to never expire
|
||||
* @returns
|
||||
*/
|
||||
public async tokenConditionalSwapStopLoss(
|
||||
group: Group,
|
||||
account: MangoAccount,
|
||||
buyMintPk: PublicKey,
|
||||
sellMintPk: PublicKey,
|
||||
maxSell: number,
|
||||
priceLowerLimit: number,
|
||||
buyMintPk: PublicKey | null,
|
||||
priceUpperLimit: number | null,
|
||||
maxSell: number | null,
|
||||
pricePremiumFraction: number | null,
|
||||
expiryTimestamp: number | null,
|
||||
priceLowerLimit: number, // Note: priceLowerLimit should be higher than priceUpperLimit
|
||||
priceUpperLimit: number,
|
||||
pricePremiumFraction: number,
|
||||
): Promise<TransactionSignature> {
|
||||
const buyBank: Bank = group.getFirstBankByMint(buyMintPk);
|
||||
const buyBank: Bank = group.getFirstBankByMint(buyMintPk ?? USDC_MINT);
|
||||
const sellBank: Bank = group.getFirstBankByMint(sellMintPk);
|
||||
|
||||
priceUpperLimit = priceUpperLimit ?? 0;
|
||||
maxSell = maxSell ?? account.getTokenBalanceUi(sellBank);
|
||||
pricePremiumFraction = group.getPriceImpactByTokenIndex(
|
||||
sellBank.tokenIndex,
|
||||
maxSell * sellBank.uiPrice,
|
||||
);
|
||||
pricePremiumFraction =
|
||||
pricePremiumFraction != -1 ? pricePremiumFraction : 0.3;
|
||||
const expiryTimestampBn =
|
||||
expiryTimestamp !== null ? new BN(expiryTimestamp) : U64_MAX_BN;
|
||||
|
||||
const tcsIx = await this.program.methods
|
||||
.tokenConditionalSwapCreate(
|
||||
U64_MAX_BN,
|
||||
toNative(maxSell, sellBank.mintDecimals),
|
||||
expiryTimestamp !== null ? new BN(expiryTimestamp) : U64_MAX_BN,
|
||||
expiryTimestampBn,
|
||||
(1 / priceLowerLimit) *
|
||||
Math.pow(10, sellBank.mintDecimals - buyBank.mintDecimals),
|
||||
(1 / priceUpperLimit) *
|
||||
Math.pow(10, sellBank.mintDecimals - buyBank.mintDecimals),
|
||||
pricePremiumFraction / 100,
|
||||
pricePremiumFraction != null
|
||||
? pricePremiumFraction / 100
|
||||
: group.getPriceImpactByTokenIndex(
|
||||
sellBank.tokenIndex,
|
||||
maxSell * sellBank.uiPrice,
|
||||
),
|
||||
true,
|
||||
false,
|
||||
)
|
||||
|
|
|
@ -21,3 +21,5 @@ export const MANGO_V4_ID = {
|
|||
devnet: new PublicKey('4MangoMjqJ2firMokCjjGgoK8d4MXcrgL7XJaL3w6fVg'),
|
||||
'mainnet-beta': new PublicKey('4MangoMjqJ2firMokCjjGgoK8d4MXcrgL7XJaL3w6fVg'),
|
||||
};
|
||||
|
||||
export const USDC_MINT = new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v');
|
||||
|
|
|
@ -53,7 +53,7 @@ export type PriceImpact = {
|
|||
};
|
||||
|
||||
/**
|
||||
* Returns price impact in bps,
|
||||
* Returns price impact in bps i.e. 0 to 10,000
|
||||
* returns -1 if data is missing
|
||||
*/
|
||||
export function computePriceImpactOnJup(
|
||||
|
|
Loading…
Reference in New Issue