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:
microwavedcola1 2023-06-19 14:24:06 +02:00 committed by GitHub
parent f3f8359fd1
commit 6b2e9bbf12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 191 additions and 20 deletions

View File

@ -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"

View File

@ -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(

View File

@ -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,

View File

@ -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: {} };

View File

@ -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,

View File

@ -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(),