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:
waterquarks 2022-07-25 02:01:23 -07:00 committed by GitHub
parent 3b5834f7cb
commit eadbedc2f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 920 additions and 5 deletions

View File

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

View File

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

View File

@ -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
View File

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