deploy->dev (#612)
* expose perp order type on perp order
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.9.17
* Fix funding rate method
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fix scrript
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.9.18
* ts-client v0.9.19
* fix script
* update reduce only and force close flags in ts client
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.13.1
* expose underlying property
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.13.2
* Fix bug in closing mango account (#559)
* reafactor code for collecting health accounts, fix bug where bank oracle was skipped while closing account
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
---------
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.13.3
* fix client code for building health accounts
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.13.4
* Fix bug in sim max serum3 bid
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.13.5
* increase charge
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* ts-client v0.14.0
* Fix getBorrowRate() to include loan upkeep
* ts-client v0.14.1
* Client: Move jup's CU ix outside of flash loan
That makes a flash loan based jup swap usable with delegates.
* liquidator: Don't attempt to close in-use token positions
This could happen if the user manually used serum on the liquidator
account.
* Mc/ci cd (#570)
* prettier
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fix branch
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
---------
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* rename
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Increase iterations for max swap to fix some edge case, fix debug script since fees are already accounted for
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.14.2
* Risk notification bot (#565)
* risk stuff
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* cleanup
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* client function
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
---------
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* fix
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.0
* fix risk computati
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.2
* Fix units
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* dont drop or rally stable assets
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* dont skip usdc
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fixes from review
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.3
* Fix
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.4
* update
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.5
* update
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.6
* add highlight
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.7
* Fix math
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* Fix
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.10
* Fix
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.15.12
* no-cors
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* use birdeye for prices
* try to override bad node-fetch code
* Mc/client simple setup (#611)
* make setting up of ts client easier
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* docs
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
---------
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* ts client: perp place order ix builders with self trade behavior (#609)
* ix builders for self trade behavior on perps
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* ix builders for self trade behavior on perps
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
---------
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.16.0
* typo
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* typo
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* move to new ixs
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
* v0.16.1
* Revert "try to override bad node-fetch code"
This reverts commit 468754d5ae
.
---------
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
Co-authored-by: Christian Kamm <mail@ckamm.de>
Co-authored-by: tjs <tjshipe@gmail.com>
This commit is contained in:
parent
f3f8359fd1
commit
6b2e9bbf12
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@blockworks-foundation/mango-v4",
|
||||
"version": "0.15.12",
|
||||
"version": "0.16.1",
|
||||
"description": "Typescript Client for mango-v4 program.",
|
||||
"repository": "https://github.com/blockworks-foundation/mango-v4",
|
||||
"author": {
|
||||
|
@ -72,6 +72,7 @@
|
|||
"node-kraken-api": "^2.2.2"
|
||||
},
|
||||
"resolutions": {
|
||||
"@coral-xyz/anchor": "^0.26.0",
|
||||
"**/@solana/web3.js/node-fetch": "https://github.com/blockworks-foundation/node-fetch.git#v2.6.11-fixed"
|
||||
},
|
||||
"license": "MIT"
|
||||
|
|
|
@ -120,7 +120,6 @@ async function main(): Promise<void> {
|
|||
|
||||
// deposit USDC
|
||||
let oldBalance = mangoAccount.getTokenBalance(
|
||||
group,
|
||||
group.getFirstBankByMint(new PublicKey(DEVNET_MINTS.get('USDC')!)),
|
||||
);
|
||||
await client.tokenDeposit(
|
||||
|
@ -131,7 +130,6 @@ async function main(): Promise<void> {
|
|||
);
|
||||
await mangoAccount.reload(client);
|
||||
let newBalance = mangoAccount.getTokenBalance(
|
||||
group,
|
||||
group.getFirstBankByMint(new PublicKey(DEVNET_MINTS.get('USDC')!)),
|
||||
);
|
||||
expect(toUiDecimalsForQuote(newBalance.sub(oldBalance)).toString()).equals(
|
||||
|
@ -159,7 +157,6 @@ async function main(): Promise<void> {
|
|||
// withdraw USDC
|
||||
console.log(`...withdrawing 1 USDC`);
|
||||
oldBalance = mangoAccount.getTokenBalance(
|
||||
group,
|
||||
group.getFirstBankByMint(new PublicKey(DEVNET_MINTS.get('USDC')!)),
|
||||
);
|
||||
await client.tokenWithdraw(
|
||||
|
@ -171,7 +168,6 @@ async function main(): Promise<void> {
|
|||
);
|
||||
await mangoAccount.reload(client);
|
||||
newBalance = mangoAccount.getTokenBalance(
|
||||
group,
|
||||
group.getFirstBankByMint(new PublicKey(DEVNET_MINTS.get('USDC')!)),
|
||||
);
|
||||
expect(toUiDecimalsForQuote(oldBalance.sub(newBalance)).toString()).equals(
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
PerpMarketIndex,
|
||||
PerpOrderSide,
|
||||
PerpOrderType,
|
||||
PerpSelfTradeBehavior,
|
||||
} from '../../src/accounts/perp';
|
||||
import { MangoClient } from '../../src/client';
|
||||
import { MANGO_V4_ID } from '../../src/constants';
|
||||
|
@ -506,7 +507,7 @@ async function makeMarketUpdateInstructions(
|
|||
|
||||
moveOrders = openOrders.length < 2;
|
||||
|
||||
const placeBidOPegIx = await client.perpPlaceOrderPeggedIx(
|
||||
const placeBidOPegIx = await client.perpPlaceOrderPeggedV2Ix(
|
||||
group,
|
||||
mangoAccount,
|
||||
perpMarketIndex,
|
||||
|
@ -519,12 +520,13 @@ async function makeMarketUpdateInstructions(
|
|||
undefined,
|
||||
Date.now(),
|
||||
PerpOrderType.limit,
|
||||
PerpSelfTradeBehavior.cancelProvide,
|
||||
false,
|
||||
expiryTimestamp,
|
||||
20,
|
||||
);
|
||||
|
||||
const placeAskOPegIx = await client.perpPlaceOrderPeggedIx(
|
||||
const placeAskOPegIx = await client.perpPlaceOrderPeggedV2Ix(
|
||||
group,
|
||||
mangoAccount,
|
||||
perpMarketIndex,
|
||||
|
@ -537,6 +539,7 @@ async function makeMarketUpdateInstructions(
|
|||
undefined,
|
||||
Date.now(),
|
||||
PerpOrderType.limit,
|
||||
PerpSelfTradeBehavior.cancelProvide,
|
||||
false,
|
||||
expiryTimestamp,
|
||||
20,
|
||||
|
@ -624,7 +627,7 @@ async function makeMarketUpdateInstructions(
|
|||
10,
|
||||
);
|
||||
|
||||
const placeBidIx = await client.perpPlaceOrderIx(
|
||||
const placeBidIx = await client.perpPlaceOrderV2Ix(
|
||||
group,
|
||||
mangoAccount,
|
||||
perpMarketIndex,
|
||||
|
@ -634,12 +637,13 @@ async function makeMarketUpdateInstructions(
|
|||
undefined,
|
||||
Date.now(),
|
||||
PerpOrderType.postOnlySlide,
|
||||
PerpSelfTradeBehavior.cancelProvide,
|
||||
false,
|
||||
expiryTimestamp,
|
||||
20,
|
||||
);
|
||||
|
||||
const placeAskIx = await client.perpPlaceOrderIx(
|
||||
const placeAskIx = await client.perpPlaceOrderV2Ix(
|
||||
group,
|
||||
mangoAccount,
|
||||
perpMarketIndex,
|
||||
|
@ -649,6 +653,7 @@ async function makeMarketUpdateInstructions(
|
|||
undefined,
|
||||
Date.now(),
|
||||
PerpOrderType.postOnlySlide,
|
||||
PerpSelfTradeBehavior.cancelProvide,
|
||||
false,
|
||||
expiryTimestamp,
|
||||
20,
|
||||
|
|
|
@ -867,6 +867,12 @@ export class InnerNode {
|
|||
constructor(public children: [number]) {}
|
||||
}
|
||||
|
||||
export class PerpSelfTradeBehavior {
|
||||
static decrementTake = { decrementTake: {} };
|
||||
static cancelProvide = { cancelProvide: {} };
|
||||
static abortTransaction = { abortTransaction: {} };
|
||||
}
|
||||
|
||||
export class PerpOrderSide {
|
||||
static bid = { bid: {} };
|
||||
static ask = { ask: {} };
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
import { AnchorProvider, BN, Program, Provider } from '@coral-xyz/anchor';
|
||||
import {
|
||||
AnchorProvider,
|
||||
BN,
|
||||
Program,
|
||||
Provider,
|
||||
Wallet,
|
||||
} from '@coral-xyz/anchor';
|
||||
import {
|
||||
createCloseAccountInstruction,
|
||||
createInitializeAccount3Instruction,
|
||||
|
@ -39,6 +45,7 @@ import {
|
|||
PerpMarketIndex,
|
||||
PerpOrderSide,
|
||||
PerpOrderType,
|
||||
PerpSelfTradeBehavior,
|
||||
} from './accounts/perp';
|
||||
import {
|
||||
MarketIndex,
|
||||
|
@ -54,7 +61,7 @@ import {
|
|||
TokenEditParams,
|
||||
buildIxGate,
|
||||
} from './clientIxParamBuilder';
|
||||
import { OPENBOOK_PROGRAM_ID, RUST_U64_MAX } from './constants';
|
||||
import { MANGO_V4_ID, OPENBOOK_PROGRAM_ID, RUST_U64_MAX } from './constants';
|
||||
import { Id } from './ids';
|
||||
import { IDL, MangoV4 } from './mango_v4';
|
||||
import { I80F48 } from './numbers/I80F48';
|
||||
|
@ -2200,7 +2207,7 @@ export class MangoClient {
|
|||
expiryTimestamp?: number,
|
||||
limit?: number,
|
||||
): Promise<TransactionSignature> {
|
||||
const ix = await this.perpPlaceOrderIx(
|
||||
const ix = await this.perpPlaceOrderV2Ix(
|
||||
group,
|
||||
mangoAccount,
|
||||
perpMarketIndex,
|
||||
|
@ -2210,6 +2217,7 @@ export class MangoClient {
|
|||
maxQuoteQuantity,
|
||||
clientOrderId,
|
||||
orderType,
|
||||
PerpSelfTradeBehavior.decrementTake,
|
||||
reduceOnly,
|
||||
expiryTimestamp,
|
||||
limit,
|
||||
|
@ -2274,6 +2282,64 @@ export class MangoClient {
|
|||
.instruction();
|
||||
}
|
||||
|
||||
public async perpPlaceOrderV2Ix(
|
||||
group: Group,
|
||||
mangoAccount: MangoAccount,
|
||||
perpMarketIndex: PerpMarketIndex,
|
||||
side: PerpOrderSide,
|
||||
price: number,
|
||||
quantity: number,
|
||||
maxQuoteQuantity?: number,
|
||||
clientOrderId?: number,
|
||||
orderType?: PerpOrderType,
|
||||
selfTradeBehavior?: PerpSelfTradeBehavior,
|
||||
reduceOnly?: boolean,
|
||||
expiryTimestamp?: number,
|
||||
limit?: number,
|
||||
): Promise<TransactionInstruction> {
|
||||
const perpMarket = group.getPerpMarketByMarketIndex(perpMarketIndex);
|
||||
const healthRemainingAccounts: PublicKey[] =
|
||||
this.buildHealthRemainingAccounts(
|
||||
group,
|
||||
[mangoAccount],
|
||||
// Settlement token bank, because a position for it may be created
|
||||
[group.getFirstBankForPerpSettlement()],
|
||||
[perpMarket],
|
||||
);
|
||||
return await this.program.methods
|
||||
.perpPlaceOrderV2(
|
||||
side,
|
||||
perpMarket.uiPriceToLots(price),
|
||||
perpMarket.uiBaseToLots(quantity),
|
||||
maxQuoteQuantity
|
||||
? perpMarket.uiQuoteToLots(maxQuoteQuantity)
|
||||
: I64_MAX_BN,
|
||||
new BN(clientOrderId ? clientOrderId : Date.now()),
|
||||
orderType ?? PerpOrderType.limit,
|
||||
selfTradeBehavior ?? PerpSelfTradeBehavior.decrementTake,
|
||||
reduceOnly ?? false,
|
||||
new BN(expiryTimestamp ? expiryTimestamp : 0),
|
||||
limit ?? 10,
|
||||
)
|
||||
.accounts({
|
||||
group: group.publicKey,
|
||||
account: mangoAccount.publicKey,
|
||||
perpMarket: perpMarket.publicKey,
|
||||
bids: perpMarket.bids,
|
||||
asks: perpMarket.asks,
|
||||
eventQueue: perpMarket.eventQueue,
|
||||
oracle: perpMarket.oracle,
|
||||
owner: (this.program.provider as AnchorProvider).wallet.publicKey,
|
||||
})
|
||||
.remainingAccounts(
|
||||
healthRemainingAccounts.map(
|
||||
(pk) =>
|
||||
({ pubkey: pk, isWritable: false, isSigner: false } as AccountMeta),
|
||||
),
|
||||
)
|
||||
.instruction();
|
||||
}
|
||||
|
||||
public async perpPlaceOrderPegged(
|
||||
group: Group,
|
||||
mangoAccount: MangoAccount,
|
||||
|
@ -2289,7 +2355,7 @@ export class MangoClient {
|
|||
expiryTimestamp?: number,
|
||||
limit?: number,
|
||||
): Promise<TransactionSignature> {
|
||||
const ix = await this.perpPlaceOrderPeggedIx(
|
||||
const ix = await this.perpPlaceOrderPeggedV2Ix(
|
||||
group,
|
||||
mangoAccount,
|
||||
perpMarketIndex,
|
||||
|
@ -2300,6 +2366,7 @@ export class MangoClient {
|
|||
maxQuoteQuantity,
|
||||
clientOrderId,
|
||||
orderType,
|
||||
PerpSelfTradeBehavior.decrementTake,
|
||||
reduceOnly,
|
||||
expiryTimestamp,
|
||||
limit,
|
||||
|
@ -2367,6 +2434,67 @@ export class MangoClient {
|
|||
.instruction();
|
||||
}
|
||||
|
||||
public async perpPlaceOrderPeggedV2Ix(
|
||||
group: Group,
|
||||
mangoAccount: MangoAccount,
|
||||
perpMarketIndex: PerpMarketIndex,
|
||||
side: PerpOrderSide,
|
||||
priceOffset: number,
|
||||
quantity: number,
|
||||
pegLimit?: number,
|
||||
maxQuoteQuantity?: number,
|
||||
clientOrderId?: number,
|
||||
orderType?: PerpOrderType,
|
||||
selfTradeBehavior?: PerpSelfTradeBehavior,
|
||||
reduceOnly?: boolean,
|
||||
expiryTimestamp?: number,
|
||||
limit?: number,
|
||||
): Promise<TransactionInstruction> {
|
||||
const perpMarket = group.getPerpMarketByMarketIndex(perpMarketIndex);
|
||||
const healthRemainingAccounts: PublicKey[] =
|
||||
this.buildHealthRemainingAccounts(
|
||||
group,
|
||||
[mangoAccount],
|
||||
// Settlement token bank, because a position for it may be created
|
||||
[group.getFirstBankForPerpSettlement()],
|
||||
[perpMarket],
|
||||
);
|
||||
return await this.program.methods
|
||||
.perpPlaceOrderPeggedV2(
|
||||
side,
|
||||
perpMarket.uiPriceToLots(priceOffset),
|
||||
pegLimit ? perpMarket.uiPriceToLots(pegLimit) : new BN(-1),
|
||||
perpMarket.uiBaseToLots(quantity),
|
||||
maxQuoteQuantity
|
||||
? perpMarket.uiQuoteToLots(maxQuoteQuantity)
|
||||
: I64_MAX_BN,
|
||||
new BN(clientOrderId ?? Date.now()),
|
||||
orderType ?? PerpOrderType.limit,
|
||||
selfTradeBehavior ?? PerpSelfTradeBehavior.decrementTake,
|
||||
reduceOnly ?? false,
|
||||
new BN(expiryTimestamp ?? 0),
|
||||
limit ?? 10,
|
||||
-1,
|
||||
)
|
||||
.accounts({
|
||||
group: group.publicKey,
|
||||
account: mangoAccount.publicKey,
|
||||
perpMarket: perpMarket.publicKey,
|
||||
bids: perpMarket.bids,
|
||||
asks: perpMarket.asks,
|
||||
eventQueue: perpMarket.eventQueue,
|
||||
oracle: perpMarket.oracle,
|
||||
owner: (this.program.provider as AnchorProvider).wallet.publicKey,
|
||||
})
|
||||
.remainingAccounts(
|
||||
healthRemainingAccounts.map(
|
||||
(pk) =>
|
||||
({ pubkey: pk, isWritable: false, isSigner: false } as AccountMeta),
|
||||
),
|
||||
)
|
||||
.instruction();
|
||||
}
|
||||
|
||||
public async perpCancelOrderIx(
|
||||
group: Group,
|
||||
mangoAccount: MangoAccount,
|
||||
|
@ -3025,6 +3153,35 @@ export class MangoClient {
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect with defaults,
|
||||
* - random ephemeral keypair,
|
||||
* - fetch ids using gPa
|
||||
* - connects to mainnet-beta
|
||||
* - uses well known program Id
|
||||
* @param clusterUrl
|
||||
* @returns
|
||||
*/
|
||||
static connectDefault(clusterUrl: string): MangoClient {
|
||||
const idl = IDL;
|
||||
|
||||
const options = AnchorProvider.defaultOptions();
|
||||
const connection = new Connection(clusterUrl, options);
|
||||
|
||||
return new MangoClient(
|
||||
new Program<MangoV4>(
|
||||
idl as MangoV4,
|
||||
MANGO_V4_ID['mainnet-beta'],
|
||||
new AnchorProvider(connection, new Wallet(new Keypair()), options),
|
||||
),
|
||||
MANGO_V4_ID['mainnet-beta'],
|
||||
'mainnet-beta' as Cluster,
|
||||
{
|
||||
idsSource: 'get-program-accounts',
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
static connectForGroupName(
|
||||
provider: Provider,
|
||||
groupName: string,
|
||||
|
|
|
@ -91,12 +91,16 @@ export async function getOnChainPriceForMints(
|
|||
): Promise<number[]> {
|
||||
return await Promise.all(
|
||||
mints.map(async (mint) => {
|
||||
let data = await (
|
||||
const resp = await (
|
||||
await buildFetch()
|
||||
)(`https://price.jup.ag/v4/price?ids=${mint}`, { mode: 'no-cors' });
|
||||
data = await data.json();
|
||||
data = data['data'];
|
||||
return data[mint]['price'];
|
||||
)(`https://public-api.birdeye.so/public/price?address=${mint}`, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
|
||||
const data = await resp.json();
|
||||
return data?.data?.value;
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
@ -229,7 +233,8 @@ export async function getPriceImpactForLiqor(
|
|||
}, ZERO_I80F48());
|
||||
|
||||
const [pi1, pi2] = await Promise.all([
|
||||
!liabsInUsdc.eq(ZERO_I80F48())
|
||||
!liabsInUsdc.eq(ZERO_I80F48()) &&
|
||||
usdcMint.toBase58() !== bank.mint.toBase58()
|
||||
? computePriceImpactOnJup(
|
||||
liabsInUsdc.toString(),
|
||||
usdcMint.toBase58(),
|
||||
|
@ -237,7 +242,8 @@ export async function getPriceImpactForLiqor(
|
|||
)
|
||||
: Promise.resolve({ priceImpactPct: 0, outAmount: 0 }),
|
||||
|
||||
!assets.eq(ZERO_I80F48())
|
||||
!assets.eq(ZERO_I80F48()) &&
|
||||
usdcMint.toBase58() !== bank.mint.toBase58()
|
||||
? computePriceImpactOnJup(
|
||||
assets.floor().toString(),
|
||||
bank.mint.toBase58(),
|
||||
|
|
Loading…
Reference in New Issue