Example cross market maker + byproduct utility functions (#107)
* First commit * Formatting, move pkg to dev. deps * Accurately calculate base perp position on fill * Act on Max's suggestions * Risk checker adjustments * Misc * Delete _.ts * Rename xmm.ts to serumExampleHedge.ts * Update serumExampleHedge.ts Co-authored-by: Maximilian Schneider <mail@maximilianschneider.net>
This commit is contained in:
parent
3b5834f7cb
commit
eadbedc2f3
|
@ -63,6 +63,7 @@
|
|||
"cross-env": "^7.0.2",
|
||||
"eslint": "^7.28.0",
|
||||
"eslint-config-prettier": "^7.2.0",
|
||||
"mango_risk_check": "^1.2.1",
|
||||
"mocha": "9",
|
||||
"prettier": "^2.0.5",
|
||||
"ts-node": "^9.1.1",
|
||||
|
|
|
@ -5491,4 +5491,62 @@ export class MangoClient {
|
|||
|
||||
return await this.sendTransaction(transaction, owner, []);
|
||||
}
|
||||
|
||||
async ensureOpenOrdersAccount(
|
||||
mangoAccount: MangoAccount,
|
||||
mangoGroup: MangoGroup,
|
||||
payer: Keypair,
|
||||
spotMarket: Market,
|
||||
spotMarketConfig,
|
||||
) {
|
||||
if (mangoAccount.spotOpenOrdersAccounts[spotMarketConfig.marketIndex]) {
|
||||
return;
|
||||
}
|
||||
|
||||
const [openOrdersPk] = await PublicKey.findProgramAddress(
|
||||
[
|
||||
mangoAccount.publicKey.toBytes(),
|
||||
new BN(spotMarketConfig.marketIndex).toArrayLike(Buffer, 'le', 8),
|
||||
new Buffer('OpenOrders', 'utf-8'),
|
||||
],
|
||||
this.programId,
|
||||
);
|
||||
|
||||
const createSpotOpenOrdersInstruction = makeCreateSpotOpenOrdersInstruction(
|
||||
this.programId,
|
||||
mangoGroup.publicKey,
|
||||
mangoAccount.publicKey,
|
||||
payer.publicKey,
|
||||
mangoGroup.dexProgramId,
|
||||
openOrdersPk,
|
||||
spotMarket.publicKey,
|
||||
mangoGroup.signerKey,
|
||||
);
|
||||
|
||||
const recentBlockHash = await this.connection.getLatestBlockhash(
|
||||
'finalized',
|
||||
);
|
||||
|
||||
const tx = new Transaction({
|
||||
recentBlockhash: recentBlockHash.blockhash,
|
||||
feePayer: payer.publicKey,
|
||||
});
|
||||
|
||||
tx.add(createSpotOpenOrdersInstruction);
|
||||
|
||||
tx.sign(payer);
|
||||
|
||||
try {
|
||||
await this.sendSignedTransaction({
|
||||
signedTransaction: tx,
|
||||
signedAtBlock: recentBlockHash,
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
|
||||
await mangoAccount.reload(this.connection, mangoGroup.dexProgramId);
|
||||
// ^ The newly created open orders account isn't immediately visible in
|
||||
// the already fetched Mango account, hence why it needs to be reloaded
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,556 @@
|
|||
import {BlockhashWithExpiryBlockHeight, Connection, Keypair, PublicKey, Transaction} from "@solana/web3.js";
|
||||
import fs from "fs";
|
||||
import {BN} from "bn.js";
|
||||
import {getFeeRates, getFeeTier, Market, OpenOrders} from "@project-serum/serum";
|
||||
import _, {range, zip} from "lodash";
|
||||
import WebSocket from "ws";
|
||||
import {Payer} from "../utils/types";
|
||||
import {getMultipleAccounts, I64_MAX_BN, nativeToUi, ZERO_BN, zeroKey} from "../utils/utils";
|
||||
import {MangoClient} from "../client";
|
||||
import {FillEvent, MangoAccountLayout, PerpEventLayout, PerpEventQueueLayout, QUOTE_INDEX} from "../layout";
|
||||
import {Config, getPerpMarketByBaseSymbol, getSpotMarketByBaseSymbol, getTokenBySymbol} from "../config";
|
||||
import {
|
||||
makeCancelAllPerpOrdersInstruction,
|
||||
makePlacePerpOrder2Instruction,
|
||||
makePlaceSpotOrder2Instruction
|
||||
} from "../instruction";
|
||||
import PerpEventQueue from "../PerpEventQueue";
|
||||
import MangoGroup from "../MangoGroup";
|
||||
import {performance} from "perf_hooks";
|
||||
import MangoAccount from "../MangoAccount";
|
||||
import {MangoRiskCheck, ViolationBehaviour} from "mango_risk_check";
|
||||
|
||||
// KEYPAIR=~/.config/solana/id.json MANGO_GROUP=devnet.2 MANGO_ACCOUNT=BFLAGijqDyRnK93scRizT8YSotrvdxhdJyWYZch6yMMW SYMBOL=SOL PERPS_FILLS_FEED=ws://api.mngo.cloud:2082 npx ts-node serumExampleHedge.ts
|
||||
|
||||
const main = async () => {
|
||||
const {
|
||||
MANGO_GROUP,
|
||||
KEYPAIR,
|
||||
MANGO_ACCOUNT,
|
||||
SYMBOL,
|
||||
PERPS_FILLS_FEED
|
||||
} = process.env
|
||||
|
||||
const config = Config.ids()
|
||||
|
||||
if (!MANGO_GROUP) {
|
||||
console.log('Attach a MANGO_GROUP env variable.')
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
const mangoGroupConfig = config.getGroupWithName(MANGO_GROUP!)
|
||||
|
||||
if (!mangoGroupConfig) {
|
||||
console.log(`Couldn't find group by name ${MANGO_GROUP}`)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
const [token, perpMarketConfig, spotMarketConfig] = [
|
||||
getTokenBySymbol(mangoGroupConfig, SYMBOL!),
|
||||
getPerpMarketByBaseSymbol(mangoGroupConfig, SYMBOL!),
|
||||
getSpotMarketByBaseSymbol(mangoGroupConfig, SYMBOL!)
|
||||
]
|
||||
|
||||
if (!token || !perpMarketConfig || !spotMarketConfig) {
|
||||
console.log(`token, perpMarketConfig or spotMarketConfig by symbol ${SYMBOL!} not found`)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
const connection = new Connection(config.cluster_urls[mangoGroupConfig.cluster], 'processed')
|
||||
// ^ See https://docs.solana.com/developing/clients/jsonrpc-api#configuring-state-commitment
|
||||
// to learn more about each state commitment i.e processed, confirmed and finalized.
|
||||
|
||||
const mangoClient = new MangoClient(connection, mangoGroupConfig.mangoProgramId)
|
||||
|
||||
console.log('Loading Mango group...')
|
||||
|
||||
const mangoGroup = await mangoClient.getMangoGroup(mangoGroupConfig.publicKey)
|
||||
|
||||
console.log(`Loaded! ${(performance.now() / 1e3).toFixed(2)}s` )
|
||||
|
||||
console.log('Loading mangoCache, rootBanks, perpMarket and spotMarket...')
|
||||
|
||||
const [mangoCache, rootBanks, perpMarket, spotMarket] = await Promise.all([
|
||||
mangoGroup.loadCache(connection),
|
||||
mangoGroup.loadRootBanks(connection),
|
||||
mangoGroup.loadPerpMarket(
|
||||
connection,
|
||||
perpMarketConfig.marketIndex,
|
||||
perpMarketConfig.baseDecimals,
|
||||
perpMarketConfig.quoteDecimals
|
||||
),
|
||||
Market.load(
|
||||
connection,
|
||||
spotMarketConfig.publicKey,
|
||||
undefined,
|
||||
mangoGroupConfig.serumProgramId
|
||||
)
|
||||
])
|
||||
|
||||
console.log(`Loaded! ${(performance.now() / 1e3).toFixed(2)}s` )
|
||||
|
||||
console.log('Loading meta...')
|
||||
|
||||
const payer = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(KEYPAIR!, 'utf-8'))))
|
||||
|
||||
const mangoAccountPk = new PublicKey(MANGO_ACCOUNT!)
|
||||
|
||||
const spotOpenOrdersPks = (await mangoClient.getMangoAccount(mangoAccountPk, mangoGroup.dexProgramId)).spotOpenOrders
|
||||
|
||||
async function monitor(): Promise<[number, MangoAccount, PerpEventQueue, BlockhashWithExpiryBlockHeight, number]> {
|
||||
const [mangoAccountRaw, perpEventQueueRaw, ...spotOpenOrdersAccountsRaw] = await getMultipleAccounts(
|
||||
connection,
|
||||
[
|
||||
mangoAccountPk,
|
||||
perpMarketConfig!.eventsKey,
|
||||
...spotOpenOrdersPks.filter(spotOpenOrderAccount => !spotOpenOrderAccount.equals(zeroKey))
|
||||
],
|
||||
)
|
||||
|
||||
const slot = mangoAccountRaw.context.slot
|
||||
|
||||
const mangoAccount = new MangoAccount(mangoAccountPk, MangoAccountLayout.decode(mangoAccountRaw.accountInfo.data))
|
||||
|
||||
mangoAccount.spotOpenOrdersAccounts = spotOpenOrdersPks.map((openOrderPk) => {
|
||||
if (openOrderPk.equals(zeroKey)) {
|
||||
return undefined;
|
||||
}
|
||||
const account = spotOpenOrdersAccountsRaw.find((a) => a.publicKey.equals(openOrderPk));
|
||||
return account
|
||||
? OpenOrders.fromAccountInfo(
|
||||
openOrderPk,
|
||||
account.accountInfo,
|
||||
mangoGroup.dexProgramId,
|
||||
)
|
||||
: undefined;
|
||||
})
|
||||
|
||||
const perpEventQueue = new PerpEventQueue(PerpEventQueueLayout.decode(perpEventQueueRaw.accountInfo.data))
|
||||
|
||||
const recentBlockHash = await connection.getLatestBlockhash('finalized')
|
||||
// ^ Solana transactions require a recent block hash passed as metadata in order to be signed.
|
||||
// Instead of fetching this before dispatching every transaction (which would delay it by a
|
||||
// few milliseconds) we poll for this regularly in the background.
|
||||
|
||||
const recentBlockTime = await connection.getBlockTime(
|
||||
await connection.getSlot('finalized')
|
||||
)
|
||||
|
||||
return [slot, mangoAccount, perpEventQueue, recentBlockHash, recentBlockTime!]
|
||||
}
|
||||
|
||||
let [
|
||||
slot,
|
||||
mangoAccount,
|
||||
perpEventQueue,
|
||||
recentBlockHash,
|
||||
recentBlockTime
|
||||
] = await monitor()
|
||||
|
||||
console.log(`Loaded! ${(performance.now() / 1e3).toFixed(2)}s` )
|
||||
// ^ This will be used to as reference for time in force orders later on.
|
||||
// It is important to use cluster time, like above, and not local time.
|
||||
|
||||
setInterval(async () => {
|
||||
[
|
||||
slot,
|
||||
mangoAccount,
|
||||
perpEventQueue,
|
||||
recentBlockHash,
|
||||
recentBlockTime
|
||||
] = await monitor()
|
||||
}, 5000)
|
||||
|
||||
/*
|
||||
|
||||
To interact with the (Serum) DEX, a given user must create an OpenOrders
|
||||
account. This account stores the following:
|
||||
- How much of the base and quote currency (in the SOL/USDC pair, SOL
|
||||
would be base currency and USDC would be quote) that user has locked
|
||||
in open orders or is settleable
|
||||
- A list of open orders for that user on that market
|
||||
|
||||
*/
|
||||
|
||||
await mangoClient.ensureOpenOrdersAccount(mangoAccount, mangoGroup, payer, spotMarket, spotMarketConfig)
|
||||
|
||||
console.log('Loading risk checker...')
|
||||
|
||||
// The risk checker prevents long/short exposure & open orders from exceeding specific thresholds
|
||||
// https://github.com/Is0tope/mango_risk_check/blob/master/js/examples/example.ts
|
||||
const riskChecker = new MangoRiskCheck({
|
||||
connection: connection,
|
||||
mangoAccount: mangoAccount,
|
||||
mangoClient: mangoClient,
|
||||
mangoGroup: mangoGroup,
|
||||
owner: payer
|
||||
})
|
||||
|
||||
try {
|
||||
await riskChecker.initializeRiskAccount(perpMarketConfig)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
try {
|
||||
await Promise.all([
|
||||
riskChecker.setMaxOpenOrders(perpMarketConfig, 2),
|
||||
riskChecker.setMaxLongExposure(perpMarketConfig, perpMarket, 5),
|
||||
riskChecker.setMaxShortExposure(perpMarketConfig, perpMarket, 5),
|
||||
riskChecker.setViolationBehaviour(perpMarketConfig, ViolationBehaviour.CancelIncreasingOrders)
|
||||
])
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
console.log('Loaded!')
|
||||
|
||||
const tokenIndex = mangoGroup.getTokenIndex(token.mintKey)
|
||||
|
||||
let [tokenPrice, tokenPriceLastUpdated] = [
|
||||
mangoGroup.cachePriceToUi(
|
||||
mangoCache.getPrice(tokenIndex), tokenIndex
|
||||
),
|
||||
new Date()
|
||||
// ^ The "last updated" timestamp for the cached token oracle price is
|
||||
// logged to check whether it hasn't updated in too long of a while
|
||||
]
|
||||
|
||||
mangoGroup.onCacheChange(connection, (mangoCache) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
[tokenPrice, tokenPriceLastUpdated] = [
|
||||
mangoGroup.cachePriceToUi(
|
||||
mangoCache.getPrice(tokenIndex), tokenIndex
|
||||
),
|
||||
new Date()
|
||||
]
|
||||
})
|
||||
|
||||
let recentFills: any[] = []
|
||||
|
||||
function listenToFills() {
|
||||
const ws = new WebSocket(PERPS_FILLS_FEED!)
|
||||
|
||||
ws.onopen = event => {
|
||||
console.log('Fills feed connection is open!')
|
||||
}
|
||||
|
||||
ws.onmessage = async (message) => {
|
||||
const data = JSON.parse(message.data.toString());
|
||||
|
||||
// eslint-disable-next-line no-prototype-builtins
|
||||
const isSnapshot = data.hasOwnProperty('events')
|
||||
|
||||
const parseEvent = (event: string) =>
|
||||
PerpEventLayout.decode(Buffer.from(event, 'base64'))
|
||||
|
||||
if (isSnapshot) {
|
||||
return
|
||||
} else {
|
||||
if (data.market.split('-')[0] !== SYMBOL) {
|
||||
return
|
||||
}
|
||||
|
||||
const event = parseEvent(data.event)
|
||||
|
||||
const fill = perpMarket.parseFillEvent(event.fill)
|
||||
|
||||
if (!(fill.maker.equals(mangoAccountPk))) {
|
||||
return
|
||||
}
|
||||
|
||||
const takerBase = perpMarket.baseLotsToNumber(mangoAccount.perpAccounts[perpMarketConfig!.marketIndex].takerBase)
|
||||
|
||||
const basePosition = perpMarket.baseLotsToNumber(mangoAccount.perpAccounts[perpMarketConfig!.marketIndex].basePosition)
|
||||
|
||||
const unprocessedFills = perpEventQueue.getUnconsumedEvents()
|
||||
.filter(event => event.fill !== undefined)
|
||||
.map(event => perpMarket.parseFillEvent(event.fill))
|
||||
.filter(fill => fill.maker.equals(mangoAccount.publicKey)) as any[]
|
||||
|
||||
const queuedBasePosition = unprocessedFills
|
||||
.reduce((accumulator, fill) => {
|
||||
switch (fill.takerSide) {
|
||||
case "buy":
|
||||
return accumulator - fill.quantity
|
||||
case "sell":
|
||||
return accumulator + fill.quantity
|
||||
}
|
||||
}, basePosition + takerBase)
|
||||
|
||||
recentFills = [...recentFills, { ...fill, slot: data.slot }].filter(fill => fill.slot > slot)
|
||||
|
||||
const completeBasePosition = queuedBasePosition + recentFills.reduce((accumulator, fill) => {
|
||||
switch (fill.takerSide) {
|
||||
case "buy":
|
||||
return accumulator - fill.quantity
|
||||
case "sell":
|
||||
return accumulator + fill.quantity
|
||||
}
|
||||
}, 0)
|
||||
|
||||
console.log(unprocessedFills, recentFills, data.slot, slot, data.slot - slot, basePosition, takerBase, queuedBasePosition, completeBasePosition)
|
||||
}
|
||||
}
|
||||
|
||||
ws.onclose = function (event) {
|
||||
console.log('Fills feed connection is closed. Reconnecting...', event.reason);
|
||||
|
||||
listenToFills()
|
||||
};
|
||||
|
||||
ws.onerror = (event) => {
|
||||
console.log(event)
|
||||
|
||||
ws.close()
|
||||
}
|
||||
}
|
||||
|
||||
listenToFills()
|
||||
|
||||
const quote = async () => {
|
||||
// const spread = tokenPrice! * 0.0005
|
||||
|
||||
const spread = 0.0005
|
||||
|
||||
const [bidPriceUi, bidSizeUi] = [tokenPrice - spread, 0.1]
|
||||
|
||||
const [askPriceUi, askSizeUi] = [tokenPrice + spread, 0.1]
|
||||
|
||||
const [bidPrice, bidSize] = perpMarket.uiToNativePriceQuantity(bidPriceUi, bidSizeUi)
|
||||
|
||||
const [askPrice, askSize] = perpMarket.uiToNativePriceQuantity(askPriceUi, askSizeUi)
|
||||
|
||||
const tx = new Transaction({
|
||||
recentBlockhash: recentBlockHash.blockhash,
|
||||
feePayer: payer.publicKey
|
||||
})
|
||||
|
||||
const timestamp = new BN(Date.now())
|
||||
|
||||
// Use different order IDs for both sides of the quote - inconsistent state
|
||||
// issues on the program side might happen if we tried to cancel order by ID
|
||||
// otherwise.
|
||||
const [bidId, askId] = [timestamp.add(new BN(1)), timestamp]
|
||||
|
||||
// ^ When using Time in Force orders, it's important to use *cluster time*
|
||||
// as it might drift from actual UNIX time every once and then, effectively
|
||||
// being different to what you'd get using Date.now().
|
||||
|
||||
if (recentBlockTime === null) {
|
||||
console.log('Failed to fetch block time')
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
const expiryTimestamp = new BN(recentBlockTime + 120)
|
||||
|
||||
tx.add(
|
||||
makeCancelAllPerpOrdersInstruction(
|
||||
mangoGroupConfig.mangoProgramId,
|
||||
mangoGroupConfig.publicKey,
|
||||
mangoAccount.publicKey,
|
||||
payer.publicKey,
|
||||
perpMarket.publicKey,
|
||||
perpMarket.bids,
|
||||
perpMarket.asks,
|
||||
new BN(4)
|
||||
),
|
||||
makePlacePerpOrder2Instruction(
|
||||
mangoGroupConfig.mangoProgramId,
|
||||
mangoGroupConfig.publicKey,
|
||||
mangoAccount.publicKey,
|
||||
payer.publicKey,
|
||||
mangoGroup.mangoCache,
|
||||
perpMarket.publicKey,
|
||||
perpMarket.bids,
|
||||
perpMarket.asks,
|
||||
perpMarket.eventQueue,
|
||||
mangoAccount.getOpenOrdersKeysInBasket(),
|
||||
new BN(bidPrice),
|
||||
new BN(bidSize),
|
||||
I64_MAX_BN,
|
||||
bidId,
|
||||
'buy',
|
||||
new BN(255),
|
||||
'postOnlySlide',
|
||||
false,
|
||||
undefined,
|
||||
expiryTimestamp
|
||||
),
|
||||
makePlacePerpOrder2Instruction(
|
||||
mangoGroupConfig.mangoProgramId,
|
||||
mangoGroupConfig.publicKey,
|
||||
mangoAccount.publicKey,
|
||||
payer.publicKey,
|
||||
mangoGroup.mangoCache,
|
||||
perpMarket.publicKey,
|
||||
perpMarket.bids,
|
||||
perpMarket.asks,
|
||||
perpMarket.eventQueue,
|
||||
mangoAccount.getOpenOrdersKeysInBasket(),
|
||||
new BN(askPrice),
|
||||
new BN(askSize),
|
||||
I64_MAX_BN,
|
||||
askId,
|
||||
'sell',
|
||||
new BN(255),
|
||||
'postOnlySlide',
|
||||
false,
|
||||
undefined,
|
||||
expiryTimestamp
|
||||
),
|
||||
riskChecker.makeCheckRiskInstruction(perpMarketConfig, perpMarket)
|
||||
)
|
||||
|
||||
tx.sign(payer)
|
||||
|
||||
try {
|
||||
const response = await mangoClient.sendSignedTransaction({
|
||||
signedTransaction: tx,
|
||||
signedAtBlock: recentBlockHash,
|
||||
})
|
||||
|
||||
console.log('quote::response', response)
|
||||
} catch (error) {
|
||||
console.log('quote::error', error);
|
||||
}
|
||||
}
|
||||
|
||||
console.log('First quoting in ' + (performance.now() / 1e3).toFixed(2) + 's!')
|
||||
|
||||
quote()
|
||||
|
||||
setInterval(quote, 1500)
|
||||
}
|
||||
|
||||
async function createSpotOrder2Instruction(
|
||||
mangoClient: MangoClient,
|
||||
mangoGroup: MangoGroup,
|
||||
mangoAccount: MangoAccount,
|
||||
spotMarket: Market,
|
||||
owner: Payer,
|
||||
side: 'buy' | 'sell',
|
||||
price: number,
|
||||
size: number,
|
||||
orderType?: 'limit' | 'ioc' | 'postOnly',
|
||||
// @ts-ignore
|
||||
clientOrderId?: BN,
|
||||
useMsrmVault?: boolean | undefined
|
||||
) {
|
||||
if (!owner.publicKey) {
|
||||
return;
|
||||
}
|
||||
const limitPrice = spotMarket.priceNumberToLots(price);
|
||||
const maxBaseQuantity = spotMarket.baseSizeNumberToLots(size);
|
||||
|
||||
// TODO implement srm vault fee discount
|
||||
// const feeTier = getFeeTier(0, nativeToUi(mangoGroup.nativeSrm || 0, SRM_DECIMALS));
|
||||
const feeTier = getFeeTier(0, nativeToUi(0, 0));
|
||||
const rates = getFeeRates(feeTier);
|
||||
const maxQuoteQuantity = new BN(
|
||||
spotMarket['_decoded'].quoteLotSize.toNumber() * (1 + rates.taker),
|
||||
).mul(
|
||||
spotMarket
|
||||
.baseSizeNumberToLots(size)
|
||||
.mul(spotMarket.priceNumberToLots(price)),
|
||||
);
|
||||
|
||||
if (maxBaseQuantity.lte(ZERO_BN)) {
|
||||
throw new Error('size too small');
|
||||
}
|
||||
if (limitPrice.lte(ZERO_BN)) {
|
||||
throw new Error('invalid price');
|
||||
}
|
||||
const selfTradeBehavior = 'decrementTake';
|
||||
|
||||
const spotMarketIndex = mangoGroup.getSpotMarketIndex(spotMarket.publicKey);
|
||||
|
||||
if (!mangoGroup.rootBankAccounts.filter((a) => !!a).length) {
|
||||
await mangoGroup.loadRootBanks(mangoClient.connection);
|
||||
}
|
||||
let feeVault: PublicKey;
|
||||
if (useMsrmVault) {
|
||||
feeVault = mangoGroup.msrmVault;
|
||||
} else if (useMsrmVault === false) {
|
||||
feeVault = mangoGroup.srmVault;
|
||||
} else {
|
||||
const totalMsrm = await mangoClient.connection.getTokenAccountBalance(
|
||||
mangoGroup.msrmVault,
|
||||
);
|
||||
feeVault =
|
||||
totalMsrm?.value?.uiAmount && totalMsrm.value.uiAmount > 0
|
||||
? mangoGroup.msrmVault
|
||||
: mangoGroup.srmVault;
|
||||
}
|
||||
|
||||
const baseRootBank = mangoGroup.rootBankAccounts[spotMarketIndex];
|
||||
const baseNodeBank = baseRootBank?.nodeBankAccounts[0];
|
||||
const quoteRootBank = mangoGroup.rootBankAccounts[QUOTE_INDEX];
|
||||
const quoteNodeBank = quoteRootBank?.nodeBankAccounts[0];
|
||||
|
||||
if (!baseRootBank || !baseNodeBank || !quoteRootBank || !quoteNodeBank) {
|
||||
throw new Error('Invalid or missing banks');
|
||||
}
|
||||
|
||||
// Only pass in open orders if in margin basket or current market index, and
|
||||
// the only writable account should be OpenOrders for current market index
|
||||
|
||||
const openOrdersKeys = zip(mangoAccount.spotOpenOrdersAccounts, range(0, mangoAccount.spotOpenOrdersAccounts.length))
|
||||
.filter(([openOrdersAccount, index]) => mangoAccount.inMarginBasket[index!] || index == spotMarketIndex)
|
||||
.map(([openOrdersAccount, index]) => (
|
||||
{
|
||||
pubkey: openOrdersAccount!.publicKey,
|
||||
isWritable: index == spotMarketIndex
|
||||
}
|
||||
))
|
||||
|
||||
const dexSigner = await PublicKey.createProgramAddress(
|
||||
[
|
||||
spotMarket.publicKey.toBuffer(),
|
||||
spotMarket['_decoded'].vaultSignerNonce.toArrayLike(Buffer, 'le', 8),
|
||||
],
|
||||
spotMarket.programId,
|
||||
);
|
||||
|
||||
const placeOrderInstruction = makePlaceSpotOrder2Instruction(
|
||||
mangoClient.programId,
|
||||
mangoGroup.publicKey,
|
||||
mangoAccount.publicKey,
|
||||
owner.publicKey,
|
||||
mangoGroup.mangoCache,
|
||||
spotMarket.programId,
|
||||
spotMarket.publicKey,
|
||||
spotMarket['_decoded'].bids,
|
||||
spotMarket['_decoded'].asks,
|
||||
spotMarket['_decoded'].requestQueue,
|
||||
spotMarket['_decoded'].eventQueue,
|
||||
spotMarket['_decoded'].baseVault,
|
||||
spotMarket['_decoded'].quoteVault,
|
||||
baseRootBank.publicKey,
|
||||
baseNodeBank.publicKey,
|
||||
baseNodeBank.vault,
|
||||
quoteRootBank.publicKey,
|
||||
quoteNodeBank.publicKey,
|
||||
quoteNodeBank.vault,
|
||||
mangoGroup.signerKey,
|
||||
dexSigner,
|
||||
feeVault,
|
||||
openOrdersKeys,
|
||||
side,
|
||||
limitPrice,
|
||||
maxBaseQuantity,
|
||||
maxQuoteQuantity,
|
||||
selfTradeBehavior,
|
||||
orderType,
|
||||
clientOrderId ?? new BN(Date.now()),
|
||||
);
|
||||
|
||||
return placeOrderInstruction
|
||||
}
|
||||
|
||||
|
||||
main()
|
310
yarn.lock
310
yarn.lock
|
@ -37,6 +37,24 @@
|
|||
dependencies:
|
||||
regenerator-runtime "^0.13.4"
|
||||
|
||||
"@blockworks-foundation/mango-client@^3.4.6":
|
||||
version "3.6.9"
|
||||
resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-client/-/mango-client-3.6.9.tgz#4f98e0d5f9de6434720087dcf5d0b3c96b2081b6"
|
||||
integrity sha512-soTPI/BZ4Ad+XetkUqrw1K1kgUaNkAnzO98R9OafeRMP1Xh+RAnPOTS8h5/pN7J8fmGHI1kpDcSCfHNGQgSSvg==
|
||||
dependencies:
|
||||
"@project-serum/anchor" "^0.21.0"
|
||||
"@project-serum/serum" "^0.13.65"
|
||||
"@project-serum/sol-wallet-adapter" "^0.2.0"
|
||||
"@solana/spl-token" "^0.1.6"
|
||||
"@solana/web3.js" "^1.43.5"
|
||||
big.js "^6.1.1"
|
||||
bn.js "^5.1.0"
|
||||
buffer-layout "^1.2.1"
|
||||
cross-fetch "^3.1.5"
|
||||
dotenv "^10.0.0"
|
||||
toformat "^2.0.0"
|
||||
yargs "^17.0.1"
|
||||
|
||||
"@eslint/eslintrc@^0.4.2":
|
||||
version "0.4.2"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179"
|
||||
|
@ -73,6 +91,18 @@
|
|||
"@ethersproject/logger" "^5.6.0"
|
||||
hash.js "1.1.7"
|
||||
|
||||
"@hapi/hoek@^9.0.0":
|
||||
version "9.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
|
||||
integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==
|
||||
|
||||
"@hapi/topo@^5.0.0":
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012"
|
||||
integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==
|
||||
dependencies:
|
||||
"@hapi/hoek" "^9.0.0"
|
||||
|
||||
"@jest/types@^26.6.2":
|
||||
version "26.6.2"
|
||||
resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
|
||||
|
@ -146,6 +176,26 @@
|
|||
snake-case "^3.0.4"
|
||||
toml "^3.0.0"
|
||||
|
||||
"@project-serum/anchor@^0.24.2":
|
||||
version "0.24.2"
|
||||
resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.24.2.tgz#a3c52a99605c80735f446ca9b3a4885034731004"
|
||||
integrity sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA==
|
||||
dependencies:
|
||||
"@project-serum/borsh" "^0.2.5"
|
||||
"@solana/web3.js" "^1.36.0"
|
||||
base64-js "^1.5.1"
|
||||
bn.js "^5.1.2"
|
||||
bs58 "^4.0.1"
|
||||
buffer-layout "^1.2.2"
|
||||
camelcase "^5.3.1"
|
||||
cross-fetch "^3.1.5"
|
||||
crypto-hash "^1.3.0"
|
||||
eventemitter3 "^4.0.7"
|
||||
js-sha256 "^0.9.0"
|
||||
pako "^2.0.3"
|
||||
snake-case "^3.0.4"
|
||||
toml "^3.0.0"
|
||||
|
||||
"@project-serum/borsh@^0.2.2":
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.3.tgz#1d705c5887484cb6a127dd5feff58e90cbfcb558"
|
||||
|
@ -154,7 +204,7 @@
|
|||
bn.js "^5.1.2"
|
||||
buffer-layout "^1.2.0"
|
||||
|
||||
"@project-serum/borsh@^0.2.4":
|
||||
"@project-serum/borsh@^0.2.4", "@project-serum/borsh@^0.2.5":
|
||||
version "0.2.5"
|
||||
resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.5.tgz#6059287aa624ecebbfc0edd35e4c28ff987d8663"
|
||||
integrity sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==
|
||||
|
@ -188,6 +238,33 @@
|
|||
dependencies:
|
||||
buffer "^6.0.1"
|
||||
|
||||
"@sideway/address@^4.1.3":
|
||||
version "4.1.4"
|
||||
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0"
|
||||
integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==
|
||||
dependencies:
|
||||
"@hapi/hoek" "^9.0.0"
|
||||
|
||||
"@sideway/formula@^3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c"
|
||||
integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==
|
||||
|
||||
"@sideway/pinpoint@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df"
|
||||
integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
|
||||
|
||||
"@solana/buffer-layout-utils@^0.2.0":
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca"
|
||||
integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==
|
||||
dependencies:
|
||||
"@solana/buffer-layout" "^4.0.0"
|
||||
"@solana/web3.js" "^1.32.0"
|
||||
bigint-buffer "^1.1.5"
|
||||
bignumber.js "^9.0.1"
|
||||
|
||||
"@solana/buffer-layout@^4.0.0":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz#75b1b11adc487234821c81dfae3119b73a5fd734"
|
||||
|
@ -207,7 +284,17 @@
|
|||
buffer-layout "^1.2.0"
|
||||
dotenv "10.0.0"
|
||||
|
||||
"@solana/web3.js@1.43.5", "@solana/web3.js@^1.12.0", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.43.5":
|
||||
"@solana/spl-token@^0.2.0":
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.2.0.tgz#329bb6babb5de0f9c40035ddb1657f01a8347acd"
|
||||
integrity sha512-RWcn31OXtdqIxmkzQfB2R+WpsJOVS6rKuvpxJFjvik2LyODd+WN58ZP3Rpjpro03fscGAkzlFuP3r42doRJgyQ==
|
||||
dependencies:
|
||||
"@solana/buffer-layout" "^4.0.0"
|
||||
"@solana/buffer-layout-utils" "^0.2.0"
|
||||
"@solana/web3.js" "^1.32.0"
|
||||
start-server-and-test "^1.14.0"
|
||||
|
||||
"@solana/web3.js@1.43.5", "@solana/web3.js@^1.12.0", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.43.5":
|
||||
version "1.43.5"
|
||||
resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.43.5.tgz#ab12bb6ab3fff0a08e8c7453b4fc4cda9f66df11"
|
||||
integrity sha512-/PF4Fp+2jvCt9R3hYrf+tVUZXpPXZaHcwpaY/ytgdcswy8YiYf2snug52BJTCTlxwiXJipS4JpIo7rJJO0nN6w==
|
||||
|
@ -537,6 +624,13 @@ astral-regex@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
|
||||
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
|
||||
|
||||
axios@^0.21.1:
|
||||
version "0.21.4"
|
||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
|
||||
integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
|
||||
dependencies:
|
||||
follow-redirects "^1.14.0"
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||
|
@ -566,6 +660,11 @@ bigint-buffer@^1.1.5:
|
|||
dependencies:
|
||||
bindings "^1.3.0"
|
||||
|
||||
bignumber.js@^9.0.1:
|
||||
version "9.0.2"
|
||||
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673"
|
||||
integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==
|
||||
|
||||
binary-extensions@^2.0.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
|
||||
|
@ -578,6 +677,11 @@ bindings@^1.3.0:
|
|||
dependencies:
|
||||
file-uri-to-path "1.0.0"
|
||||
|
||||
bluebird@3.7.2:
|
||||
version "3.7.2"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
|
||||
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
|
||||
|
||||
bn.js@5.1.3, bn.js@^4.11.9, bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.1.2, bn.js@^5.2.0:
|
||||
version "5.1.3"
|
||||
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b"
|
||||
|
@ -711,6 +815,11 @@ check-error@^1.0.2:
|
|||
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
|
||||
integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
|
||||
|
||||
check-more-types@2.24.0:
|
||||
version "2.24.0"
|
||||
resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
|
||||
integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==
|
||||
|
||||
chokidar@3.5.2:
|
||||
version "3.5.2"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
|
||||
|
@ -788,7 +897,7 @@ cross-fetch@^3.1.5:
|
|||
dependencies:
|
||||
node-fetch "2.6.7"
|
||||
|
||||
cross-spawn@^7.0.1, cross-spawn@^7.0.2:
|
||||
cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
|
||||
|
@ -880,6 +989,11 @@ dotenv@10.0.0, dotenv@^10.0.0:
|
|||
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81"
|
||||
integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
|
||||
|
||||
duplexer@~0.1.1:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
|
||||
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
|
||||
|
||||
elliptic@^6.5.4:
|
||||
version "6.5.4"
|
||||
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
|
||||
|
@ -1057,11 +1171,39 @@ esutils@^2.0.2:
|
|||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
|
||||
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
||||
|
||||
event-stream@=3.3.4:
|
||||
version "3.3.4"
|
||||
resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
|
||||
integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==
|
||||
dependencies:
|
||||
duplexer "~0.1.1"
|
||||
from "~0"
|
||||
map-stream "~0.1.0"
|
||||
pause-stream "0.0.11"
|
||||
split "0.3"
|
||||
stream-combiner "~0.0.4"
|
||||
through "~2.3.1"
|
||||
|
||||
eventemitter3@^4.0.4, eventemitter3@^4.0.7:
|
||||
version "4.0.7"
|
||||
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
|
||||
integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
|
||||
|
||||
execa@5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
|
||||
integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
|
||||
dependencies:
|
||||
cross-spawn "^7.0.3"
|
||||
get-stream "^6.0.0"
|
||||
human-signals "^2.1.0"
|
||||
is-stream "^2.0.0"
|
||||
merge-stream "^2.0.0"
|
||||
npm-run-path "^4.0.1"
|
||||
onetime "^5.1.2"
|
||||
signal-exit "^3.0.3"
|
||||
strip-final-newline "^2.0.0"
|
||||
|
||||
eyes@^0.1.8:
|
||||
version "0.1.8"
|
||||
resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
|
||||
|
@ -1158,6 +1300,16 @@ flatted@^3.1.0:
|
|||
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469"
|
||||
integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==
|
||||
|
||||
follow-redirects@^1.14.0:
|
||||
version "1.15.1"
|
||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
|
||||
integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
|
||||
|
||||
from@~0:
|
||||
version "0.1.7"
|
||||
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
|
||||
integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==
|
||||
|
||||
fs.realpath@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||
|
@ -1183,6 +1335,11 @@ get-func-name@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
|
||||
integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
|
||||
|
||||
get-stream@^6.0.0:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
|
||||
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
|
||||
|
||||
glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
||||
|
@ -1270,6 +1427,11 @@ hmac-drbg@^1.0.1:
|
|||
minimalistic-assert "^1.0.0"
|
||||
minimalistic-crypto-utils "^1.0.1"
|
||||
|
||||
human-signals@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
|
||||
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
|
||||
|
||||
ieee754@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||
|
@ -1352,6 +1514,11 @@ is-plain-obj@^2.1.0:
|
|||
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
|
||||
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
|
||||
|
||||
is-stream@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
|
||||
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
|
||||
|
||||
is-unicode-supported@^0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
|
||||
|
@ -1403,6 +1570,17 @@ jest-get-type@^26.3.0:
|
|||
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
|
||||
integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
|
||||
|
||||
joi@^17.4.0:
|
||||
version "17.6.0"
|
||||
resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2"
|
||||
integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==
|
||||
dependencies:
|
||||
"@hapi/hoek" "^9.0.0"
|
||||
"@hapi/topo" "^5.0.0"
|
||||
"@sideway/address" "^4.1.3"
|
||||
"@sideway/formula" "^3.0.0"
|
||||
"@sideway/pinpoint" "^2.0.0"
|
||||
|
||||
js-sha256@^0.9.0:
|
||||
version "0.9.0"
|
||||
resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
|
||||
|
@ -1463,6 +1641,11 @@ jsonparse@^1.2.0:
|
|||
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
|
||||
integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
|
||||
|
||||
lazy-ass@1.6.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513"
|
||||
integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==
|
||||
|
||||
levn@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
|
||||
|
@ -1537,11 +1720,30 @@ make-error@^1.1.1:
|
|||
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
|
||||
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
|
||||
|
||||
mango_risk_check@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/mango_risk_check/-/mango_risk_check-1.2.1.tgz#bec5f85d1116f74154aec1ff97cddd0c2d2a9131"
|
||||
integrity sha512-R8ZXEdQpHf8Fu6Bvwb/b9Y0U4HNQ20uJknfq4v9WNiVdT6w8fY3Xb5rX6vkRJprvXFC7XhqDdi3ni8akts4UnA==
|
||||
dependencies:
|
||||
"@blockworks-foundation/mango-client" "^3.4.6"
|
||||
"@project-serum/anchor" "^0.24.2"
|
||||
"@solana/spl-token" "^0.2.0"
|
||||
|
||||
map-stream@~0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
|
||||
integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==
|
||||
|
||||
marked@^3.0.4:
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.7.tgz#343aad9e91b96249b495c99c512ea09cfe06de1e"
|
||||
integrity sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q==
|
||||
|
||||
merge-stream@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
|
||||
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
|
||||
|
||||
merge2@^1.3.0:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
|
||||
|
@ -1555,6 +1757,11 @@ micromatch@^4.0.2:
|
|||
braces "^3.0.1"
|
||||
picomatch "^2.2.3"
|
||||
|
||||
mimic-fn@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
|
||||
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
|
||||
|
||||
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
|
||||
|
@ -1572,6 +1779,11 @@ minimatch@3.0.4, minimatch@^3.0.4:
|
|||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimist@^1.2.5:
|
||||
version "1.2.6"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
||||
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
|
||||
|
||||
mocha@9:
|
||||
version "9.1.3"
|
||||
resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb"
|
||||
|
@ -1652,6 +1864,13 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
|
||||
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
|
||||
|
||||
npm-run-path@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
|
||||
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
|
||||
dependencies:
|
||||
path-key "^3.0.0"
|
||||
|
||||
once@^1.3.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
|
@ -1659,6 +1878,13 @@ once@^1.3.0:
|
|||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
onetime@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
|
||||
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
|
||||
dependencies:
|
||||
mimic-fn "^2.1.0"
|
||||
|
||||
onigasm@^2.2.5:
|
||||
version "2.2.5"
|
||||
resolved "https://registry.yarnpkg.com/onigasm/-/onigasm-2.2.5.tgz#cc4d2a79a0fa0b64caec1f4c7ea367585a676892"
|
||||
|
@ -1714,7 +1940,7 @@ path-is-absolute@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||
|
||||
path-key@^3.1.0:
|
||||
path-key@^3.0.0, path-key@^3.1.0:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
|
||||
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
|
||||
|
@ -1729,6 +1955,13 @@ pathval@^1.1.1:
|
|||
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
|
||||
integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
|
||||
|
||||
pause-stream@0.0.11:
|
||||
version "0.0.11"
|
||||
resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
|
||||
integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==
|
||||
dependencies:
|
||||
through "~2.3"
|
||||
|
||||
picomatch@^2.0.4, picomatch@^2.2.1:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
|
||||
|
@ -1764,6 +1997,13 @@ progress@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
||||
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
||||
|
||||
ps-tree@1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd"
|
||||
integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==
|
||||
dependencies:
|
||||
event-stream "=3.3.4"
|
||||
|
||||
punycode@^2.1.0:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
|
||||
|
@ -1850,6 +2090,13 @@ run-parallel@^1.1.9:
|
|||
dependencies:
|
||||
queue-microtask "^1.2.2"
|
||||
|
||||
rxjs@^7.1.0:
|
||||
version "7.5.6"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc"
|
||||
integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==
|
||||
dependencies:
|
||||
tslib "^2.1.0"
|
||||
|
||||
safe-buffer@^5.0.1, safe-buffer@^5.1.0:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||
|
@ -1899,6 +2146,11 @@ shiki@^0.9.11:
|
|||
onigasm "^2.2.5"
|
||||
vscode-textmate "5.2.0"
|
||||
|
||||
signal-exit@^3.0.3:
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
|
||||
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
|
||||
|
||||
slash@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
|
||||
|
@ -1934,11 +2186,38 @@ source-map@^0.6.0:
|
|||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||
|
||||
split@0.3:
|
||||
version "0.3.3"
|
||||
resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
|
||||
integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==
|
||||
dependencies:
|
||||
through "2"
|
||||
|
||||
sprintf-js@~1.0.2:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
||||
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
|
||||
|
||||
start-server-and-test@^1.14.0:
|
||||
version "1.14.0"
|
||||
resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.14.0.tgz#c57f04f73eac15dd51733b551d775b40837fdde3"
|
||||
integrity sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==
|
||||
dependencies:
|
||||
bluebird "3.7.2"
|
||||
check-more-types "2.24.0"
|
||||
debug "4.3.2"
|
||||
execa "5.1.1"
|
||||
lazy-ass "1.6.0"
|
||||
ps-tree "1.2.0"
|
||||
wait-on "6.0.0"
|
||||
|
||||
stream-combiner@~0.0.4:
|
||||
version "0.0.4"
|
||||
resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
|
||||
integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==
|
||||
dependencies:
|
||||
duplexer "~0.1.1"
|
||||
|
||||
string-width@^4.1.0, string-width@^4.2.0:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
|
@ -1955,6 +2234,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
|||
dependencies:
|
||||
ansi-regex "^5.0.1"
|
||||
|
||||
strip-final-newline@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
|
||||
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
|
||||
|
||||
strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
||||
|
@ -2008,7 +2292,7 @@ text-table@^0.2.0:
|
|||
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
||||
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
|
||||
|
||||
"through@>=2.2.7 <3":
|
||||
through@2, "through@>=2.2.7 <3", through@~2.3, through@~2.3.1:
|
||||
version "2.3.8"
|
||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
||||
|
@ -2062,6 +2346,11 @@ tslib@^2.0.3:
|
|||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
|
||||
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
|
||||
|
||||
tslib@^2.1.0:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
|
||||
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
|
||||
|
||||
tsutils@^3.21.0:
|
||||
version "3.21.0"
|
||||
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
|
||||
|
@ -2136,6 +2425,17 @@ vscode-textmate@5.2.0:
|
|||
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e"
|
||||
integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==
|
||||
|
||||
wait-on@6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.0.tgz#7e9bf8e3d7fe2daecbb7a570ac8ca41e9311c7e7"
|
||||
integrity sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==
|
||||
dependencies:
|
||||
axios "^0.21.1"
|
||||
joi "^17.4.0"
|
||||
lodash "^4.17.21"
|
||||
minimist "^1.2.5"
|
||||
rxjs "^7.1.0"
|
||||
|
||||
webidl-conversions@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
|
||||
|
|
Loading…
Reference in New Issue