diff --git a/.github/workflows/balancer-js.yaml b/.github/workflows/balancer-js.yaml index 180f5ab39..525b66ff1 100644 --- a/.github/workflows/balancer-js.yaml +++ b/.github/workflows/balancer-js.yaml @@ -90,3 +90,6 @@ env: INFURA: ${{ secrets.INFURA }} ALCHEMY_URL: ${{ secrets.ALCHEMY_URL }} ALCHEMY_URL_GOERLI: ${{ secrets.ALCHEMY_URL_GOERLI }} + TENDERLY_ACCESS_KEY: ${{ secrets.TENDERLY_ACCESS_KEY }} + TENDERLY_PROJECT: ${{ secrets.TENDERLY_PROJECT }} + TENDERLY_USER: ${{ secrets.TENDERLY_USER }} diff --git a/.github/workflows/beta-release.yaml b/.github/workflows/beta-release.yaml new file mode 100644 index 000000000..6589fa03c --- /dev/null +++ b/.github/workflows/beta-release.yaml @@ -0,0 +1,51 @@ +name: Beta release + +on: + pull_request: + types: + - closed + branches: + - develop + +defaults: + run: + working-directory: balancer-js + +jobs: + build_and_release: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: develop + - uses: actions/setup-node@v3 + with: + node-version: 18 + - uses: actions/cache@v2 + id: cache + with: + path: "**/node_modules" + key: yarn-v1-${{ hashFiles('**/yarn.lock') }} + - run: yarn --immutable + if: steps.cache.outputs.cache-hit != 'true' + - env: + SIGNING_KEY: ${{ secrets.SIGNING_KEY }} + run: | + echo -n "$SIGNING_KEY" | base64 --decode | gpg --import + git config --global user.name "gmbronco" + git config --global user.email "gmbronco@users.noreply.github.com" + git config user.signingkey A33ABD316E6629F6 + git config gpg.program /usr/bin/gpg + yarn version --prerelease --no-git-tag-version + export NEW_VERSION=$(jq -r '.version' package.json) + git commit -S -am "chore: version bump v$NEW_VERSION" + git tag "v$NEW_VERSION" + yarn build + yarn publish --non-interactive --tag beta + git push + +env: + CI: true + GITHUB_TOKEN: ${{ secrets.RELEASE_PAT }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/balancer-js/.gitignore b/balancer-js/.gitignore index 4f9e5b2ba..322e23c8f 100644 --- a/balancer-js/.gitignore +++ b/balancer-js/.gitignore @@ -7,3 +7,4 @@ yarn-error.log dist/ src/subgraph/generated/ cache/ +balancer-js.iml diff --git a/balancer-js/IL-class.png b/balancer-js/IL-class.png new file mode 100644 index 000000000..c458c98a4 Binary files /dev/null and b/balancer-js/IL-class.png differ diff --git a/balancer-js/README.md b/balancer-js/README.md index aca9ac9aa..21bfc880a 100644 --- a/balancer-js/README.md +++ b/balancer-js/README.md @@ -12,10 +12,14 @@ A JavaScript SDK which provides commonly used utilties for interacting with Bala 4. Create a .env file in the balancer-js folder 5. In the .env file you will need to define and initialize the following variables + We have defined both Alchemy and Infura, because some of the examples use Infura, others use Alchemy. However, feel free to modify accordingly and use your favourite one. ALCHEMY_URL=[ALCHEMY HTTPS ENDPOINT] INFURA=[Infura API KEY] TRADER_KEY=[MetaMask PRIVATE KEY] - We have defined both Alchemy and Infura, because some of the examples use Infura, others use Alchemy. However, feel free to modify accordingly and use your favourite one. + Some examples also require the following Tenderly config parameters to be defined: + TENDERLY_ACCESS_KEY=[TENDERLY API ACCESS KEY] + TENDERLY_PROJECT=[TENDERLY PROJECT NAME] + TENDERLY_USER=[TENDERLY USERNAME] 6. Run 'npm run node', this runs a local Hardhat Network 7. Open a new terminal @@ -285,9 +289,11 @@ async getSpotPrice( [Example](./examples/spotPrice.ts) -## Join Pool +## Joining Pools -Exposes Join functionality allowing user to join pools. +### Joining with pool tokens + +Exposes Join functionality allowing user to join pools with its pool tokens. ```js const balancer = new BalancerSDK(sdkConfig); @@ -295,7 +301,7 @@ const pool = await balancer.pools.find(poolId); const { to, functionName, attributes, data } = pool.buildJoin(params); ``` -### #buildJoin +#### #buildJoin Builds a join transaction. @@ -317,6 +323,51 @@ buildJoin: ( [Example](./examples/join.ts) +### Joining nested pools + +Exposes Join functionality allowing user to join a pool that has pool tokens that are BPTs of other pools, e.g.: + +``` + CS0 + / \ + CS1 CS2 + / \ / \ + DAI USDC USDT FRAX + +Can join with tokens: DAI, USDC, USDT, FRAX, CS1_BPT, CS2_BPT +``` + +```js + /** + * Builds generalised join transaction + * + * @param poolId Pool id + * @param tokens Token addresses + * @param amounts Token amounts in EVM scale + * @param userAddress User address + * @param wrapMainTokens Indicates whether main tokens should be wrapped before being used + * @param slippage Maximum slippage tolerance in bps i.e. 50 = 0.5%. + * @param authorisation Optional auhtorisation call to be added to the chained transaction + * @returns transaction data ready to be sent to the network along with min and expected BPT amounts out. + */ + async generalisedJoin( + poolId: string, + tokens: string[], + amounts: string[], + userAddress: string, + wrapMainTokens: boolean, + slippage: string, + authorisation?: string + ): Promise<{ + to: string; + callData: string; + minOut: string; + expectedOut: string; + }> +``` + +[Example](./examples/joinGeneralised.ts) + ## Exit Pool Exposes Exit functionality allowing user to exit pools. @@ -371,6 +422,48 @@ Builds an exit transaction with exact tokens out and maximum BPT in based on sli [Example](./examples/exitExactTokensOut.ts) +### Exiting nested pools + +Exposes Exit functionality allowing user to exit a pool that has pool tokens that are BPTs of other pools, e.g.: + +``` + CS0 + / \ + CS1 CS2 + / \ / \ + DAI USDC USDT FRAX + +Can exit with CS0_BPT proportionally to: DAI, USDC, USDT and FRAX +``` + +```js +/** + * Builds generalised exit transaction + * + * @param poolId Pool id + * @param amount Token amount in EVM scale + * @param userAddress User address + * @param slippage Maximum slippage tolerance in bps i.e. 50 = 0.5%. + * @param authorisation Optional auhtorisation call to be added to the chained transaction + * @returns transaction data ready to be sent to the network along with tokens, min and expected amounts out. + */ + async generalisedExit( + poolId: string, + amount: string, + userAddress: string, + slippage: string, + authorisation?: string + ): Promise<{ + to: string; + callData: string; + tokensOut: string[]; + expectedAmountsOut: string[]; + minAmountsOut: string[]; + }> +``` + +[Example](./examples/exitGeneralised.ts) + ## RelayerService Relayers are (user opt-in, audited) contracts that can make calls to the vault (with the transaction “sender” being any arbitrary address) and use the sender’s ERC20 vault allowance, internal balance or BPTs on their behalf. @@ -476,6 +569,66 @@ async relayer.exitPoolAndBatchSwap( [Example](./examples/relayerExitPoolAndBatchSwap.ts) +### Pools Impermanent Loss + +> DRAFT +> +> impermanent loss (IL) describes the percentage by which a pool is worth less than what one would have if they had instead just held the tokens outside the pool + + +#### Service + +![class-diagram](IL-class.png) + +#### Algorithm + +Using the variation delta formula: + +![img.png](img.png) + +where **𝚫Pi** represents the difference between the price for a single token at the date of joining the pool and the current price. + +```javascript + +// retrieves pool's tokens +tokens = pool.tokens; +// get weights for tokens +weights = tokens.map((token) => token.weight); +// retrieves current price for tokens +exitPrices = tokens.map((token) => tokenPrices.find(token.address)); +// retrieves historical price for tokens +entryPrices = tokens.map((token) => tokenPrices.findBy('timestamp', { address: token.address, timestamp: timestamp})); +// retrieves list of pool's assets with prices delta and weights +assets = tokens.map((token) => ({ + priceDelta: this.getDelta(entryPrices[token.address], exitPrices[token.address]), + weight: weights[i], +})); + +poolValueDelta = assets.reduce((result, asset) => result * Math.pow(Math.abs(asset.priceDelta + 1), asset.weight), 1); +holdValueDelta = assets.reduce((result, asset) => result + (Math.abs(asset.priceDelta + 1) * asset.weight), 0); + +const IL = poolValueDelta/holdValueDelta - 1; +``` + +#### Usage + +```javascript +async impermanentLoss( + timestamp: number, // the UNIX timestamp from which the IL is desired + pool: Pool // the pool on which the IL must be calculated +): Promise +``` + +```javascript +const pool = await sdk.pools.find(poolId); +const joins = (await sdk.data.findByUser(userAddress)).filter((it) => it.type === "Join" && it.poolId === poolId); +const join = joins[0]; +const IL = await pools.impermanentLoss(join.timestamp, pool); +``` + +[Example](./examples/pools/impermanentLoss.ts) + + ## Licensing [GNU General Public License Version 3 (GPL v3)](../../LICENSE). diff --git a/balancer-js/examples/data/pool-joinExit.ts b/balancer-js/examples/data/pool-joinExit.ts new file mode 100644 index 000000000..9ecaad5ad --- /dev/null +++ b/balancer-js/examples/data/pool-joinExit.ts @@ -0,0 +1,61 @@ +import { BalancerSDK, Network } from '../../src'; +import { InvestType } from '../../src/modules/subgraph/generated/balancer-subgraph-types'; +import { PoolJoinExit } from '../../src/modules/data/pool-joinExit'; + +// Balancer subgraph : https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-polygon-v2 + +// npm run examples:run -- ./examples/data/pool-joinExit.ts + +const sdk = new BalancerSDK({ + network: Network.POLYGON, + rpcUrl: '', +}); +const { poolJoinExits } = sdk.data; + +const format = (result: PoolJoinExit[]): string => { + return result + .map( + (it) => + `${it.poolId}\t${it.type}\t${new Date( + it.timestamp * 1000 + ).toLocaleString()}` + ) + .join('\n'); +}; + +(async function () { + const USER_ADDR = '0xdfe6e354ce787944e67cc04ad4404a43f3112a10'; + const POOL_ID = + '0x36128d5436d2d70cab39c9af9cce146c38554ff0000100000000000000000008'; + let result; + + result = await poolJoinExits.findByPool(POOL_ID, 5); + if (result.length) { + const item = result[0]; + console.log( + `Pool JoinExit by Pool Id:\n${item.type}\t${new Date( + item.timestamp * 1000 + ).toLocaleString()}\t${item.tokens}` + ); + } + + result = await poolJoinExits.findByUser(USER_ADDR, 5); + console.log(`Pool JoinExit by User:\n${format(result)}`); + + const poolId = result[0].poolId; + + result = await poolJoinExits.query({ + where: { pool: poolId, sender: USER_ADDR }, + }); + console.log(`Pool JoinExit Query by PoolId and User:\n${format(result)}`); + + result = await poolJoinExits.findJoins(USER_ADDR, poolId); + console.log( + `Pool JoinExit Query by PoolId and User and Type Join:\n${format(result)}` + ); + + result = await poolJoinExits.findExits(USER_ADDR, poolId); + console.log( + `Pool JoinExit Query by PoolId and User and Type Exit:\n${format(result)}` + ); +})(); diff --git a/balancer-js/examples/data/token-prices.ts b/balancer-js/examples/data/token-prices.ts new file mode 100644 index 000000000..51a6984ce --- /dev/null +++ b/balancer-js/examples/data/token-prices.ts @@ -0,0 +1,20 @@ +/** + * Display APRs for pool ids hardcoded under `const ids` + * Run command: yarn examples:run ./examples/data/token-prices.ts + */ +import { BalancerSDK } from '@/.'; + +const sdk = new BalancerSDK({ network: 1, rpcUrl: '' }); +const { data } = sdk; +const dai = '0x6b175474e89094c44da98b954eedeac495271d0f'; +const eth = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; +const matic = '0x0000000000000000000000000000000000001010'; +const tetuBal = '0x7fc9e0aa043787bfad28e29632ada302c790ce33'; + +(async () => { + // It will be just one request to coingecko + const ps = [eth, dai, tetuBal, matic, eth, dai, tetuBal, matic].map((t) => data.tokenPrices.find(t)); + const price = await Promise.all(ps); + + console.log(price); +})(); diff --git a/balancer-js/examples/data/token-yields.ts b/balancer-js/examples/data/token-yields.ts index 46f241bd4..bfb247db2 100644 --- a/balancer-js/examples/data/token-yields.ts +++ b/balancer-js/examples/data/token-yields.ts @@ -8,10 +8,20 @@ import { yieldTokens } from '../../src/modules/data/token-yields/tokens/aave'; const sdk = new BalancerSDK({ network: 1, rpcUrl: '' }); const { data } = sdk; +const tokens = [ + yieldTokens[1].waDAI, + '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', // stMatic + '0xae7ab96520de3a18e5e111b5eaab095312d7fe84' // stETH +] + const main = async () => { - const tokenYield = await data.tokenYields.find(yieldTokens.waDAI); + const yields = await Promise.all( + tokens.map((token) => data.tokenYields.find(token)) + ) - console.log(yieldTokens.waDAI, tokenYield); + tokens.forEach((token, id) => { + console.log(token, yields[id]) + }) }; main(); diff --git a/balancer-js/examples/exitGeneralised.ts b/balancer-js/examples/exitGeneralised.ts new file mode 100644 index 000000000..f9add8b34 --- /dev/null +++ b/balancer-js/examples/exitGeneralised.ts @@ -0,0 +1,139 @@ +import dotenv from 'dotenv'; +import { JsonRpcProvider } from '@ethersproject/providers'; +import { parseFixed } from '@ethersproject/bignumber'; +import { BalancerSDK, Network } from '../src/index'; +import { forkSetup, getBalances } from '../src/test/lib/utils'; +import { ADDRESSES } from '../src/test/lib/constants'; +import { Relayer } from '../src/modules/relayer/relayer.module'; +import { Contracts } from '../src/modules/contracts/contracts.module'; + +dotenv.config(); + +const { + ALCHEMY_URL_GOERLI: jsonRpcUrl, + TENDERLY_ACCESS_KEY, + TENDERLY_PROJECT, + TENDERLY_USER, +} = process.env; +const network = Network.GOERLI; +const blockNumber = 7890980; +const rpcUrl = 'http://127.0.0.1:8000'; +const addresses = ADDRESSES[network]; +const bbausd2 = { + id: addresses.bbausd2?.id as string, + address: addresses.bbausd2?.address as string, + decimals: addresses.bbausd2?.decimals, + slot: addresses.bbausd2?.slot as number, +}; + +// Setup local fork with correct balances/approval to exit bb-a-usd2 pool +async function setUp(provider: JsonRpcProvider): Promise { + const signer = provider.getSigner(); + const signerAddress = await signer.getAddress(); + + const mainTokens = [bbausd2.address]; + const mainInitialBalances = [parseFixed('10', bbausd2.decimals).toString()]; + const mainSlots = [bbausd2.slot]; + + await forkSetup( + signer, + mainTokens, + mainSlots, + mainInitialBalances, + jsonRpcUrl as string, + blockNumber + ); + + const { contracts, contractAddresses } = new Contracts( + network as number, + provider + ); + + return await Relayer.signRelayerApproval( + contractAddresses.relayerV4 as string, + signerAddress, + signer, + contracts.vault + ); +} + +/* +Example showing how to use the SDK generalisedExit method. +This allows exiting a ComposableStable that has nested pools, e.g.: + CS0 + / \ + CS1 CS2 + / \ / \ + DAI USDC USDT FRAX + +Can exit with CS0_BPT proportionally to: DAI, USDC, USDT and FRAX +*/ +async function exit() { + const provider = new JsonRpcProvider(rpcUrl, network); + // Local fork setup + const relayerAuth = await setUp(provider); + + const signer = provider.getSigner(); + const signerAddress = await signer.getAddress(); + const slippage = '100'; // 100 bps = 1% + + // Here we exit with bb-a-usd BPT + const amount = parseFixed('10', bbausd2.decimals).toString(); + + // Custom Tenderly configuration parameters - remove in order to use default values + const tenderlyConfig = { + accessKey: TENDERLY_ACCESS_KEY as string, + user: TENDERLY_USER as string, + project: TENDERLY_PROJECT as string, + blockNumber, + }; + + const balancer = new BalancerSDK({ + network, + rpcUrl, + customSubgraphUrl: + 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-goerli-v2-beta', + tenderly: tenderlyConfig, + }); + + // Use SDK to create exit transaction + const query = await balancer.pools.generalisedExit( + bbausd2.id, + amount, + signerAddress, + slippage, + relayerAuth + ); + + // Checking balances to confirm success + const tokenBalancesBefore = ( + await getBalances( + [bbausd2.address, ...query.tokensOut], + signer, + signerAddress + ) + ).map((b) => b.toString()); + + // Submit exit tx + const transactionResponse = await signer.sendTransaction({ + to: query.to, + data: query.callData, + }); + + await transactionResponse.wait(); + const tokenBalancesAfter = ( + await getBalances( + [bbausd2.address, ...query.tokensOut], + signer, + signerAddress + ) + ).map((b) => b.toString()); + + console.log('Balances before exit: ', tokenBalancesBefore); + console.log('Balances after exit: ', tokenBalancesAfter); + console.log('Expected amounts out: ', [...query.expectedAmountsOut]); + console.log('Min amounts out: ', [...query.minAmountsOut]); +} + +// yarn examples:run ./examples/exitGeneralised.ts +exit(); diff --git a/balancer-js/examples/join.ts b/balancer-js/examples/join.ts index 76d7afa6f..9c2c3cfc4 100644 --- a/balancer-js/examples/join.ts +++ b/balancer-js/examples/join.ts @@ -14,13 +14,6 @@ dotenv.config(); const { ALCHEMY_URL: jsonRpcUrl } = process.env; -// Slots used to set the account balance for each token through hardhat_setStorageAt -// Info fetched using npm package slot20 -const wBTC_SLOT = 0; -const wETH_SLOT = 3; -const slots = [wBTC_SLOT, wETH_SLOT]; -const initialBalances = ['10000000', '1000000000000000000']; - /* Example showing how to use Pools module to join pools. */ @@ -31,12 +24,20 @@ async function join() { const signer = provider.getSigner(); const signerAddress = await signer.getAddress(); - const poolId = - '0xa6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e'; // 50/50 WBTC/WETH Pool + // 50/50 WBTC/WETH Pool + const poolId = ADDRESSES[network].WBTCWETH?.id as string; + // Tokens that will be provided to pool by joiner const tokensIn = [ ADDRESSES[network].WBTC?.address, ADDRESSES[network].WETH?.address, - ]; // Tokens that will be provided to pool by joiner + ] as string[]; + // Slots used to set the account balance for each token through hardhat_setStorageAt + // Info fetched using npm package slot20 + const slots = [ + ADDRESSES[network].WBTC?.slot, + ADDRESSES[network].WETH?.slot, + ] as number[]; + const amountsIn = ['10000000', '1000000000000000000']; const slippage = '100'; // 100 bps = 1% @@ -47,13 +48,7 @@ async function join() { const balancer = new BalancerSDK(sdkConfig); // Sets up local fork granting signer initial balances and token approvals - await forkSetup( - signer, - tokensIn as string[], - slots, - initialBalances, - jsonRpcUrl as string - ); + await forkSetup(signer, tokensIn, slots, amountsIn, jsonRpcUrl as string); // Use SDK to find pool info const pool: PoolWithMethods | undefined = await balancer.pools.find(poolId); @@ -67,16 +62,13 @@ async function join() { // Use SDK to create join const { to, data, minBPTOut } = pool.buildJoin( signerAddress, - tokensIn as string[], + tokensIn, amountsIn, slippage ); // Calculate price impact - const priceImpact = await pool.calcPriceImpact( - amountsIn as string[], - minBPTOut - ); + const priceImpact = await pool.calcPriceImpact(amountsIn, minBPTOut, true); // Submit join tx const transactionResponse = await signer.sendTransaction({ diff --git a/balancer-js/examples/joinGeneralised.ts b/balancer-js/examples/joinGeneralised.ts new file mode 100644 index 000000000..81940b161 --- /dev/null +++ b/balancer-js/examples/joinGeneralised.ts @@ -0,0 +1,157 @@ +import dotenv from 'dotenv'; +import { JsonRpcProvider } from '@ethersproject/providers'; +import { parseFixed } from '@ethersproject/bignumber'; +import { BalancerSDK, Network } from '../src/index'; +import { forkSetup, getBalances } from '../src/test/lib/utils'; +import { ADDRESSES } from '../src/test/lib/constants'; +import { Relayer } from '../src/modules/relayer/relayer.module'; +import { Contracts } from '../src/modules/contracts/contracts.module'; + +dotenv.config(); + +const { + ALCHEMY_URL_GOERLI: jsonRpcUrl, + TENDERLY_ACCESS_KEY, + TENDERLY_PROJECT, + TENDERLY_USER, +} = process.env; +const network = Network.GOERLI; +const blockNumber = 7890980; +const rpcUrl = 'http://127.0.0.1:8000'; +const addresses = ADDRESSES[network]; + +// Setup local fork with correct balances/approval to join pool with DAI/USDC/bbaDAI/bbaUSDC +async function setUp(provider: JsonRpcProvider): Promise { + const signer = provider.getSigner(); + const signerAddress = await signer.getAddress(); + + const mainTokens = [addresses.DAI.address, addresses.USDC.address]; + const mainInitialBalances = [ + parseFixed('100', addresses.DAI.decimals).toString(), + parseFixed('100', addresses.USDC.decimals).toString(), + ]; + const mainSlots = [ + addresses.DAI.slot as number, + addresses.USDC.slot as number, + ]; + + const linearPoolTokens = [ + addresses.bbadai?.address as string, + addresses.bbausdc?.address as string, + ]; + const linearInitialBalances = [ + parseFixed('100', addresses.bbadai?.decimals).toString(), + parseFixed('100', addresses.bbausdc?.decimals).toString(), + ]; + const linearPoolSlots = [ + addresses.bbadai?.slot as number, + addresses.bbausdc?.slot as number, + ]; + + await forkSetup( + signer, + [...mainTokens, ...linearPoolTokens], + [...mainSlots, ...linearPoolSlots], + [...mainInitialBalances, ...linearInitialBalances], + jsonRpcUrl as string, + blockNumber + ); + + const { contracts, contractAddresses } = new Contracts( + network as number, + provider + ); + + return await Relayer.signRelayerApproval( + contractAddresses.relayerV4 as string, + signerAddress, + signer, + contracts.vault + ); +} + +/* +Example showing how to use the SDK generalisedJoin method. +This allows joining of a ComposableStable that has nested pools, e.g.: + CS0 + / \ + CS1 CS2 + / \ / \ + DAI USDC USDT FRAX + +Can join with tokens: DAI, USDC, USDT, FRAX, CS1_BPT, CS2_BPT +*/ +async function join() { + const provider = new JsonRpcProvider(rpcUrl, network); + // Local fork setup + const relayerAuth = await setUp(provider); + + const signer = provider.getSigner(); + const signerAddress = await signer.getAddress(); + const wrapLeafTokens = false; + const slippage = '100'; // 100 bps = 1% + const bbausd2 = { + id: addresses.bbausd2?.id as string, + address: addresses.bbausd2?.address as string, + }; + // Here we join with USDC and bbadai + const tokensIn = [ + addresses.USDC.address, + addresses.bbadai?.address as string, + ]; + const amountsIn = [ + parseFixed('10', 6).toString(), + parseFixed('10', 18).toString(), + ]; + + // Custom Tenderly configuration parameters - remove in order to use default values + const tenderlyConfig = { + accessKey: TENDERLY_ACCESS_KEY as string, + user: TENDERLY_USER as string, + project: TENDERLY_PROJECT as string, + blockNumber, + }; + + const balancer = new BalancerSDK({ + network, + rpcUrl, + customSubgraphUrl: + 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-goerli-v2-beta', + tenderly: tenderlyConfig, + }); + + // Checking balances to confirm success + const tokenBalancesBefore = ( + await getBalances([bbausd2.address, ...tokensIn], signer, signerAddress) + ).map((b) => b.toString()); + + // Use SDK to create join + const query = await balancer.pools.generalisedJoin( + bbausd2.id, + tokensIn, + amountsIn, + signerAddress, + wrapLeafTokens, + slippage, + relayerAuth + ); + + // Submit join tx + const transactionResponse = await signer.sendTransaction({ + to: query.to, + data: query.callData, + }); + + await transactionResponse.wait(); + const tokenBalancesAfter = ( + await getBalances([bbausd2.address, ...tokensIn], signer, signerAddress) + ).map((b) => b.toString()); + + console.log('Balances before exit: ', tokenBalancesBefore); + console.log('Balances after exit: ', tokenBalancesAfter); + console.log('Expected BPT after exit: ', [query.expectedOut]); + console.log('Min BPT after exit: ', [query.minOut]); +} + +// yarn examples:run ./examples/joinGeneralised.ts +join(); diff --git a/balancer-js/examples/pools/aprs.polygon.ts b/balancer-js/examples/pools/aprs.polygon.ts index e75c8b1cb..d91943f3e 100644 --- a/balancer-js/examples/pools/aprs.polygon.ts +++ b/balancer-js/examples/pools/aprs.polygon.ts @@ -1,6 +1,6 @@ /** * Display APRs for pool ids hardcoded under `const ids` - * Run command: yarn examples:run ./examples/pools/aprs.ts + * Run command: yarn examples:run ./examples/pools/aprs.polygon.ts */ import dotenv from 'dotenv'; import { BalancerSDK } from '../../src/modules/sdk.module'; @@ -19,7 +19,7 @@ const { pools } = sdk; const main = async () => { const pool = await pools.find( - '0x0297e37f1873d2dab4487aa67cd56b58e2f27875000100000000000000000002' + '0x8159462d255c1d24915cb51ec361f700174cd99400000000000000000000075d' ); if (pool) { diff --git a/balancer-js/examples/pools/aprs.ts b/balancer-js/examples/pools/aprs.ts index dbccfb22d..b86b62cf5 100644 --- a/balancer-js/examples/pools/aprs.ts +++ b/balancer-js/examples/pools/aprs.ts @@ -23,6 +23,7 @@ const main = async () => { pool.poolType != 'LiquidityBootstrapping' ) ) + // .filter((p) => p.id === '0xa13a9247ea42d743238089903570127dda72fe4400000000000000000000035d') .sort((a, b) => parseFloat(b.totalLiquidity) - parseFloat(a.totalLiquidity)) .slice(0, 30); diff --git a/balancer-js/examples/pools/impermanentLoss.ts b/balancer-js/examples/pools/impermanentLoss.ts new file mode 100644 index 000000000..fa201a946 --- /dev/null +++ b/balancer-js/examples/pools/impermanentLoss.ts @@ -0,0 +1,51 @@ +/** + * calculate impermanent loss for a pool from a given timestamp. + * + * Run command: npm run examples:run -- ./examples/pools/impermanentLoss.ts + * + */ + +import dotenv from "dotenv"; +import {BalancerError, BalancerErrorCode, BalancerSDK} from "../../src"; + +dotenv.config(); + +const sdk = new BalancerSDK({ + network: 1, + rpcUrl: `${process.env.ALCHEMY_URL}`, +}); + +const { pools } = sdk; + +const { poolJoinExits } = sdk.data; + +const main = async (): Promise => { + await impermanentLoss('0x0647721e414a7ab11817427c6f49d0d15d6aae53', '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014'); + await impermanentLoss('0x0a53d9586dd052a06fca7649a02b973cc164c1b4', '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014'); + await impermanentLoss('0x000000000088e0120f9e6652cc058aec07564f69', '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014'); + await impermanentLoss('0x07dd13b2705050b2f5c60da9f7f0f37b7395945a', '0xc45d42f801105e861e86658648e3678ad7aa70f900010000000000000000011e'); + await impermanentLoss('0x00bcfc8f7471b2e4d21af417dea393c1578c67c1', '0x1e19cf2d73a72ef1332c882f20534b6519be0276000200000000000000000112'); + // await impermanentLoss('0x356226e2f6d49749fd5f0fa5656acf86b20f3485', '0xa13a9247ea42d743238089903570127dda72fe4400000000000000000000035d'); +} + +const impermanentLoss = async (userAddress: string, poolId: string): Promise => { + try { + const joins = await poolJoinExits.findJoins(userAddress, poolId); + if (!joins.length) { + console.log(`${userAddress}: No Pool found`); + return; + } + const timestamp = joins[0].timestamp; + + const pool = await sdk.pools.find(poolId); + if (!pool) { + throw new BalancerError(BalancerErrorCode.POOL_DOESNT_EXIST); + } + const IL = await pools.impermanentLoss(timestamp, pool); + console.log(`${userAddress} ${poolId} => ${IL}%`); + } catch (e: any) { + console.error(`${userAddress} ${poolId} => Error: ${e.message}`); + } +} + +main().then(() => console.log('done')); \ No newline at end of file diff --git a/balancer-js/examples/pools/liquidity.polygon.ts b/balancer-js/examples/pools/liquidity.polygon.ts new file mode 100644 index 000000000..7194f4d50 --- /dev/null +++ b/balancer-js/examples/pools/liquidity.polygon.ts @@ -0,0 +1,31 @@ +/** + * Display APRs for pool ids hardcoded under `const ids` + * Run command: yarn examples:run ./examples/pools/liquidity.polygon.ts + */ +import dotenv from 'dotenv' +import { BalancerSDK } from '@/.' + +dotenv.config() + +const sdk = new BalancerSDK({ + network: 137, + rpcUrl: `${process.env.ALCHEMY_URL?.replace( + 'eth-mainnet', + 'polygon-mainnet.g' + )}`, +}) + +const { pools } = sdk + +const main = async () => { + const pool = await pools.find( + '0xb797adfb7b268faeaa90cadbfed464c76ee599cd0002000000000000000005ba' + ) + + if (pool) { + const liquidity = await pools.liquidity(pool) + console.log(pool.id, pool.poolType, pool.totalLiquidity, liquidity) + } +} + +main() diff --git a/balancer-js/examples/pools/liquidity.ts b/balancer-js/examples/pools/liquidity.ts index a89dc7e01..6a3ba89cc 100644 --- a/balancer-js/examples/pools/liquidity.ts +++ b/balancer-js/examples/pools/liquidity.ts @@ -6,20 +6,23 @@ const sdk = new BalancerSDK({ }); const { pools } = sdk; +const { data } = sdk; (() => { [ - '0xa13a9247ea42d743238089903570127dda72fe4400000000000000000000035d', + // '0xa13a9247ea42d743238089903570127dda72fe4400000000000000000000035d', // '0x2f4eb100552ef93840d5adc30560e5513dfffacb000000000000000000000334', + '0xc065798f227b49c150bcdc6cdc43149a12c4d75700020000000000000000010b', ].forEach(async (poolId) => { const pool = await pools.find(poolId); if (pool) { const liquidity = await pools.liquidity(pool); console.table([ { + pool: pool.name, totalShares: pool.totalShares, liquidity: liquidity, - bptPrice: parseFloat(pool.totalShares) / parseFloat(liquidity), + bptPrice: parseFloat(liquidity) / parseFloat(pool.totalShares), }, ]); } diff --git a/balancer-js/examples/swapSor.ts b/balancer-js/examples/swapSor.ts index 9cb080898..204a34531 100644 --- a/balancer-js/examples/swapSor.ts +++ b/balancer-js/examples/swapSor.ts @@ -61,7 +61,7 @@ async function getAndProcessSwaps( swapInfo, pools, wallet.address, - balancer.contracts.relayerV4!.address, + balancer.contracts.relayer!.address, balancer.networkConfig.addresses.tokens.wrappedNativeAsset, slippage, undefined @@ -71,7 +71,7 @@ async function getAndProcessSwaps( // console.log(wallet.address); // console.log(await balancer.sor.provider.getBlockNumber()); // console.log(relayerCallData.data); - const result = await balancer.contracts.relayerV4 + const result = await balancer.contracts.relayer ?.connect(wallet) .callStatic.multicall(relayerCallData.rawCalls); console.log(result); diff --git a/balancer-js/img.png b/balancer-js/img.png new file mode 100644 index 000000000..4140402fd Binary files /dev/null and b/balancer-js/img.png differ diff --git a/balancer-js/package.json b/balancer-js/package.json index 66f7f9bb8..ff8dd76b5 100644 --- a/balancer-js/package.json +++ b/balancer-js/package.json @@ -1,6 +1,6 @@ { "name": "@balancer-labs/sdk", - "version": "0.1.37", + "version": "0.1.39", "description": "JavaScript SDK for interacting with the Balancer Protocol V2", "license": "GPL-3.0-only", "homepage": "https://github.com/balancer-labs/balancer-sdk/balancer-js#readme", @@ -89,7 +89,7 @@ "typescript": "^4.0.2" }, "dependencies": { - "@balancer-labs/sor": "^4.0.1-beta.12", + "@balancer-labs/sor": "^4.0.1-beta.15", "@balancer-labs/typechain": "^1.0.0", "axios": "^0.24.0", "graphql": "^15.6.1", diff --git a/balancer-js/src/balancerErrors.ts b/balancer-js/src/balancerErrors.ts index 8a2943fc3..a26e32751 100644 --- a/balancer-js/src/balancerErrors.ts +++ b/balancer-js/src/balancerErrors.ts @@ -9,6 +9,7 @@ export enum BalancerErrorCode { NO_POOL_DATA = 'NO_POOL_DATA', INPUT_OUT_OF_BOUNDS = 'INPUT_OUT_OF_BOUNDS', INPUT_LENGTH_MISMATCH = 'INPUT_LENGTH_MISMATCH', + INPUT_TOKEN_INVALID = 'INPUT_TOKEN_INVALID', INPUT_ZERO_NOT_ALLOWED = 'INPUT_ZERO_NOT_ALLOWED', TOKEN_MISMATCH = 'TOKEN_MISMATCH', MISSING_TOKENS = 'MISSING_TOKENS', @@ -17,6 +18,11 @@ export enum BalancerErrorCode { MISSING_PRICE_RATE = 'MISSING_PRICE_RATE', MISSING_WEIGHT = 'MISSING_WEIGHT', RELAY_SWAP_AMOUNTS = 'RELAY_SWAP_AMOUNTS', + NO_VALUE_PARAMETER = 'NO_VALUE_PARAMETER', + ILLEGAL_PARAMETER = 'ILLEGAL_PARAMETER', + TIMESTAMP_IN_THE_FUTURE = 'TIMESTAMP_IN_THE_FUTURE', + JOIN_DELTA_AMOUNTS = 'JOIN_DELTA_AMOUNTS', + EXIT_DELTA_AMOUNTS = 'EXIT_DELTA_AMOUNTS', } export class BalancerError extends Error { @@ -47,6 +53,8 @@ export class BalancerError extends Error { return 'input out of bounds'; case BalancerErrorCode.INPUT_LENGTH_MISMATCH: return 'input length mismatch'; + case BalancerErrorCode.INPUT_TOKEN_INVALID: + return 'input token invalid'; case BalancerErrorCode.TOKEN_MISMATCH: return 'token mismatch'; case BalancerErrorCode.MISSING_DECIMALS: @@ -63,6 +71,16 @@ export class BalancerError extends Error { return 'zero input not allowed'; case BalancerErrorCode.RELAY_SWAP_AMOUNTS: return 'Error when checking swap amounts'; + case BalancerErrorCode.NO_VALUE_PARAMETER: + return 'Illegal value passed as parameter'; + case BalancerErrorCode.TIMESTAMP_IN_THE_FUTURE: + return 'Timestamp cannot be in the future'; + case BalancerErrorCode.ILLEGAL_PARAMETER: + return 'An illegal parameter has been passed'; + case BalancerErrorCode.JOIN_DELTA_AMOUNTS: + return 'Error when checking join call deltas'; + case BalancerErrorCode.EXIT_DELTA_AMOUNTS: + return 'Error when checking exit call deltas'; default: return 'Unknown error'; } diff --git a/balancer-js/src/lib/abi/BatchRelayerLibrary.json b/balancer-js/src/lib/abi/BatchRelayerLibrary.json index ca1953a4c..3c3b2bc33 100644 --- a/balancer-js/src/lib/abi/BatchRelayerLibrary.json +++ b/balancer-js/src/lib/abi/BatchRelayerLibrary.json @@ -486,6 +486,25 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ref", + "type": "uint256" + } + ], + "name": "peekChainedReferenceValue", + "outputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1008,4 +1027,4 @@ "stateMutability": "payable", "type": "function" } -] \ No newline at end of file +] diff --git a/balancer-js/src/lib/constants/config.ts b/balancer-js/src/lib/constants/config.ts index 58fbaf783..3599191f9 100644 --- a/balancer-js/src/lib/constants/config.ts +++ b/balancer-js/src/lib/constants/config.ts @@ -11,9 +11,10 @@ export const BALANCER_NETWORK_CONFIG: Record = { vault: '0xBA12222222228d8Ba445958a75a0704d566BF2C8', multicall: '0xeefba1e63905ef1d7acba5a8513c70307c1ce441', lidoRelayer: '0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965', + relayerV3: '0x886A3Ec7bcC508B8795990B60Fa21f85F9dB7948', + relayerV4: '0x2536dfeeCB7A0397CF98eDaDA8486254533b1aFA', gaugeController: '0xc128468b7ce63ea702c1f104d55a2566b13d3abd', feeDistributor: '0xD3cf852898b21fc233251427c2DC93d3d604F3BB', - relayerV4: '0x2536dfeeCB7A0397CF98eDaDA8486254533b1aFA', protocolFeePercentagesProvider: '0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A', veBal: '0xC128a9954e6c874eA3d62ce62B468bA073093F25', @@ -54,6 +55,7 @@ export const BALANCER_NETWORK_CONFIG: Record = { contracts: { vault: '0xBA12222222228d8Ba445958a75a0704d566BF2C8', multicall: '0xa1B2b503959aedD81512C37e9dce48164ec6a94d', + relayerV3: '0xcf6a66E32dCa0e26AcC3426b851FD8aCbF12Dac7', relayerV4: '0x28A224d9d398a1eBB7BA69BCA515898966Bb1B6b', }, tokens: { @@ -77,6 +79,7 @@ export const BALANCER_NETWORK_CONFIG: Record = { contracts: { vault: '0xBA12222222228d8Ba445958a75a0704d566BF2C8', multicall: '0x269ff446d9892c9e19082564df3f5e8741e190a1', + relayerV3: '0x42E49B48573c725ee32d2579060Ed06894f97002', relayerV4: '0x5bf3B7c14b10f16939d63Bd679264A1Aa951B4D5', }, tokens: { @@ -158,8 +161,9 @@ export const BALANCER_NETWORK_CONFIG: Record = { contracts: { vault: '0xBA12222222228d8Ba445958a75a0704d566BF2C8', multicall: '0x77dCa2C955b15e9dE4dbBCf1246B4B85b651e50e', - gaugeController: '0xBB1CE49b16d55A1f2c6e88102f32144C7334B116', + relayerV3: '0x7b9B6f094DC2Bd1c12024b0D9CC63d6993Be1888', relayerV4: '0x00e695aA8000df01B8DC8401B4C34Fba5D56BBb2', + gaugeController: '0xBB1CE49b16d55A1f2c6e88102f32144C7334B116', veBal: '0x33A99Dcc4C85C014cf12626959111D5898bbCAbF', veBalProxy: '0xA1F107D1cD709514AE8A914eCB757E95f9cedB31', }, @@ -183,6 +187,7 @@ export const BALANCER_NETWORK_CONFIG: Record = { contracts: { vault: '0xBA12222222228d8Ba445958a75a0704d566BF2C8', multicall: '0x2dc0e2aa608532da689e89e237df582b783e552c', + relayerV3: '0x195CcCBE464EF9073d1f7A1ba1C9Bf0f56dfFFff', relayerV4: '0x1a58897Ab366082028ced3740900ecBD765Af738', }, tokens: { diff --git a/balancer-js/src/lib/utils/debouncer.spec.ts b/balancer-js/src/lib/utils/debouncer.spec.ts new file mode 100644 index 000000000..4b8e3badc --- /dev/null +++ b/balancer-js/src/lib/utils/debouncer.spec.ts @@ -0,0 +1,86 @@ +import { expect } from 'chai'; +import { Debouncer } from './debouncer'; + +const randomString = (length: number) => + Array.from({ length }, () => + String.fromCharCode(Math.floor(Math.random() * 26) + 97) + ).join(''); + +describe('Debouncer', () => { + it('should call the original async function after the specified wait time', async () => { + let called = false; + const asyncFunc = async () => { + called = true; + }; + const subject = new Debouncer(asyncFunc, 50); + subject.fetch(); + + expect(called).to.eq(false); + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(called).to.eq(true); + }); + + it('should prevent the original async function from being called multiple times within the specified wait time', async () => { + let callCount = 0; + const asyncFunc = async () => { + callCount++; + }; + const subject = new Debouncer(asyncFunc, 50); + + subject.fetch(); + subject.fetch(); + subject.fetch(); + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(callCount).to.eq(1); + }); + + it('should aggregate attributes', async () => { + let attrs: string[] = []; + const asyncFunc = async (asyncAttrs: string[]) => { + attrs = asyncAttrs; + }; + const subject = new Debouncer(asyncFunc, 50); + const testStrings = Array.from({ length: 5 }, () => randomString(5)); + + testStrings.forEach((str) => { + subject.fetch(str); + }); + expect(attrs).to.eql([]); + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(attrs).to.eql(testStrings); + }); + + it("shouldn't fetch the same attribute twice", async () => { + let attrs: string[] = []; + const asyncFunc = async (asyncAttrs: string[]) => { + attrs = asyncAttrs; + }; + const subject = new Debouncer(asyncFunc, 50); + + subject.fetch('just once'); + subject.fetch('just once'); + + expect(attrs).to.eql([]); + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(attrs).to.eql(['just once']); + }); + + it('returns a new promise when one is already running', async () => { + let attrs: string[] = []; + const asyncFunc = async (asyncAttrs: string[]) => + new Promise((resolve) => + setTimeout(() => { + attrs = asyncAttrs; + resolve(attrs); + }, 50) + ); + const subject = new Debouncer(asyncFunc, 30); + + const p1 = subject.fetch('first'); + expect(attrs).to.eql([]); + await new Promise((resolve) => setTimeout(resolve, 40)); + const p2 = subject.fetch('second'); + expect(await p1).to.eql(['first']); + expect(await p2).to.eql(['second']); + }); +}); diff --git a/balancer-js/src/lib/utils/debouncer.ts b/balancer-js/src/lib/utils/debouncer.ts new file mode 100644 index 000000000..5fb49bfb9 --- /dev/null +++ b/balancer-js/src/lib/utils/debouncer.ts @@ -0,0 +1,81 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ + +/** + * Debouncer for different attributes requested over time, which need to be aggregated into a single resolving call + * + * Choosing deferred promise since we have setTimeout that returns a promise + * Some reference for history buffs: https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns + */ + +interface Promised { + promise: Promise; + resolve: (value: T) => void; + reject: (reason: unknown) => void; +} + +const makePromise = (): Promised => { + let resolve: (value: T) => void = () => {}; + let reject: (reason: unknown) => void = () => {}; + const promise = new Promise((res, rej) => { + [resolve, reject] = [res, rej]; + }); + return { promise, reject, resolve }; +}; + +/** + * Aggregates attributes and exectutes a debounced call + * + * @param fn Function to debounce + * @param wait Debouncing waiting time [ms] + */ +export class Debouncer { + requestSet = new Set(); // collection of requested attributes + promisedCalls: Promised[] = []; // When requesting a price we return a deferred promise + promisedCount = 0; // New request coming when setTimeout is executing will make a new promise + timeout?: ReturnType; + debounceCancel = (): void => {}; // Allow to cancel mid-flight requests + + constructor(private fn: (attrs: A[]) => Promise, private wait = 200) {} + + fetch(attr?: A): Promise { + if (attr) { + this.requestSet.add(attr); + } + + if (this.promisedCalls[this.promisedCount]) { + return this.promisedCalls[this.promisedCount].promise; + } + + this.promisedCalls[this.promisedCount] = makePromise(); + + const { promise, resolve, reject } = this.promisedCalls[this.promisedCount]; + + if (this.timeout) { + clearTimeout(this.timeout); + } + + this.timeout = setTimeout(() => { + this.promisedCount++; // after execution started any new call will get a new promise + const requestAttrs = [...this.requestSet]; + this.requestSet.clear(); // clear optimistically assuming successful results + this.fn(requestAttrs) + .then((results) => { + resolve(results); + this.debounceCancel = () => {}; + }) + .catch((reason) => { + console.error(reason); + }); + }, this.wait); + + this.debounceCancel = () => { + if (this.timeout) { + clearTimeout(this.timeout); + } + reject('Cancelled'); + delete this.promisedCalls[this.promisedCount]; + }; + + return promise; + } +} diff --git a/balancer-js/src/lib/utils/index.ts b/balancer-js/src/lib/utils/index.ts index 63a5e0eaa..f0c1b91fb 100644 --- a/balancer-js/src/lib/utils/index.ts +++ b/balancer-js/src/lib/utils/index.ts @@ -7,6 +7,7 @@ export * from './assetHelpers'; export * from './aaveHelpers'; export * from './poolHelper'; export * from './tokens'; +export * from './debouncer'; export const isSameAddress = (address1: string, address2: string): boolean => getAddress(address1) === getAddress(address2); diff --git a/balancer-js/src/lib/utils/tenderlyHelper.ts b/balancer-js/src/lib/utils/tenderlyHelper.ts new file mode 100644 index 000000000..ec850ebb8 --- /dev/null +++ b/balancer-js/src/lib/utils/tenderlyHelper.ts @@ -0,0 +1,200 @@ +import axios from 'axios'; +import { MaxInt256 } from '@ethersproject/constants'; +import { networkAddresses } from '@/lib/constants/config'; +import { BalancerTenderlyConfig } from '@/types'; + +type StateOverrides = { + [address: string]: { value: { [key: string]: string } }; +}; + +export default class TenderlyHelper { + private vaultAddress; + private tenderlyUrl; + private opts?; + private blockNumber: number | undefined; + + constructor( + private chainId: number, + tenderlyConfig?: BalancerTenderlyConfig + ) { + const { contracts } = networkAddresses(this.chainId); + this.vaultAddress = contracts.vault as string; + if (tenderlyConfig?.user && tenderlyConfig?.project) { + this.tenderlyUrl = `https://api.tenderly.co/api/v1/account/${tenderlyConfig.user}/project/${tenderlyConfig.project}/`; + } else { + this.tenderlyUrl = 'https://api.balancer.fi/tenderly/'; + } + + if (tenderlyConfig?.accessKey) { + this.opts = { + headers: { + 'X-Access-Key': tenderlyConfig.accessKey, + }, + }; + } + + this.blockNumber = tenderlyConfig?.blockNumber; + } + + simulateMulticall = async ( + to: string, + data: string, + userAddress: string, + tokens: string[] + ): Promise => { + const tokensOverrides = await this.encodeBalanceAndAllowanceOverrides( + userAddress, + tokens + ); + const relayerApprovalOverride = await this.encodeRelayerApprovalOverride( + userAddress, + to + ); + const encodedStateOverrides = { + ...tokensOverrides, + ...relayerApprovalOverride, + }; + return this.simulateTransaction( + to, + data, + userAddress, + encodedStateOverrides + ); + }; + + simulateTransaction = async ( + to: string, + data: string, + userAddress: string, + encodedStateOverrides: StateOverrides + ): Promise => { + // Map encoded-state response into simulate request body by replacing property names + const state_objects = Object.fromEntries( + Object.keys(encodedStateOverrides).map((address) => { + // Object.fromEntries require format [key, value] instead of {key: value} + return [address, { storage: encodedStateOverrides[address].value }]; + }) + ); + + const body = { + // -- Standard TX fields -- + network_id: this.chainId.toString(), + block_number: this.blockNumber, + from: userAddress, + to, + input: data, + // gas: 8000000, + // gas_price: '0', + // value: '0', + // -- Simulation config (tenderly specific) -- + save_if_fails: true, + // save: true, + simulation_type: 'quick', // remove this while developing/debugging + state_objects, + }; + + const SIMULATE_URL = this.tenderlyUrl + 'simulate'; + + const resp = await axios.post(SIMULATE_URL, body, this.opts); + + const simulatedTransactionOutput = + resp.data.transaction.transaction_info.call_trace.output; + + return simulatedTransactionOutput; + }; + + // Encode relayer approval state override + encodeRelayerApprovalOverride = async ( + userAddress: string, + relayerAddress: string + ): Promise => { + const stateOverrides: StateOverrides = { + [`${this.vaultAddress}`]: { + value: { + [`_approvedRelayers[${userAddress}][${relayerAddress}]`]: + true.toString(), + }, + }, + }; + + const encodedStateOverrides = await this.requestStateOverrides( + stateOverrides + ); + + return encodedStateOverrides; + }; + + // Encode token balances and allowances overrides to max value + encodeBalanceAndAllowanceOverrides = async ( + userAddress: string, + tokens: string[] + ): Promise => { + if (tokens.length === 0) return {}; + + // Create balances and allowances overrides for each token address provided + let stateOverrides: StateOverrides = {}; + tokens.forEach( + (token) => + (stateOverrides = { + ...stateOverrides, + [`${token}`]: { + value: { + [`_balances[${userAddress}]`]: MaxInt256.toString(), + [`_allowances[${userAddress}][${this.vaultAddress}]`]: + MaxInt256.toString(), + [`balanceOf[${userAddress}]`]: MaxInt256.toString(), + [`allowance[${userAddress}][${this.vaultAddress}]`]: + MaxInt256.toString(), + [`balances[${userAddress}]`]: MaxInt256.toString(), + [`allowed[${userAddress}][${this.vaultAddress}]`]: + MaxInt256.toString(), + }, + }, + }) + ); + + const encodedStateOverrides = await this.requestStateOverrides( + stateOverrides + ); + + if ( + Object.keys(encodedStateOverrides).some((k) => { + return Object.keys(encodedStateOverrides[k].value).length !== 2; + }) + ) + throw new Error( + "Couldn't encode state overrides - states should match the ones in the contracts" + ); + + return encodedStateOverrides; + }; + + private requestStateOverrides = async ( + stateOverrides: StateOverrides + ): Promise => { + const ENCODE_STATES_URL = this.tenderlyUrl + 'contracts/encode-states'; + const body = { + networkID: this.chainId.toString(), + stateOverrides, + }; + + const encodedStatesResponse = await axios.post( + ENCODE_STATES_URL, + body, + this.opts + ); + const encodedStateOverrides = encodedStatesResponse.data + .stateOverrides as StateOverrides; + + if ( + !encodedStateOverrides || + Object.keys(encodedStateOverrides).length !== + Object.keys(stateOverrides).length + ) + throw new Error( + "Couldn't encode state overrides - contracts should be verified and whitelisted on Tenderly" + ); + + return encodedStateOverrides; + }; +} diff --git a/balancer-js/src/lib/utils/tokens.ts b/balancer-js/src/lib/utils/tokens.ts index f4840c977..a260e0f16 100644 --- a/balancer-js/src/lib/utils/tokens.ts +++ b/balancer-js/src/lib/utils/tokens.ts @@ -1,4 +1,6 @@ -import { Token, TokenPrices } from '@/types'; +import { Token, TokenPrices, Network } from '@/types'; +import { TOKENS } from '@/lib/constants/tokens'; +import { wrappedTokensMap as aaveWrappedMap } from '@/modules/data/token-yields/tokens/aave'; export function tokensToTokenPrices(tokens: Token[]): TokenPrices { const tokenPrices: TokenPrices = {}; @@ -10,3 +12,56 @@ export function tokensToTokenPrices(tokens: Token[]): TokenPrices { return tokenPrices; } + +export function tokenAddressForPricing( + address: string, + chainId: Network +): string { + let a = address.toLowerCase(); + a = addressMapIn(a, chainId); + a = unwrapToken(a, chainId); + + return a; +} + +/** + * Maps testnet tokens, eg: on Göreli to a mainnet one. + * Used to get the pricing information on networks not supported by a price feed. + * + * @param address Address on a testnet network + */ +export const addressMapIn = (address: string, chainId: Network): string => { + const addressMap = TOKENS(chainId).PriceChainMap; + return (addressMap && addressMap[address.toLowerCase()]) || address; +}; + +/** + * Finds an underlying token address for a wrapped one + * + * @param wrappedAddress + * @param chainId + * @returns underlying token address + */ +export const unwrapToken = ( + wrappedAddress: string, + chainId: Network +): string => { + const lowercase = wrappedAddress.toLocaleLowerCase(); + + const aaveChain = chainId as keyof typeof aaveWrappedMap; + if ( + aaveWrappedMap[aaveChain] != undefined && + aaveWrappedMap[aaveChain] != null + ) { + // Double if to avoid skipping just to at after compile: Object.keys()?.includes + if (Object.keys(aaveWrappedMap[aaveChain]).includes(lowercase)) { + return aaveWrappedMap[aaveChain][ + lowercase as keyof typeof aaveWrappedMap[typeof aaveChain] + ].aToken; + } else { + return lowercase; + } + } else { + return lowercase; + } +}; diff --git a/balancer-js/src/modules/contracts/contracts.module.ts b/balancer-js/src/modules/contracts/contracts.module.ts index fca6fdeba..2240e7389 100644 --- a/balancer-js/src/modules/contracts/contracts.module.ts +++ b/balancer-js/src/modules/contracts/contracts.module.ts @@ -14,7 +14,7 @@ import { Multicall } from './implementations/multicall'; import { ERC20 } from './implementations/ERC20'; import { VeBal } from './implementations/veBAL'; import { VeBalProxy } from './implementations/veBAL-proxy'; -import { RelayerV4 } from './implementations/relayerV4'; +import { Relayer } from './implementations/relayer'; import { LiquidityGauge } from './implementations/liquidity-gauge'; type ContractFactory = ( @@ -26,7 +26,8 @@ export interface ContractInstances { vault: Vault; lidoRelayer?: LidoRelayer; multicall: Contract; - relayerV4: Contract | undefined; + relayerV3?: Contract; + relayerV4?: Contract; veBal?: VeBal; veBalProxy?: VeBalProxy; ERC20: ContractFactory; @@ -38,7 +39,8 @@ export class Contracts { vault: Vault; lidoRelayer?: LidoRelayer; multicall: Contract; - relayerV4: Contract | undefined; + relayerV3?: Contract; + relayerV4?: Contract; veBal?: VeBal; veBalProxy?: VeBalProxy; @@ -70,8 +72,10 @@ export class Contracts { // These contracts aren't included in Balancer Typechain but are still useful. // TO DO - Possibly create via Typechain but seems unnecessary? this.multicall = Multicall(this.contractAddresses.multicall, provider); + if (this.contractAddresses.relayerV3) + this.relayerV3 = Relayer(this.contractAddresses.relayerV3, provider, 3); if (this.contractAddresses.relayerV4) - this.relayerV4 = RelayerV4(this.contractAddresses.relayerV4, provider); + this.relayerV4 = Relayer(this.contractAddresses.relayerV4, provider, 4); if (this.contractAddresses.veBal) { this.veBal = new VeBal(this.contractAddresses, provider); @@ -90,6 +94,7 @@ export class Contracts { vault: this.vault, lidoRelayer: this.lidoRelayer, multicall: this.multicall, + relayerV3: this.relayerV3, relayerV4: this.relayerV4, veBal: this.veBal, veBalProxy: this.veBalProxy, @@ -101,7 +106,7 @@ export class Contracts { /** * Helper to create ERC20 contract. * @param { string } address ERC20 address. - * @param { Signer | Provider } Signer or Provider. + * @param { Signer | Provider } signerOrProvider Signer or Provider. * @returns Contract. */ getErc20(address: string, signerOrProvider: Signer | Provider): Contract { @@ -110,8 +115,8 @@ export class Contracts { /** * Helper to create LiquidityGauge contract. - * @param { string } Gauge address. - * @param { Signer | Provider} Signer or Provider. + * @param { string } address Gauge address. + * @param { Signer | Provider} signerOrProvider Signer or Provider. * @returns Contract. */ getLiquidityGauge( diff --git a/balancer-js/src/modules/contracts/implementations/relayer.ts b/balancer-js/src/modules/contracts/implementations/relayer.ts new file mode 100644 index 000000000..0954b713a --- /dev/null +++ b/balancer-js/src/modules/contracts/implementations/relayer.ts @@ -0,0 +1,19 @@ +import { Contract } from '@ethersproject/contracts'; +import { Provider } from '@ethersproject/providers'; +import RelayerV4ABI from '@/lib/abi/RelayerV4.json'; +import RelayerV3ABI from '@/lib/abi/BalancerRelayer.json'; + +export const Relayer = ( + address: string, + provider: Provider, + version: number +): Contract => { + switch (version) { + case 3: + return new Contract(address, RelayerV3ABI, provider); + case 4: + return new Contract(address, RelayerV4ABI, provider); + default: + throw new Error('relayer not supported'); + } +}; diff --git a/balancer-js/src/modules/contracts/implementations/relayerV4.ts b/balancer-js/src/modules/contracts/implementations/relayerV4.ts deleted file mode 100644 index d01d9c59f..000000000 --- a/balancer-js/src/modules/contracts/implementations/relayerV4.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Contract } from '@ethersproject/contracts'; -import { Provider } from '@ethersproject/providers'; -import abi from '../../../lib/abi/RelayerV4.json'; - -export const RelayerV4 = (address: string, provider: Provider): Contract => - new Contract(address, abi, provider); diff --git a/balancer-js/src/modules/data/index.ts b/balancer-js/src/modules/data/index.ts index 38ed2c2c6..57cc72428 100644 --- a/balancer-js/src/modules/data/index.ts +++ b/balancer-js/src/modules/data/index.ts @@ -4,6 +4,7 @@ export * from './gauge-shares'; export * from './liquidity-gauges'; export * from './pool'; export * from './pool-gauges'; +export * from './pool-joinExit'; export * from './pool-shares'; export * from './token'; export * from './token-prices'; @@ -16,6 +17,7 @@ export * from './block-number'; import { BalancerNetworkConfig, BalancerDataRepositories } from '@/types'; import { PoolsSubgraphRepository } from './pool/subgraph'; import { PoolSharesRepository } from './pool-shares/repository'; +import { PoolJoinExitRepository } from './pool-joinExit/repository'; import { PoolGaugesRepository } from './pool-gauges/repository'; import { GaugeSharesRepository } from './gauge-shares/repository'; import { BlockNumberRepository } from './block-number'; @@ -23,6 +25,8 @@ import { CoingeckoPriceRepository, AaveRates, TokenPriceProvider, + HistoricalPriceProvider, + CoingeckoHistoricalPriceRepository, } from './token-prices'; import { StaticTokenProvider } from './token/static'; import { LiquidityGaugeSubgraphRPCProvider } from './liquidity-gauges/provider'; @@ -35,6 +39,7 @@ import { Provider } from '@ethersproject/providers'; // initialCoingeckoList are used to get the initial token list for coingecko // TODO: we might want to replace that with what frontend is using import initialCoingeckoList from '@/modules/data/token-prices/initial-list.json'; +import { SubgraphPriceRepository } from './token-prices/subgraph'; export class Data implements BalancerDataRepositories { pools; @@ -43,6 +48,7 @@ export class Data implements BalancerDataRepositories { poolGauges; gaugeShares; tokenPrices; + tokenHistoricalPrices; tokenMeta; liquidityGauges; feeDistributor; @@ -50,6 +56,7 @@ export class Data implements BalancerDataRepositories { protocolFees; tokenYields; blockNumbers; + poolJoinExits; constructor(networkConfig: BalancerNetworkConfig, provider: Provider) { this.pools = new PoolsSubgraphRepository({ @@ -62,6 +69,11 @@ export class Data implements BalancerDataRepositories { networkConfig.chainId ); + this.poolJoinExits = new PoolJoinExitRepository( + networkConfig.urls.subgraph, + networkConfig.chainId + ); + if (networkConfig.urls.gaugesSubgraph) { this.poolGauges = new PoolGaugesRepository( networkConfig.urls.gaugesSubgraph, @@ -103,13 +115,29 @@ export class Data implements BalancerDataRepositories { networkConfig.chainId ); + const subgraphPriceRepository = new SubgraphPriceRepository( + networkConfig.chainId + ); + const aaveRates = new AaveRates( networkConfig.addresses.contracts.multicall, provider, networkConfig.chainId ); - this.tokenPrices = new TokenPriceProvider(coingeckoRepository, aaveRates); + this.tokenPrices = new TokenPriceProvider( + coingeckoRepository, + subgraphPriceRepository, + aaveRates + ); + + const coingeckoHistoricalRepository = + new CoingeckoHistoricalPriceRepository(networkConfig.chainId); + + this.tokenHistoricalPrices = new HistoricalPriceProvider( + coingeckoHistoricalRepository, + aaveRates + ); this.tokenMeta = new StaticTokenProvider([]); diff --git a/balancer-js/src/modules/data/liquidity-gauges/provider.ts b/balancer-js/src/modules/data/liquidity-gauges/provider.ts index f48008c58..7bdf9cfa5 100644 --- a/balancer-js/src/modules/data/liquidity-gauges/provider.ts +++ b/balancer-js/src/modules/data/liquidity-gauges/provider.ts @@ -62,14 +62,18 @@ export class LiquidityGaugeSubgraphRPCProvider const gauges: SubgraphLiquidityGauge[] = await this.subgraph.fetch(); const gaugeAddresses = gauges.map((g) => g.id); if (this.chainId == 1) { + console.time('Fetching multicall.getWorkingSupplies'); this.workingSupplies = await this.multicall.getWorkingSupplies( gaugeAddresses ); + console.timeEnd('Fetching multicall.getWorkingSupplies'); } if (this.gaugeController) { + console.time('Fetching gaugeController.getRelativeWeights'); this.relativeWeights = await this.gaugeController.getRelativeWeights( gaugeAddresses ); + console.timeEnd('Fetching gaugeController.getRelativeWeights'); } // Kept as a potential fallback for getting rewardData from RPC diff --git a/balancer-js/src/modules/data/pool-joinExit/index.ts b/balancer-js/src/modules/data/pool-joinExit/index.ts new file mode 100644 index 000000000..ac172595a --- /dev/null +++ b/balancer-js/src/modules/data/pool-joinExit/index.ts @@ -0,0 +1,2 @@ +export * from './repository'; +export * from './types'; diff --git a/balancer-js/src/modules/data/pool-joinExit/repository.ts b/balancer-js/src/modules/data/pool-joinExit/repository.ts new file mode 100644 index 000000000..c5806781a --- /dev/null +++ b/balancer-js/src/modules/data/pool-joinExit/repository.ts @@ -0,0 +1,59 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any */ +import { PoolJoinExit, PoolJoinExitAttributes } from './types'; +import { BalancerSubgraphRepository } from '@/modules/subgraph/repository'; +import { + JoinExit_OrderBy, + OrderDirection, + SubgraphJoinExitFragment, +} from '@/modules/subgraph/generated/balancer-subgraph-types'; + +export class PoolJoinExitRepository extends BalancerSubgraphRepository< + PoolJoinExit, + PoolJoinExitAttributes +> { + async query(args: any): Promise { + if (!args.orderBy) args.orderBy = JoinExit_OrderBy.Timestamp; + if (!args.orderDirection) args.orderDirection = OrderDirection.Asc; + if (!args.block && this.blockHeight) + args.block = { number: await this.blockHeight() }; + + const { joinExits } = await this.client.JoinExits(args); + return joinExits.map(this.mapType); + } + + mapType(item: SubgraphJoinExitFragment): PoolJoinExit { + return { + id: item.id, + userAddress: item.user.id, + poolId: item.pool.id, + timestamp: item.timestamp, + type: item.type, + amounts: item.amounts, + tokens: item.pool.tokensList, + }; + } + + async findByUser( + sender: string, + first?: number, + skip?: number + ): Promise { + return this.findAllBy(PoolJoinExitAttributes.Sender, sender, first, skip); + } + + async findJoins(sender: string, pool: string): Promise { + return this.query({ where: { sender, pool, type: 'Join' } }); + } + + async findExits(sender: string, pool: string): Promise { + return this.query({ where: { sender, pool, type: 'Exit' } }); + } + + async findByPool( + poolId: string, + first?: number, + skip?: number + ): Promise { + return this.findAllBy(PoolJoinExitAttributes.Pool, poolId, first, skip); + } +} diff --git a/balancer-js/src/modules/data/pool-joinExit/types.ts b/balancer-js/src/modules/data/pool-joinExit/types.ts new file mode 100644 index 000000000..4089b0f76 --- /dev/null +++ b/balancer-js/src/modules/data/pool-joinExit/types.ts @@ -0,0 +1,14 @@ +export enum PoolJoinExitAttributes { + Pool = 'pool', + Sender = 'sender', +} + +export interface PoolJoinExit { + id: string; + userAddress: string; + poolId: string; + timestamp: number; + type: string; + amounts: string[]; + tokens: string[]; +} diff --git a/balancer-js/src/modules/data/pool/balancer-api.ts b/balancer-js/src/modules/data/pool/balancer-api.ts index b546a0c6c..f9bfb44ad 100644 --- a/balancer-js/src/modules/data/pool/balancer-api.ts +++ b/balancer-js/src/modules/data/pool/balancer-api.ts @@ -54,9 +54,12 @@ export class PoolsBalancerAPIRepository }; this.query = { - args: options.query?.args || defaultArgs, - attrs: options.query?.attrs || defaultAttributes, + args: Object.assign({}, options.query?.args || defaultArgs), + attrs: Object.assign({}, options.query?.attrs || defaultAttributes), }; + + // skip is not a valid argument for the Balancer API, it uses nextToken + delete this.query.args.skip; } fetchFromCache(options?: PoolsRepositoryFetchOptions): Pool[] { diff --git a/balancer-js/src/modules/data/pool/subgraph.ts b/balancer-js/src/modules/data/pool/subgraph.ts index 152d957c5..d54613f00 100644 --- a/balancer-js/src/modules/data/pool/subgraph.ts +++ b/balancer-js/src/modules/data/pool/subgraph.ts @@ -6,6 +6,8 @@ import { Pool_OrderBy, OrderDirection, SubgraphPoolTokenFragment, + SubgraphSubPoolFragment, + SubgraphSubPoolTokenFragment, } from '@/modules/subgraph/subgraph'; import { GraphQLArgsBuilder, @@ -13,7 +15,14 @@ import { } from '@/lib/graphql/args-builder'; import { GraphQLArgs } from '@/lib/graphql/types'; import { PoolAttribute, PoolsRepositoryFetchOptions } from './types'; -import { GraphQLQuery, Pool, PoolType, PoolToken } from '@/types'; +import { + GraphQLQuery, + Pool, + PoolType, + PoolToken, + SubPool, + SubPoolMeta, +} from '@/types'; import { Network } from '@/lib/constants/network'; import { PoolsQueryVariables } from '../../subgraph/subgraph'; @@ -24,6 +33,19 @@ interface PoolsSubgraphRepositoryOptions { query?: GraphQLQuery; } +interface SubgraphSubPoolToken extends SubgraphSubPoolTokenFragment { + token?: SubgraphSubPoolMeta | null; +} + +interface SubgraphSubPoolMeta { + latestUSDPrice?: string | null; + pool?: SubgraphSubPool | null; +} + +interface SubgraphSubPool extends SubgraphSubPoolFragment { + tokens: SubgraphSubPoolToken[]; +} + /** * Access pools using generated subgraph client. * @@ -64,8 +86,8 @@ export class PoolsSubgraphRepository }, }; - const args = options.query?.args || defaultArgs; - const attrs = options.query?.attrs || {}; + const args = Object.assign({}, options.query?.args || defaultArgs); + const attrs = Object.assign({}, options.query?.attrs || {}); this.query = { args, @@ -118,19 +140,30 @@ export class PoolsSubgraphRepository } async findBy(param: PoolAttribute, value: string): Promise { - if (this.pools) { - return (await this.pools).find((p) => p[param] === value); + if (!this.pools) { + this.pools = this.fetchDefault(); } - const { pools } = await this.client.Pools({ - where: { - [param]: value, - swapEnabled: true, - totalShares_gt: '0.000000000001', - }, - block: await this.block(), - }); - const poolsTab: Pool[] = pools.map(this.mapType.bind(this)); - return poolsTab.length > 0 ? poolsTab[0] : undefined; + + return (await this.pools).find((pool) => pool[param] == value); + + // TODO: @Nma - Fetching pools outside of default query is causing a lot of requests + // on a frontend, because results aren't cached anywhere. + // For fetching pools directly from subgraph with custom queries please use the client not this repository. + // Code below kept for reference, to be removed later. + // + // if (this.pools) { + // return (await this.pools).find((p) => p[param] === value); + // } + // const { pools } = await this.client.Pools({ + // where: { + // [param]: value, + // swapEnabled: true, + // totalShares_gt: '0.000000000001', + // }, + // block: await this.block(), + // }); + // const poolsTab: Pool[] = pools.map(this.mapType.bind(this)); + // return poolsTab.length > 0 ? poolsTab[0] : undefined; } async all(): Promise { @@ -167,13 +200,14 @@ export class PoolsSubgraphRepository owner: subgraphPool.owner ?? undefined, factory: subgraphPool.factory ?? undefined, symbol: subgraphPool.symbol ?? undefined, - tokens: (subgraphPool.tokens || []).map(this.mapToken), + tokens: (subgraphPool.tokens || []).map(this.mapToken.bind(this)), tokensList: subgraphPool.tokensList, tokenAddresses: (subgraphPool.tokens || []).map((t) => t.address), totalLiquidity: subgraphPool.totalLiquidity, totalShares: subgraphPool.totalShares, totalSwapFee: subgraphPool.totalSwapFee, totalSwapVolume: subgraphPool.totalSwapVolume, + priceRateProviders: subgraphPool.priceRateProviders ?? undefined, // onchain: subgraphPool.onchain, createTime: subgraphPool.createTime, mainIndex: subgraphPool.mainIndex ?? undefined, @@ -186,24 +220,59 @@ export class PoolsSubgraphRepository // feesSnapshot: subgraphPool.???, // Approximated last 24h fees // boost: subgraphPool.boost, totalWeight: subgraphPool.totalWeight || '1', + lowerTarget: subgraphPool.lowerTarget ?? '0', + upperTarget: subgraphPool.upperTarget ?? '0', }; } private mapToken(subgraphToken: SubgraphPoolTokenFragment): PoolToken { - let subgraphTokenPool = null; - if (subgraphToken.token?.pool) { - subgraphTokenPool = { - ...subgraphToken.token.pool, - poolType: subgraphToken.token.pool.poolType as PoolType, - }; - } + const subPoolInfo = this.mapSubPools( + // need to typecast as the fragment is 3 layers deep while the type is infinite levels deep + subgraphToken.token as SubgraphSubPoolMeta + ); return { ...subgraphToken, isExemptFromYieldProtocolFee: subgraphToken.isExemptFromYieldProtocolFee || false, - token: { - pool: subgraphTokenPool, - }, + token: subPoolInfo, + }; + } + + private mapSubPools(metadata: SubgraphSubPoolMeta): SubPoolMeta { + let subPool: SubPool | null = null; + if (metadata.pool) { + subPool = { + id: metadata.pool.id, + address: metadata.pool.address, + totalShares: metadata.pool.totalShares, + poolType: metadata.pool.poolType as PoolType, + mainIndex: metadata.pool.mainIndex || 0, + }; + + if (metadata?.pool.tokens) { + subPool.tokens = metadata.pool.tokens.map( + this.mapSubPoolToken.bind(this) + ); + } + } + + return { + pool: subPool, + latestUSDPrice: metadata.latestUSDPrice || undefined, + }; + } + + private mapSubPoolToken(token: SubgraphSubPoolToken) { + return { + address: token.address, + decimals: token.decimals, + symbol: token.symbol, + balance: token.balance, + priceRate: token.priceRate, + weight: token.weight, + isExemptFromYieldProtocolFee: + token.isExemptFromYieldProtocolFee || undefined, + token: token.token ? this.mapSubPools(token.token) : undefined, }; } } diff --git a/balancer-js/src/modules/data/token-prices/aave-rates.ts b/balancer-js/src/modules/data/token-prices/aave-rates.ts index e43d28428..d62eb1d9b 100644 --- a/balancer-js/src/modules/data/token-prices/aave-rates.ts +++ b/balancer-js/src/modules/data/token-prices/aave-rates.ts @@ -10,7 +10,11 @@ const wrappedATokenInterface = new Interface([ 'function rate() view returns (uint256)', ]); -export class AaveRates { +export interface IAaveRates { + getRate: (address: string) => Promise; +} + +export class AaveRates implements IAaveRates { multicall: Contract; rates?: Promise<{ [wrappedATokenAddress: string]: number }>; @@ -46,6 +50,9 @@ export class AaveRates { if (this.network != Network.MAINNET && this.network != Network.POLYGON) { return 1; } + if (!Object.values(yieldTokens[this.network]).includes(wrappedAToken)) { + return 1; + } if (!this.rates) { this.rates = this.fetch(this.network); } diff --git a/balancer-js/src/modules/data/token-prices/coingecko-historical.ts b/balancer-js/src/modules/data/token-prices/coingecko-historical.ts new file mode 100644 index 000000000..776b39b8c --- /dev/null +++ b/balancer-js/src/modules/data/token-prices/coingecko-historical.ts @@ -0,0 +1,87 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +import { + Price, + Findable, + TokenPrices, + Network, + HistoricalPrices, +} from '@/types'; +import axios from 'axios'; +import { tokenAddressForPricing } from '@/lib/utils'; + +const HOUR = 60 * 60; + +/** + * Simple coingecko price source implementation. Configurable by network and token addresses. + */ +export class CoingeckoHistoricalPriceRepository implements Findable { + prices: TokenPrices = {}; + nativePrice?: Promise; + urlBase: string; + + constructor(private chainId: Network = 1) { + this.urlBase = `https://api.coingecko.com/api/v3/coins/${this.platform( + chainId + )}/contract/%TOKEN_ADDRESS%/market_chart/range?vs_currency=usd`; + } + + private fetch( + address: string, + timestamp: number, + { signal }: { signal?: AbortSignal } = {} + ): Promise { + console.time(`fetching coingecko historical for ${address}`); + const url = this.urlRange(address, timestamp); + return axios + .get(url, { signal }) + .then(({ data }) => { + return data; + }) + .finally(() => { + console.timeEnd(`fetching coingecko historical for ${address}`); + }); + } + + /* eslint-disable @typescript-eslint/no-unused-vars */ + async find(address: string): Promise { + throw `Historic price requires point-in-time timestamp, please use findBy(address, timestamp)`; + } + + async findBy( + inputAddress: string, + timestamp: number + ): Promise { + const address = tokenAddressForPricing(inputAddress, this.chainId); + const response = await this.fetch(address, timestamp); + + return { + usd: `${response.prices[0][1]}`, + }; + } + + private platform(chainId: number): string { + switch (chainId) { + case 1: + case 5: + case 42: + case 31337: + return 'ethereum'; + case 137: + return 'polygon-pos'; + case 42161: + return 'arbitrum-one'; + } + + return '2'; + } + + private urlRange(address: string, timestamp: number): string { + const range: { from: number; to: number } = { + from: timestamp - HOUR, + to: timestamp + HOUR, + }; + return `${this.urlBase.replace('%TOKEN_ADDRESS%', address)}&from=${ + range.from + }&to=${range.to}`; + } +} diff --git a/balancer-js/src/modules/data/token-prices/coingecko.ts b/balancer-js/src/modules/data/token-prices/coingecko.ts index 25652a9f9..200398e95 100644 --- a/balancer-js/src/modules/data/token-prices/coingecko.ts +++ b/balancer-js/src/modules/data/token-prices/coingecko.ts @@ -1,52 +1,28 @@ /* eslint-disable @typescript-eslint/no-empty-function */ import { Price, Findable, TokenPrices, Network } from '@/types'; -import { wrappedTokensMap as aaveWrappedMap } from '../token-yields/tokens/aave'; import axios from 'axios'; import { TOKENS } from '@/lib/constants/tokens'; -import { isEthereumTestnet } from '@/lib/utils/network'; - -// Conscious choice for a deferred promise since we have setTimeout that returns a promise -// Some reference for history buffs: https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns -interface PromisedTokenPrices { - promise: Promise; - resolve: (value: TokenPrices) => void; - reject: (reason: unknown) => void; -} - -const makePromise = (): PromisedTokenPrices => { - let resolve: (value: TokenPrices) => void = () => {}; - let reject: (reason: unknown) => void = () => {}; - const promise = new Promise((res, rej) => { - [resolve, reject] = [res, rej]; - }); - return { promise, reject, resolve }; -}; +import { Debouncer, tokenAddressForPricing } from '@/lib/utils'; /** * Simple coingecko price source implementation. Configurable by network and token addresses. */ export class CoingeckoPriceRepository implements Findable { - prices: TokenPrices = {}; + prices: { [key: string]: Promise } = {}; + nativePrice?: Promise; urlBase: string; baseTokenAddresses: string[]; - - // Properties used for deferring API calls - // TODO: move this logic to hooks - requestedAddresses = new Set(); // Accumulates requested addresses - debounceWait = 200; // Debouncing waiting time [ms] - promisedCalls: PromisedTokenPrices[] = []; // When requesting a price we return a deferred promise - promisedCount = 0; // New request coming when setTimeout is executing will make a new promise - timeout?: ReturnType; - debounceCancel = (): void => {}; // Allow to cancel mid-flight requests + debouncer: Debouncer; constructor(tokenAddresses: string[], private chainId: Network = 1) { - this.baseTokenAddresses = tokenAddresses - .map((a) => a.toLowerCase()) - .map((a) => this.addressMapIn(a)) - .map((a) => this.unwrapToken(a)); + this.baseTokenAddresses = tokenAddresses.map(tokenAddressForPricing); this.urlBase = `https://api.coingecko.com/api/v3/simple/token_price/${this.platform( chainId )}?vs_currencies=usd,eth`; + this.debouncer = new Debouncer( + this.fetch.bind(this), + 200 + ); } private fetch( @@ -64,70 +40,57 @@ export class CoingeckoPriceRepository implements Findable { }); } - private debouncedFetch(): Promise { - if (!this.promisedCalls[this.promisedCount]) { - this.promisedCalls[this.promisedCount] = makePromise(); - } - - const { promise, resolve, reject } = this.promisedCalls[this.promisedCount]; - - if (this.timeout) { - clearTimeout(this.timeout); + private fetchNative({ + signal, + }: { signal?: AbortSignal } = {}): Promise { + console.time(`fetching coingecko for native token`); + enum Assets { + ETH = 'matic-network', + MATIC = 'ethereum', } - - this.timeout = setTimeout(() => { - this.promisedCount++; // any new call will get a new promise - this.fetch([...this.requestedAddresses]) - .then((results) => { - resolve(results); - this.debounceCancel = () => {}; - }) - .catch((reason) => { - console.error(reason); - }); - }, this.debounceWait); - - this.debounceCancel = () => { - if (this.timeout) { - clearTimeout(this.timeout); - } - reject('Cancelled'); - delete this.promisedCalls[this.promisedCount]; - }; - - return promise; + const assetId = this.chainId === 137 ? 'matic-network' : 'ethereum'; + return axios + .get<{ [key in Assets]: Price }>( + `https://api.coingecko.com/api/v3/simple/price/?vs_currencies=eth,usd&ids=${assetId}`, + { signal } + ) + .then(({ data }) => { + return data[assetId]; + }) + .finally(() => { + console.timeEnd(`fetching coingecko for native token`); + }); } - async find(address: string): Promise { - const lowercaseAddress = address.toLowerCase(); - const mapInAddress = this.addressMapIn(lowercaseAddress); - const unwrapped = this.unwrapToken(mapInAddress); - if (!this.prices[unwrapped]) { - try { - let init = false; - if (Object.keys(this.prices).length === 0) { - // Make initial call with all the tokens we want to preload - this.baseTokenAddresses.forEach( - this.requestedAddresses.add.bind(this.requestedAddresses) - ); - init = true; + find(inputAddress: string): Promise { + const address = tokenAddressForPricing(inputAddress, this.chainId); + if (!this.prices[address]) { + // Make initial call with all the tokens we want to preload + if (Object.keys(this.prices).length === 0) { + for (const baseAddress of this.baseTokenAddresses) { + this.prices[baseAddress] = this.debouncer + .fetch(baseAddress) + .then((prices) => prices[baseAddress]); } - this.requestedAddresses.add(unwrapped); - const promised = await this.debouncedFetch(); - this.prices[unwrapped] = promised[unwrapped]; - this.requestedAddresses.delete(unwrapped); - if (init) { - this.baseTokenAddresses.forEach((a) => { - this.prices[a] = promised[a]; - this.requestedAddresses.delete(a); - }); + } + + // Handle native asset special case + if ( + address === TOKENS(this.chainId).Addresses.nativeAsset.toLowerCase() + ) { + if (!this.nativePrice) { + this.prices[address] = this.fetchNative(); } - } catch (error) { - console.error(error); + + return this.prices[address]; } + + this.prices[address] = this.debouncer + .fetch(address) + .then((prices) => prices[address]); } - return this.prices[unwrapped]; + return this.prices[address]; } async findBy(attribute: string, value: string): Promise { @@ -154,35 +117,7 @@ export class CoingeckoPriceRepository implements Findable { return '2'; } - private addressMapIn(address: string): string { - const addressMap = TOKENS(this.chainId).PriceChainMap; - return (addressMap && addressMap[address.toLowerCase()]) || address; - } - - private unwrapToken(wrappedAddress: string) { - const chainId = isEthereumTestnet(this.chainId) - ? Network.MAINNET - : this.chainId; - return unwrapToken(wrappedAddress, chainId); - } - private url(addresses: string[]): string { return `${this.urlBase}&contract_addresses=${addresses.join(',')}`; } } - -const unwrapToken = (wrappedAddress: string, chainId: Network) => { - const lowercase = wrappedAddress.toLocaleLowerCase(); - - const aaveChain = chainId as keyof typeof aaveWrappedMap; - if ( - aaveWrappedMap[aaveChain] && - Object.keys(aaveWrappedMap[aaveChain])?.includes(lowercase) - ) { - return aaveWrappedMap[aaveChain][ - lowercase as keyof typeof aaveWrappedMap[typeof aaveChain] - ].aToken; - } else { - return lowercase; - } -}; diff --git a/balancer-js/src/modules/data/token-prices/historical-price-provider.ts b/balancer-js/src/modules/data/token-prices/historical-price-provider.ts new file mode 100644 index 000000000..ab37ac201 --- /dev/null +++ b/balancer-js/src/modules/data/token-prices/historical-price-provider.ts @@ -0,0 +1,38 @@ +import type { Findable, Price } from '@/types'; +import { IAaveRates } from './aave-rates'; + +export class HistoricalPriceProvider implements Findable { + constructor( + private coingeckoRepository: Findable, + private aaveRates: IAaveRates + ) {} + + /** + * get the historical price at time of call + * + * @param address the token address + */ + async find(address: string): Promise { + return this.findBy(address, Math.floor(Date.now() / 1000)); + } + + /** + * get the historical price at the given timestamp. + * + * @param address the token address + * @param timestamp the UNIX timestamp + * @private + */ + async findBy(address: string, timestamp: number): Promise { + const price = await this.coingeckoRepository.findBy(address, timestamp); + const rate = (await this.aaveRates.getRate(address)) || 1; + if (price && price.usd) { + return { + ...price, + usd: (parseFloat(price.usd) * rate).toString(), + }; + } else { + return price; + } + } +} diff --git a/balancer-js/src/modules/data/token-prices/index.ts b/balancer-js/src/modules/data/token-prices/index.ts index 61defd9af..2ef329639 100644 --- a/balancer-js/src/modules/data/token-prices/index.ts +++ b/balancer-js/src/modules/data/token-prices/index.ts @@ -1,4 +1,7 @@ export * from './static'; export * from './coingecko'; +export * from './coingecko-historical'; +export * from './subgraph'; export * from './provider'; +export * from './historical-price-provider'; export * from './aave-rates'; diff --git a/balancer-js/src/modules/data/token-prices/provider.ts b/balancer-js/src/modules/data/token-prices/provider.ts index 79138f138..6cf66feb3 100644 --- a/balancer-js/src/modules/data/token-prices/provider.ts +++ b/balancer-js/src/modules/data/token-prices/provider.ts @@ -1,15 +1,23 @@ import type { Findable, Price } from '@/types'; -import { AaveRates } from './aave-rates'; -import { CoingeckoPriceRepository } from './coingecko'; +import { IAaveRates } from './aave-rates'; export class TokenPriceProvider implements Findable { constructor( - private coingeckoRepository: CoingeckoPriceRepository, - private aaveRates: AaveRates + private coingeckoRepository: Findable, + private subgraphRepository: Findable, + private aaveRates: IAaveRates ) {} async find(address: string): Promise { - const price = await this.coingeckoRepository.find(address); + let price; + try { + price = await this.coingeckoRepository.find(address); + if (!price?.usd) { + price = await this.subgraphRepository.find(address); + } + } catch (err) { + console.error(err); + } const rate = (await this.aaveRates.getRate(address)) || 1; if (price && price.usd) { return { @@ -24,8 +32,7 @@ export class TokenPriceProvider implements Findable { async findBy(attribute: string, value: string): Promise { if (attribute === 'address') { return this.find(value); - } else { - throw `Token price search by ${attribute} not implemented`; } + throw `Token price search by ${attribute} not implemented`; } } diff --git a/balancer-js/src/modules/data/token-prices/subgraph.spec.ts b/balancer-js/src/modules/data/token-prices/subgraph.spec.ts new file mode 100644 index 000000000..b80053bb3 --- /dev/null +++ b/balancer-js/src/modules/data/token-prices/subgraph.spec.ts @@ -0,0 +1,69 @@ +import { expect } from 'chai'; +import { SubgraphPriceRepository } from './subgraph'; +import axios from 'axios'; +import MockAdapter from 'axios-mock-adapter'; +import { BALANCER_NETWORK_CONFIG } from '@/lib/constants/config'; + +const url = BALANCER_NETWORK_CONFIG[1].urls.subgraph; + +const mockedResponse = { + data: { + tokens: [ + { + address: '0x028171bca77440897b824ca71d1c56cac55b68a3', + latestUSDPrice: 1, + }, + { + address: '0x3ed3b47dd13ec9a98b44e6204a523e766b225811', + latestUSDPrice: 1, + }, + { + address: '0xdac17f958d2ee523a2206206994597c13d831ec7', + latestUSDPrice: 1, + }, + { + address: '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56', + latestUSDPrice: 1, + }, + ], + }, +}; + +const addresses = mockedResponse.data.tokens.map((t) => t.address); + +const repository = new SubgraphPriceRepository(1); + +describe('subgraph price repository', () => { + let mock: MockAdapter; + + before(() => { + mock = new MockAdapter(axios); + mock.onPost(url).reply( + () => + new Promise((resolve) => { + setTimeout(() => resolve([200, mockedResponse]), 10); + }) + ); + }); + + after(() => { + mock.restore(); + }); + + it('finds prices', async () => { + const [price1, price2, price3, price4, price5, price6] = await Promise.all([ + repository.find(addresses[0]), + repository.find(addresses[0].toUpperCase()), + repository.find(addresses[1]), + repository.find(addresses[2]), + repository.find(addresses[3]), + repository.find(addresses[3]), + ]); + expect(price1?.usd).to.eq(1); + expect(price2?.usd).to.eq(1); + expect(price3?.usd).to.eq(1); + expect(price4?.usd).to.eq(1); + expect(price5?.usd).to.eq(1); + expect(price6?.usd).to.eq(1); + }); +}); diff --git a/balancer-js/src/modules/data/token-prices/subgraph.ts b/balancer-js/src/modules/data/token-prices/subgraph.ts new file mode 100644 index 000000000..af46361ba --- /dev/null +++ b/balancer-js/src/modules/data/token-prices/subgraph.ts @@ -0,0 +1,88 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +import { Price, Findable, TokenPrices, Network } from '@/types'; +import axios from 'axios'; +import { BALANCER_NETWORK_CONFIG } from '@/lib/constants/config'; +import { Debouncer, tokenAddressForPricing } from '@/lib/utils'; + +interface SubgraphPricesResponse { + data: { + tokens: [ + { + address: string; + latestUSDPrice?: string; + } + ]; + }; +} + +export class SubgraphPriceRepository implements Findable { + private subgraphUrl: string; + prices: { [key: string]: Promise } = {}; + debouncer: Debouncer; + + constructor(private chainId: Network = 1) { + this.subgraphUrl = BALANCER_NETWORK_CONFIG[chainId].urls.subgraph; + this.debouncer = new Debouncer( + this.fetch.bind(this), + 200 + ); + } + + private async fetch( + addresses: string[], + { signal }: { signal?: AbortSignal } = {} + ): Promise { + console.time(`fetching subgraph prices for ${addresses.length} tokens`); + return axios + .post( + this.subgraphUrl, + { + variables: { addresses }, + query: `query($addresses: [String!]) { + tokens( + where: { + id_in: $addresses + } + ) { + address + latestUSDPrice + } + }`, + }, + { signal } + ) + .then((response) => response.data.data) + .then(({ tokens }) => + Object.fromEntries( + tokens.map((token) => [ + token.address, + { usd: token.latestUSDPrice || undefined }, + ]) + ) + ) + .finally(() => { + console.timeEnd( + `fetching subgraph prices for ${addresses.length} tokens` + ); + }); + } + + async find(inputAddress: string): Promise { + const address = tokenAddressForPricing(inputAddress, this.chainId); + if (!this.prices[address]) { + this.prices[address] = this.debouncer + .fetch(address) + .then((prices) => prices[address]); + } + + return this.prices[address]; + } + + async findBy(attribute: string, value: string): Promise { + if (attribute != 'address') { + return undefined; + } + + return this.find(value); + } +} diff --git a/balancer-js/src/modules/data/token-yields/tokens/lido-polygon.ts b/balancer-js/src/modules/data/token-yields/tokens/lido-polygon.ts index 22036bc84..2b2cfa509 100644 --- a/balancer-js/src/modules/data/token-yields/tokens/lido-polygon.ts +++ b/balancer-js/src/modules/data/token-yields/tokens/lido-polygon.ts @@ -19,7 +19,9 @@ export const lidoPolygon: AprFetcher = async () => { let returnApr = 0; try { - const response = await axios.get('https://polygon.lido.fi/api/stats'); + const response = await axios.get( + 'https://lido-aprs-proxy.balancer.workers.dev/?network=137' + ); const { apr } = response.data as LidoAPIResponse; returnApr = Math.round(parseFloat(apr) * 100); diff --git a/balancer-js/src/modules/data/token-yields/tokens/lido.spec.ts b/balancer-js/src/modules/data/token-yields/tokens/lido.spec.ts index b1e4ad208..74543ace4 100644 --- a/balancer-js/src/modules/data/token-yields/tokens/lido.spec.ts +++ b/balancer-js/src/modules/data/token-yields/tokens/lido.spec.ts @@ -4,7 +4,7 @@ import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; const mockedResponse = { - data: { eth: '1', steth: '1' }, + data: { smaApr: '1' }, }; describe('lido apr', () => { @@ -13,7 +13,7 @@ describe('lido apr', () => { before(() => { mock = new MockAdapter(axios); mock - .onGet('https://stake.lido.fi/api/apr') + .onGet('https://lido-aprs-proxy.balancer.workers.dev/?network=1') .reply(() => [200, mockedResponse]); }); diff --git a/balancer-js/src/modules/data/token-yields/tokens/lido.ts b/balancer-js/src/modules/data/token-yields/tokens/lido.ts index 5ec9b483f..1e3b2ee49 100644 --- a/balancer-js/src/modules/data/token-yields/tokens/lido.ts +++ b/balancer-js/src/modules/data/token-yields/tokens/lido.ts @@ -2,14 +2,14 @@ import { AprFetcher } from '../repository'; import axios from 'axios'; export const yieldTokens = { - stETH: '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0', + stETH: '0xae7ab96520de3a18e5e111b5eaab095312d7fe84', + wstETH: '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0', arbitrumStEth: '0x5979d7b546e38e414f7e9822514be443a4800529', }; interface LidoAPIResponse { data: { - eth: string; - steth: string; + smaApr: string; }; } @@ -22,16 +22,19 @@ export const lido: AprFetcher = async () => { let apr = 0; try { - const response = await axios.get('https://stake.lido.fi/api/apr'); + const response = await axios.get( + 'https://lido-aprs-proxy.balancer.workers.dev/?network=1' + ); const { data: aprs } = response.data as LidoAPIResponse; - apr = Math.round(parseFloat(aprs.steth) * 100); + apr = Math.round(parseFloat(aprs.smaApr) * 100); } catch (error) { console.error('Failed to fetch stETH APR:', error); } return { [yieldTokens.stETH]: apr, + [yieldTokens.wstETH]: apr, [yieldTokens.arbitrumStEth]: apr, }; }; diff --git a/balancer-js/src/modules/data/types.ts b/balancer-js/src/modules/data/types.ts index 2d46fda30..939d5a9f2 100644 --- a/balancer-js/src/modules/data/types.ts +++ b/balancer-js/src/modules/data/types.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + export { LiquidityGauge } from './liquidity-gauges/provider'; export { PoolAttribute } from './pool/types'; export { TokenAttribute } from './token/types'; @@ -6,9 +8,9 @@ export * from './pool-gauges/types'; export * from './pool-shares/types'; export * from './gauge-shares/types'; -export interface Findable { +export interface Findable { find: (id: string) => Promise; - findBy: (attribute: P, value: string) => Promise; + findBy: (attribute: P, value: V) => Promise; } export interface Searchable { diff --git a/balancer-js/src/modules/exits/exits.module.integration.spec.ts b/balancer-js/src/modules/exits/exits.module.integration.spec.ts new file mode 100644 index 000000000..9cdb66a29 --- /dev/null +++ b/balancer-js/src/modules/exits/exits.module.integration.spec.ts @@ -0,0 +1,546 @@ +// yarn test:only ./src/modules/exits/exits.module.integration.spec.ts +import dotenv from 'dotenv'; +import { expect } from 'chai'; +import hardhat from 'hardhat'; + +import { BalancerSDK, BalancerTenderlyConfig, Network } from '@/.'; +import { BigNumber, parseFixed } from '@ethersproject/bignumber'; +import { Contracts } from '@/modules/contracts/contracts.module'; +import { forkSetup, getBalances } from '@/test/lib/utils'; +import { ADDRESSES } from '@/test/lib/constants'; +import { Relayer } from '@/modules/relayer/relayer.module'; +import { JsonRpcSigner } from '@ethersproject/providers'; + +dotenv.config(); + +const TEST_BOOSTED = true; +const TEST_BOOSTED_META = true; +const TEST_BOOSTED_META_ALT = true; +const TEST_BOOSTED_META_BIG = true; +const TEST_BOOSTED_WEIGHTED_SIMPLE = true; +const TEST_BOOSTED_WEIGHTED_GENERAL = true; +const TEST_BOOSTED_WEIGHTED_META = true; +const TEST_BOOSTED_WEIGHTED_META_ALT = true; +const TEST_BOOSTED_WEIGHTED_META_GENERAL = true; + +/* + * Testing on GOERLI + * - Run node on terminal: yarn run node:goerli + * - Uncomment section below: + */ +const network = Network.GOERLI; +const blockNumber = 7890980; +const customSubgraphUrl = + 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-goerli-v2-beta'; +const { ALCHEMY_URL_GOERLI: jsonRpcUrl } = process.env; +const rpcUrl = 'http://127.0.0.1:8000'; + +/* + * Testing on MAINNET + * - Run node on terminal: yarn run node + * - Uncomment section below: + */ +// const network = Network.MAINNET; +// const blockNumber = 15519886; +// const customSubgraphUrl = +// 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-v2-beta'; +// const { ALCHEMY_URL: jsonRpcUrl } = process.env; +// const rpcUrl = 'http://127.0.0.1:8545'; + +const { TENDERLY_ACCESS_KEY, TENDERLY_USER, TENDERLY_PROJECT } = process.env; +const { ethers } = hardhat; +const MAX_GAS_LIMIT = 8e6; + +// Custom Tenderly configuration parameters - remove in order to use default values +const tenderlyConfig: BalancerTenderlyConfig = { + accessKey: TENDERLY_ACCESS_KEY as string, + user: TENDERLY_USER as string, + project: TENDERLY_PROJECT as string, + blockNumber, +}; + +const sdk = new BalancerSDK({ + network, + rpcUrl, + customSubgraphUrl, + tenderly: tenderlyConfig, +}); +const { pools } = sdk; +const provider = new ethers.providers.JsonRpcProvider(rpcUrl, network); +const signer = provider.getSigner(); +const { contracts, contractAddresses } = new Contracts( + network as number, + provider +); +const relayer = contractAddresses.relayerV4 as string; +const addresses = ADDRESSES[network]; + +interface Test { + signer: JsonRpcSigner; + description: string; + pool: { + id: string; + address: string; + }; + amount: string; + authorisation: string | undefined; +} + +const runTests = async (tests: Test[]) => { + for (let i = 0; i < tests.length; i++) { + const test = tests[i]; + it(test.description, async () => { + const signerAddress = await test.signer.getAddress(); + // const signerAddress = '0xb7d222a710169f42ddff2a9a5122bd7c724dc203'; + const authorisation = await Relayer.signRelayerApproval( + relayer, + signerAddress, + test.signer, + contracts.vault + ); + // const authorisation = undefined; + await testFlow( + test.signer, + signerAddress, + test.pool, + test.amount, + authorisation + ); + }).timeout(120000); + } +}; + +const testFlow = async ( + signer: JsonRpcSigner, + signerAddress: string, + pool: { id: string; address: string }, + amount: string, + authorisation: string | undefined +) => { + const gasLimit = MAX_GAS_LIMIT; + const slippage = '10'; // 10 bps = 0.1% + + const { to, callData, tokensOut, expectedAmountsOut, minAmountsOut } = + await pools.generalisedExit( + pool.id, + amount, + signerAddress, + slippage, + authorisation + ); + + const [bptBalanceBefore, ...tokensOutBalanceBefore] = await getBalances( + [pool.address, ...tokensOut], + signer, + signerAddress + ); + + const response = await signer.sendTransaction({ + to, + data: callData, + gasLimit, + }); + + const receipt = await response.wait(); + console.log('Gas used', receipt.gasUsed.toString()); + + const [bptBalanceAfter, ...tokensOutBalanceAfter] = await getBalances( + [pool.address, ...tokensOut], + signer, + signerAddress + ); + expect(receipt.status).to.eql(1); + minAmountsOut.forEach((minAmountOut) => { + expect(BigNumber.from(minAmountOut).gte('0')).to.be.true; + }); + expectedAmountsOut.forEach((expectedAmountOut, i) => { + expect( + BigNumber.from(expectedAmountOut).gte(BigNumber.from(minAmountsOut[i])) + ).to.be.true; + }); + expect(bptBalanceAfter.eq(bptBalanceBefore.sub(amount))).to.be.true; + tokensOutBalanceBefore.forEach((b) => expect(b.eq(0)).to.be.true); + tokensOutBalanceAfter.forEach((balanceAfter, i) => { + const minOut = BigNumber.from(minAmountsOut[i]); + return expect(balanceAfter.gte(minOut)).to.be.true; + }); + // console.log('bpt after', query.tokensOut.toString()); + // console.log('minOut', minAmountsOut.toString()); + // console.log('expectedOut', expectedAmountsOut.toString()); +}; + +// all contexts currently applies to GOERLI only +describe('generalised exit execution', async () => { + /* + bbamaiweth: ComposableStable, baMai/baWeth + baMai: Linear, aMai/Mai + baWeth: Linear, aWeth/Weth + */ + context('boosted', async () => { + if (!TEST_BOOSTED) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.bbamaiweth.address]; + const slots = [addresses.bbamaiweth.slot]; + const balances = [ + parseFixed('0.02', addresses.bbamaiweth.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.bbamaiweth.id, + address: addresses.bbamaiweth.address, + }, + amount: parseFixed('0.01', addresses.bbamaiweth.decimals).toString(), + authorisation: authorisation, + }, + ]); + }); + + /* + boostedMeta1: ComposableStable, baMai/bbausd2 + baMai: Linear, aMai/Mai + bbausd2 (boosted): ComposableStable, baUsdt/baDai/baUsdc + */ + context('boostedMeta', async () => { + if (!TEST_BOOSTED_META) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.boostedMeta1.address]; + const slots = [addresses.boostedMeta1.slot]; + const balances = [ + parseFixed('1', addresses.boostedMeta1.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.boostedMeta1.id, + address: addresses.boostedMeta1.address, + }, + amount: parseFixed('0.05', addresses.boostedMeta1.decimals).toString(), + authorisation: authorisation, + }, + ]); + }); + + /* + boostedMetaAlt1: ComposableStable, Mai/bbausd2 + Mai + bbausd2 (boosted): ComposableStable, baUsdt/baDai/baUsdc + */ + context('boostedMetaAlt', async () => { + if (!TEST_BOOSTED_META_ALT) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.boostedMetaAlt1.address]; + const slots = [addresses.boostedMetaAlt1.slot]; + const balances = [ + parseFixed('1', addresses.boostedMetaAlt1.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.boostedMetaAlt1.id, + address: addresses.boostedMetaAlt1.address, + }, + amount: parseFixed( + '0.05', + addresses.boostedMetaAlt1.decimals + ).toString(), + authorisation: authorisation, + }, + ]); + }); + + /* + boostedMetaBig1: ComposableStable, bbamaiweth/bbausd2 + bbamaiweth: ComposableStable, baMai/baWeth + baMai: Linear, aMai/Mai + baWeth: Linear, aWeth/Weth + bbausd2 (boosted): ComposableStable, baUsdt/baDai/baUsdc + */ + context('boostedMetaBig', async () => { + if (!TEST_BOOSTED_META_BIG) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.boostedMetaBig1.address]; + const slots = [addresses.boostedMetaBig1.slot]; + const balances = [ + parseFixed('1', addresses.boostedMetaBig1.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.boostedMetaBig1.id, + address: addresses.boostedMetaBig1.address, + }, + amount: parseFixed( + '0.05', + addresses.boostedMetaBig1.decimals + ).toString(), + authorisation: authorisation, + }, + ]); + }); + + /* + boostedWeightedSimple1: 1 Linear + 1 normal token + b-a-weth: Linear, aWeth/Weth + BAL + */ + context('boostedWeightedSimple', async () => { + if (!TEST_BOOSTED_WEIGHTED_SIMPLE) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.boostedWeightedSimple1.address]; + const slots = [addresses.boostedWeightedSimple1.slot]; + const balances = [ + parseFixed('1', addresses.boostedWeightedSimple1.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.boostedWeightedSimple1.id, + address: addresses.boostedWeightedSimple1.address, + }, + amount: parseFixed( + '0.05', + addresses.boostedWeightedSimple1.decimals + ).toString(), + authorisation: authorisation, + }, + ]); + }); + + /* + boostedWeightedGeneral1: N Linear + M normal tokens + b-a-dai: Linear, aDai/Dai + b-a-mai: Linear, aMai/Mai + BAL + USDC + */ + context('boostedWeightedGeneral', async () => { + if (!TEST_BOOSTED_WEIGHTED_GENERAL) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.boostedWeightedGeneral1.address]; + const slots = [addresses.boostedWeightedGeneral1.slot]; + const balances = [ + parseFixed('1', addresses.boostedWeightedGeneral1.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.boostedWeightedGeneral1.id, + address: addresses.boostedWeightedGeneral1.address, + }, + amount: parseFixed( + '0.05', + addresses.boostedWeightedGeneral1.decimals + ).toString(), + authorisation: authorisation, + }, + ]); + }); + + /* + boostedWeightedMeta1: 1 Linear + 1 ComposableStable + b-a-weth: Linear, aWeth/Weth + bb-a-usd2: ComposableStable, b-a-usdc/b-a-usdt/b-a-dai + BAL + */ + context('boostedWeightedMeta', async () => { + if (!TEST_BOOSTED_WEIGHTED_META) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.boostedWeightedMeta1.address]; + const slots = [addresses.boostedWeightedMeta1.slot]; + const balances = [ + parseFixed('1', addresses.boostedWeightedMeta1.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.boostedWeightedMeta1.id, + address: addresses.boostedWeightedMeta1.address, + }, + amount: parseFixed( + '0.05', + addresses.boostedWeightedMeta1.decimals + ).toString(), + authorisation: authorisation, + }, + ]); + }); + + /* + boostedWeightedMetaAlt1: 1 normal token + 1 ComposableStable + WETH + b-a-usd2: ComposableStable, b-a-usdt/b-a-usdc/b-a-dai + */ + context('boostedWeightedMetaAlt', async () => { + if (!TEST_BOOSTED_WEIGHTED_META_ALT) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.boostedWeightedMetaAlt1.address]; + const slots = [addresses.boostedWeightedMetaAlt1.slot]; + const balances = [ + parseFixed('1', addresses.boostedWeightedMetaAlt1.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.boostedWeightedMetaAlt1.id, + address: addresses.boostedWeightedMetaAlt1.address, + }, + amount: parseFixed( + '0.01', + addresses.boostedWeightedMetaAlt1.decimals + ).toString(), + authorisation: authorisation, + }, + ]); + }); + + /* + boostedWeightedMetaGeneral1: N Linear + 1 ComposableStable + b-a-usdt: Linear, aUSDT/USDT + b-a-usdc: Linear, aUSDC/USDC + b-a-weth: Linear, aWeth/Weth + b-a-usd2: ComposableStable, b-a-usdt/b-a-usdc/b-a-dai + */ + context('boostedWeightedMetaGeneral', async () => { + if (!TEST_BOOSTED_WEIGHTED_META_GENERAL) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [addresses.boostedWeightedMetaGeneral1.address]; + const slots = [addresses.boostedWeightedMetaGeneral1.slot]; + const balances = [ + parseFixed( + '1', + addresses.boostedWeightedMetaGeneral1.decimals + ).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'exit pool', + pool: { + id: addresses.boostedWeightedMetaGeneral1.id, + address: addresses.boostedWeightedMetaGeneral1.address, + }, + amount: parseFixed( + '0.05', + addresses.boostedWeightedMetaGeneral1.decimals + ).toString(), + authorisation: authorisation, + }, + ]); + }); +}); diff --git a/balancer-js/src/modules/exits/exits.module.ts b/balancer-js/src/modules/exits/exits.module.ts new file mode 100644 index 000000000..a7f068820 --- /dev/null +++ b/balancer-js/src/modules/exits/exits.module.ts @@ -0,0 +1,685 @@ +import { defaultAbiCoder } from '@ethersproject/abi'; +import { cloneDeep } from 'lodash'; +import { Interface } from '@ethersproject/abi'; +import { BigNumber } from '@ethersproject/bignumber'; +import { MaxInt256, WeiPerEther, Zero } from '@ethersproject/constants'; + +import { BalancerError, BalancerErrorCode } from '@/balancerErrors'; +import { Relayer } from '@/modules/relayer/relayer.module'; +import { BatchSwapStep, FundManagement, SwapType } from '@/modules/swaps/types'; +import { WeightedPoolEncoder } from '@/pool-weighted'; +import { StablePoolEncoder } from '@/pool-stable'; +import { + BalancerNetworkConfig, + ExitPoolRequest, + Pool, + PoolAttribute, + PoolType, +} from '@/types'; +import { Findable } from '../data/types'; +import { PoolGraph, Node } from '../graph/graph'; + +import { subSlippage } from '@/lib/utils/slippageHelper'; +import TenderlyHelper from '@/lib/utils/tenderlyHelper'; +import balancerRelayerAbi from '@/lib/abi/RelayerV4.json'; +import { networkAddresses } from '@/lib/constants/config'; +import { AssetHelpers } from '@/lib/utils'; +import { getPoolAddress } from '@/pool-utils'; +import { Join } from '../joins/joins.module'; +import { calcPriceImpact } from '../pricing/priceImpact'; + +const balancerRelayerInterface = new Interface(balancerRelayerAbi); + +export class Exit { + private wrappedNativeAsset: string; + private relayer: string; + private tenderlyHelper: TenderlyHelper; + + constructor( + private pools: Findable, + private networkConfig: BalancerNetworkConfig + ) { + const { tokens, contracts } = networkAddresses(networkConfig.chainId); + this.wrappedNativeAsset = tokens.wrappedNativeAsset; + this.relayer = contracts.relayerV4 as string; + + this.tenderlyHelper = new TenderlyHelper( + networkConfig.chainId, + networkConfig.tenderly + ); + } + + async exitPool( + poolId: string, + amountBptIn: string, + userAddress: string, + slippage: string, + authorisation?: string + ): Promise<{ + to: string; + callData: string; + tokensOut: string[]; + expectedAmountsOut: string[]; + minAmountsOut: string[]; + priceImpact: string; + }> { + /* + Overall exit flow description: + - Create calls with 0 expected min amount for each token out + - static call (or V4 special call) to get actual amounts for each token out + - Apply slippage to amountsOut + - Recreate calls with minAmounts === actualAmountsWithSlippage + - Return minAmoutsOut, UI would use this to display to user + - Return updatedCalls, UI would use this to execute tx + */ + + // Create nodes and order by breadth first + const orderedNodes = await PoolGraph.getGraphNodes( + false, + this.networkConfig.chainId, + poolId, + this.pools, + false + ); + + // Create exit paths for each output node and splits amount in proportionally between them + const outputNodes = orderedNodes.filter((n) => n.exitAction === 'output'); + + const exitPaths = this.getExitPaths(outputNodes, amountBptIn); + + const tokensOutByExitPath = outputNodes.map((n) => n.address.toLowerCase()); + const tokensOut = [...new Set(tokensOutByExitPath)].sort(); + + // Create calls with minimum expected amount out for each exit path + const staticCall = await this.createCalls( + exitPaths, + userAddress, + undefined, + authorisation + ); + + const { expectedAmountsOutByExitPath, minAmountsOutByExitPath } = + await this.amountsOutByExitPath( + userAddress, + staticCall.callData, + orderedNodes[0].address, + staticCall.outputIndexes, + slippage + ); + + // Create calls with minimum expected amount out for each exit path + const { callData, deltas } = await this.createCalls( + exitPaths, + userAddress, + minAmountsOutByExitPath, + authorisation + ); + + const { expectedAmountsOut, minAmountsOut } = this.amountsOutByTokenOut( + tokensOut, + tokensOutByExitPath, + expectedAmountsOutByExitPath, + slippage + ); + + this.assertDeltas(poolId, deltas, amountBptIn, tokensOut, minAmountsOut); + + const priceImpact = await this.calculatePriceImpact( + poolId, + tokensOut, + expectedAmountsOut, + amountBptIn + ); + + return { + to: this.relayer, + callData, + tokensOut, + expectedAmountsOut, + minAmountsOut, + priceImpact, + }; + } + + /* + (From Fernando) + 1. Given a bpt amount in find the expect token amounts out (proportionally) + 2. Uses bptZeroPi = _bptForTokensZeroPriceImpact (the same is used for joins too) + 3. PI = bptAmountIn / bptZeroPi - 1 + */ + private async calculatePriceImpact( + poolId: string, + tokensOut: string[], + amountsOut: string[], + amountBptIn: string + ): Promise { + // Create nodes for each pool/token interaction and order by breadth first + const orderedNodesForJoin = await PoolGraph.getGraphNodes( + true, + this.networkConfig.chainId, + poolId, + this.pools, + false + ); + const joinPaths = Join.getJoinPaths( + orderedNodesForJoin, + tokensOut, + amountsOut + ); + const totalBptZeroPi = Join.totalBptZeroPriceImpact(joinPaths); + const priceImpact = calcPriceImpact( + BigInt(amountBptIn), + totalBptZeroPi.toBigInt(), + false + ).toString(); + return priceImpact; + } + + private assertDeltas( + poolId: string, + deltas: Record, + bptIn: string, + tokensOut: string[], + amountsOut: string[] + ): void { + const poolAddress = getPoolAddress(poolId); + const outDiff = deltas[poolAddress.toLowerCase()].sub(bptIn); + + if (outDiff.abs().gt(3)) { + console.error( + `exit assertDeltas, bptIn: `, + poolAddress, + bptIn, + deltas[poolAddress.toLowerCase()]?.toString() + ); + throw new BalancerError(BalancerErrorCode.EXIT_DELTA_AMOUNTS); + } + delete deltas[poolAddress.toLowerCase()]; + + tokensOut.forEach((token, i) => { + const diff = deltas[token.toLowerCase()].add(amountsOut[i]); + if (diff.abs().gt(1)) { + console.error( + `exit assertDeltas, tokenOut: `, + token, + amountsOut[i], + deltas[token.toLowerCase()]?.toString() + ); + throw new BalancerError(BalancerErrorCode.EXIT_DELTA_AMOUNTS); + } + delete deltas[token.toLowerCase()]; + }); + + for (const token in deltas) { + if (deltas[token].toString() !== '0') { + console.error( + `exit assertDeltas, non-input token should be 0: `, + token, + deltas[token].toString() + ); + throw new BalancerError(BalancerErrorCode.EXIT_DELTA_AMOUNTS); + } + } + } + + // Query amounts out through static call and return decoded result + private amountsOutByExitPath = async ( + userAddress: string, + callData: string, + tokenIn: string, + outputIndexes: number[], + slippage: string + ): Promise<{ + expectedAmountsOutByExitPath: string[]; + minAmountsOutByExitPath: string[]; + }> => { + const simulationResult = await this.tenderlyHelper.simulateMulticall( + this.relayer, + callData, + userAddress, + [tokenIn] + ); + + // Decode each exit path amount out from static call result + const multiCallResult = defaultAbiCoder.decode( + ['bytes[]'], + simulationResult + )[0] as string[]; + + const expectedAmountsOutByExitPath = outputIndexes.map((outputIndex) => { + const result = defaultAbiCoder.decode( + ['uint256'], + multiCallResult[outputIndex] + ); + return result.toString(); + }); + + // Apply slippage tolerance on expected amount out for each exit path + const minAmountsOutByExitPath = expectedAmountsOutByExitPath.map( + (expectedAmountOut) => + subSlippage( + BigNumber.from(expectedAmountOut), + BigNumber.from(slippage) + ).toString() + ); + + return { expectedAmountsOutByExitPath, minAmountsOutByExitPath }; + }; + + // Aggregate amounts out by exit path into amounts out by token out + private amountsOutByTokenOut = ( + tokensOut: string[], + tokensOutByExitPath: string[], + expectedAmountsOutByExitPath: string[], + slippage: string + ) => { + // Aggregate amountsOutByExitPath into expectedAmountsOut + const expectedAmountsOutMap: Record = {}; + tokensOutByExitPath.forEach( + (tokenOut, i) => + (expectedAmountsOutMap[tokenOut] = ( + expectedAmountsOutMap[tokenOut] ?? Zero + ).add(expectedAmountsOutByExitPath[i])) + ); + const expectedAmountsOut = tokensOut.map((tokenOut) => + expectedAmountsOutMap[tokenOut].toString() + ); + + // Apply slippage tolerance on each expected amount out + const minAmountsOut = expectedAmountsOut.map((expectedAmountOut) => + subSlippage( + BigNumber.from(expectedAmountOut), + BigNumber.from(slippage) + ).toString() + ); + + return { expectedAmountsOut, minAmountsOut }; + }; + + // Create one exit path for each output node + private getExitPaths = (outputNodes: Node[], amountIn: string): Node[][] => { + const exitPaths = outputNodes.map((outputNode) => { + const exitPath = [outputNode]; + while (exitPath[0].parent) { + exitPath.unshift(cloneDeep(exitPath[0].parent)); + } + /* + The input/root node requires a real amount (not a reference/index) as it is first node in chain. + This amount will be used when chaining to children. + */ + exitPath[0].index = exitPath[exitPath.length - 1].proportionOfParent + .mul(amountIn) + .div(WeiPerEther) + .toString(); + return exitPath; + }); + + /* + Amounts in for exit paths should be adjusted after caculated to fix eventual rounding issues + */ + // Sum amountIn for each exit path + const amountsInSum = exitPaths.reduce((accumulator, currentExitPath) => { + const amountInForCurrentExitPath = currentExitPath[0].index; + return BigNumber.from(amountInForCurrentExitPath).add(accumulator); + }, Zero); + // Compare total amountIn with sum of calculated amountIn for each exit path + const amountsInDiff = BigNumber.from(amountIn).sub(amountsInSum); + // Add diff to last exit path amountIn + exitPaths[exitPaths.length - 1][0].index = amountsInDiff + .add(exitPaths[exitPaths.length - 1][0].index) + .toString(); + + return exitPaths; + }; + + private async createCalls( + exitPaths: Node[][], + userAddress: string, + minAmountsOut?: string[], + authorisation?: string + ): Promise<{ + callData: string; + outputIndexes: number[]; + deltas: Record; + }> { + const { calls, outputIndexes, deltas } = this.createActionCalls( + cloneDeep(exitPaths), + userAddress, + minAmountsOut + ); + + if (authorisation) { + calls.unshift( + Relayer.encodeSetRelayerApproval(this.relayer, true, authorisation) + ); + } + + const callData = balancerRelayerInterface.encodeFunctionData('multicall', [ + calls, + ]); + + return { + callData, + outputIndexes: authorisation + ? outputIndexes.map((i) => i + 1) + : outputIndexes, + deltas, + }; + } + + updateDeltas( + deltas: Record, + assets: string[], + amounts: string[] + ): Record { + assets.forEach((t, i) => { + const asset = t.toLowerCase(); + if (!deltas[asset]) deltas[asset] = Zero; + deltas[asset] = deltas[asset].add(amounts[i]); + }); + return deltas; + } + + private createActionCalls( + exitPaths: Node[][], + userAddress: string, + minAmountsOut?: string[] + ): { + calls: string[]; + outputIndexes: number[]; + deltas: Record; + } { + const calls: string[] = []; + const outputIndexes: number[] = []; + const isPeek = !minAmountsOut; + const deltas: Record = {}; + + // Create actions for each Node and return in multicall array + + exitPaths.forEach((exitPath, i) => { + exitPath.forEach((node) => { + // Calls from root node are sent by the user. Otherwise sent by the relayer + const isRootNode = !node.parent; + const sender = isRootNode ? userAddress : this.relayer; + // Always send to user on output calls otherwise send to relayer + const exitChild = node.children.find((child) => + exitPath.map((n) => n.index).includes(child.index) + ); + const isLastActionFromExitPath = exitChild?.exitAction === 'output'; + const recipient = isLastActionFromExitPath ? userAddress : this.relayer; + // Last calls will use minAmountsOut to protect user. Middle calls can safely have 0 minimum as tx will revert if last fails. + const minAmountOut = + isLastActionFromExitPath && minAmountsOut ? minAmountsOut[i] : '0'; + + switch (node.exitAction) { + case 'batchSwap': { + const [call, assets, limits] = this.createBatchSwap( + node, + exitChild as Node, + i, + minAmountOut, + sender, + recipient + ); + calls.push(call); + this.updateDeltas(deltas, assets, limits); + break; + } + case 'exitPool': { + const [call, bptIn, tokensOut, amountsOut] = this.createExitPool( + node, + exitChild as Node, + i, + minAmountOut, + sender, + recipient + ); + calls.push(call); + this.updateDeltas( + deltas, + [node.address, ...tokensOut], + [bptIn, ...amountsOut] + ); + break; + } + case 'output': + if (isPeek) { + calls.push( + Relayer.encodePeekChainedReferenceValue( + Relayer.toChainedReference( + this.getOutputRef(i, node.index), + false + ) + ) + ); + outputIndexes.push(calls.length - 1); + } + break; + default: + return; + } + }); + }); + + return { calls, outputIndexes, deltas }; + } + + private createBatchSwap( + node: Node, + exitChild: Node, + exitPathIndex: number, + minAmountOut: string, + sender: string, + recipient: string + ): [string, string[], string[]] { + const isRootNode = !node.parent; + const amountIn = isRootNode + ? node.index + : Relayer.toChainedReference( + this.getOutputRef(exitPathIndex, node.index) + ).toString(); + + const tokenOut = exitChild.address; + const assets = [tokenOut, node.address]; + + // For tokens going in to the Vault, the limit shall be a positive number. For tokens going out of the Vault, the limit shall be a negative number. + // First asset will always be the output token so use expectedOut to set limit + // We don't know input amounts if they are part of a chain so set to max input + // TODO can we be safer? + const limits: string[] = [ + BigNumber.from(minAmountOut).mul(-1).toString(), + MaxInt256.toString(), + ]; + + // TODO Change to single swap to save gas + const swaps: BatchSwapStep[] = [ + { + poolId: node.id, + assetInIndex: 1, + assetOutIndex: 0, + amount: amountIn, + userData: '0x', + }, + ]; + + const funds: FundManagement = { + sender, + recipient, + fromInternalBalance: false, + toInternalBalance: false, + }; + + const outputReferences = [ + { + index: assets + .map((a) => a.toLowerCase()) + .indexOf(tokenOut.toLowerCase()), + key: Relayer.toChainedReference( + this.getOutputRef(exitPathIndex, exitChild.index) + ), + }, + ]; + + // console.log( + // `${node.type} ${node.address} prop: ${formatFixed( + // node.proportionOfParent, + // 18 + // )} + // ${node.exitAction}( + // inputAmt: ${amountIn}, + // inputToken: ${node.address}, + // pool: ${node.id}, + // outputToken: ${exitChild.address}, + // outputRef: ${this.getOutputRef(exitPathIndex, exitChild.index)}, + // sender: ${sender}, + // recipient: ${recipient} + // )` + // ); + + const call = Relayer.encodeBatchSwap({ + swapType: SwapType.SwapExactIn, + swaps, + assets, + funds, + limits, + deadline: BigNumber.from(Math.ceil(Date.now() / 1000) + 3600), // 1 hour from now + value: '0', + outputReferences, + }); + + let userTokenOutAmount = limits[0]; + const userBptAmount = limits[1]; + // If the sender is the Relayer the swap is part of a chain and shouldn't be considered for user deltas + const bptIn = sender === this.relayer ? '0' : userBptAmount; + // If the receiver is the Relayer the swap is part of a chain and shouldn't be considered for user deltas + userTokenOutAmount = recipient === this.relayer ? '0' : userTokenOutAmount; + return [call, assets, [userTokenOutAmount, bptIn]]; + } + + private createExitPool( + node: Node, + exitChild: Node, + exitPathIndex: number, + minAmountOut: string, + sender: string, + recipient: string + ): [string, string, string[], string[]] { + const tokenOut = exitChild.address; + const isRootNode = !node.parent; + const amountIn = isRootNode + ? node.index + : Relayer.toChainedReference( + this.getOutputRef(exitPathIndex, node.index) + ).toString(); + + const tokensOut: string[] = []; + const amountsOut: string[] = []; + + // tokensOut needs to include each asset even if it has 0 amount + node.children.forEach((child) => { + tokensOut.push(child.address); + amountsOut.push(child.address === tokenOut ? minAmountOut : '0'); + }); + + if (node.type === PoolType.ComposableStable) { + // assets need to include the phantomPoolToken + tokensOut.push(node.address); + // need to add a placeholder so sorting works + amountsOut.push('0'); + } + + // sort inputs + const assetHelpers = new AssetHelpers(this.wrappedNativeAsset); + const [sortedTokens, sortedAmounts] = assetHelpers.sortTokens( + tokensOut, + amountsOut + ) as [string[], string[]]; + + // userData amounts should not include the BPT of the pool being joined + let userDataTokens = []; + const bptIndex = sortedTokens + .map((t) => t.toLowerCase()) + .indexOf(node.address.toLowerCase()); + if (bptIndex === -1) { + userDataTokens = sortedTokens; + } else { + userDataTokens = [ + ...sortedTokens.slice(0, bptIndex), + ...sortedTokens.slice(bptIndex + 1), + ]; + } + + let userData: string; + if (node.type === PoolType.Weighted) { + userData = WeightedPoolEncoder.exitExactBPTInForOneTokenOut( + amountIn, + userDataTokens.indexOf(tokenOut) + ); + } else { + userData = StablePoolEncoder.exitExactBPTInForOneTokenOut( + amountIn, + userDataTokens.indexOf(tokenOut) + ); + } + + const outputReferences = [ + { + index: sortedTokens + .map((t) => t.toLowerCase()) + .indexOf(tokenOut.toLowerCase()), + key: Relayer.toChainedReference( + this.getOutputRef(exitPathIndex, exitChild.index) + ), + }, + ]; + + // console.log( + // `${node.type} ${node.address} prop: ${formatFixed( + // node.proportionOfParent, + // 18 + // )} + // ${node.exitAction}( + // poolId: ${node.id}, + // tokensOut: ${sortedTokens}, + // tokenOut: ${sortedTokens[sortedTokens.indexOf(tokenOut)].toString()}, + // amountOut: ${sortedAmounts[sortedTokens.indexOf(tokenOut)].toString()}, + // amountIn: ${amountIn}, + // minAmountOut: ${minAmountOut}, + // outputRef: ${this.getOutputRef(exitPathIndex, exitChild.index)}, + // sender: ${sender}, + // recipient: ${recipient} + // )` + // ); + + const call = Relayer.constructExitCall({ + poolId: node.id, + poolKind: 0, + sender, + recipient, + outputReferences, + exitPoolRequest: {} as ExitPoolRequest, + assets: sortedTokens, + minAmountsOut: sortedAmounts, + userData, + toInternalBalance: false, + }); + + const userAmountTokensOut = sortedAmounts.map((a) => + Relayer.isChainedReference(a) ? '0' : Zero.sub(a).toString() + ); + const userBptIn = Relayer.isChainedReference(amountIn) ? '0' : amountIn; + + return [ + call, + // If the sender is the Relayer the exit is part of a chain and shouldn't be considered for user deltas + sender === this.relayer ? Zero.toString() : userBptIn, + // If the receiver is the Relayer the exit is part of a chain and shouldn't be considered for user deltas + recipient === this.relayer ? [] : sortedTokens, + recipient === this.relayer ? [] : userAmountTokensOut, + ]; + } + + private getOutputRef = (exitPathIndex: number, nodeIndex: string): number => { + return exitPathIndex * 100 + parseInt(nodeIndex); + }; +} diff --git a/balancer-js/src/modules/graph/graph.module.spec.ts b/balancer-js/src/modules/graph/graph.module.spec.ts new file mode 100644 index 000000000..9adde62d4 --- /dev/null +++ b/balancer-js/src/modules/graph/graph.module.spec.ts @@ -0,0 +1,749 @@ +import { expect } from 'chai'; +import { parseFixed } from '@ethersproject/bignumber'; +import { factories } from '@/test/factories'; +import { PoolsStaticRepository } from '../data'; +import { SubgraphToken } from '@balancer-labs/sor'; +import { PoolGraph, Node } from './graph'; +import { + BoostedInfo, + BoostedMetaInfo, + BoostedMetaBigInfo, + BoostedParams, + LinearParams, + BoostedMetaBigParams, + Pool, + LinearInfo, +} from '@/test/factories/pools'; +import { Pool as SdkPool } from '@/types'; +import { Network } from '@/lib/constants/network'; + +function checkNode( + node: Node, + expectedId: string, + expectedAddress: string, + expectedType: string, + expectedJoinAction: string, + expectedExitAction: string, + childLength: number, + expectedOutputReference: string, + expectedProportionOfParent: string +): void { + const proportionOfParentWei = parseFixed(expectedProportionOfParent, 18); + expect(node.id).to.eq(expectedId); + expect(node.address).to.eq(expectedAddress); + expect(node.type).to.eq(expectedType); + expect(node.joinAction).to.eq(expectedJoinAction); + expect(node.exitAction).to.eq(expectedExitAction); + expect(node.children.length).to.eq(childLength); + expect(node.index).to.eq(expectedOutputReference); + expect(node.proportionOfParent.toString()).to.eq( + proportionOfParentWei.toString() + ); +} + +/* +Check a Linear Node which should consist of: +LinearPool -> wrappedToken -> mainToken +*/ +function checkLinearNode( + linearNode: Node, + poolIndex: number, + linearPools: Pool[], + wrappedTokens: SubgraphToken[], + mainTokens: SubgraphToken[], + expectedOutPutReference: number, + wrapMainTokens: boolean +): void { + checkNode( + linearNode, + linearPools[poolIndex].id, + linearPools[poolIndex].address, + 'AaveLinear', + 'batchSwap', + 'batchSwap', + 1, + expectedOutPutReference.toString(), + linearPools[poolIndex].proportionOfParent + ); + if (wrapMainTokens) { + checkNode( + linearNode.children[0], + 'N/A', + wrappedTokens[poolIndex].address, + 'WrappedToken', + 'wrapAaveDynamicToken', + 'unwrapAaveStaticToken', + 1, + (expectedOutPutReference + 1).toString(), + linearPools[poolIndex].proportionOfParent + ); + checkNode( + linearNode.children[0].children[0], + 'N/A', + mainTokens[poolIndex].address, + 'Input', + 'input', + 'output', + 0, + (expectedOutPutReference + 2).toString(), + linearPools[poolIndex].proportionOfParent + ); + } else { + checkNode( + linearNode.children[0], + 'N/A', + mainTokens[poolIndex].address, + 'Input', + 'input', + 'output', + 0, + (expectedOutPutReference + 1).toString(), + linearPools[poolIndex].proportionOfParent + ); + } +} + +/* +Checks a boostedPool, a phantomStable with all constituents being Linear. +*/ +function checkBoosted( + boostedNode: Node, + boostedPool: Pool, + boostedPoolInfo: BoostedInfo, + boostedIndex: number, + expectedProportionOfParent: string, + wrapMainTokens: boolean +): void { + checkNode( + boostedNode, + boostedPool.id, + boostedPool.address, + 'ComposableStable', + 'joinPool', + 'exitPool', + 3, + boostedIndex.toString(), + expectedProportionOfParent + ); + boostedNode.children.forEach((linearNode, i) => { + let linearInputRef; + if (wrapMainTokens) linearInputRef = boostedIndex + 1 + i * 3; + else linearInputRef = boostedIndex + 1 + i * 2; + checkLinearNode( + linearNode, + i, + boostedPoolInfo.linearPools, + boostedPoolInfo.wrappedTokens, + boostedPoolInfo.mainTokens, + linearInputRef, + wrapMainTokens + ); + }); +} + +/* +Checks a boostedMeta, a phantomStable with one Linear and one boosted. +*/ +function checkBoostedMeta( + rootNode: Node, + boostedMetaInfo: BoostedMetaInfo, + wrapMainTokens: boolean +): void { + // Check parent node + checkNode( + rootNode, + boostedMetaInfo.rootInfo.pool.id, + boostedMetaInfo.rootInfo.pool.address, + 'ComposableStable', + 'joinPool', + 'exitPool', + 2, + '0', + '1' + ); + // Check child Boosted node + checkBoosted( + rootNode.children[0], + boostedMetaInfo.childBoostedInfo.rootPool, + boostedMetaInfo.childBoostedInfo, + 1, + boostedMetaInfo.childBoostedInfo.proportion, + wrapMainTokens + ); + let expectedOutputReference = 11; + if (!wrapMainTokens) expectedOutputReference = 8; + // Check child Linear node + checkLinearNode( + rootNode.children[1], + 0, + boostedMetaInfo.childLinearInfo.linearPools, + boostedMetaInfo.childLinearInfo.wrappedTokens, + boostedMetaInfo.childLinearInfo.mainTokens, + expectedOutputReference, + wrapMainTokens + ); +} + +/* +Checks a boostedBig, a phantomStable with two Boosted. +*/ +function checkBoostedMetaBig( + rootNode: Node, + boostedMetaBigInfo: BoostedMetaBigInfo, + wrapMainTokens: boolean +): void { + // Check parent node + checkNode( + rootNode, + boostedMetaBigInfo.rootPool.id, + boostedMetaBigInfo.rootPool.address, + 'ComposableStable', + 'joinPool', + 'exitPool', + 2, + '0', + '1' + ); + let numberOfNodes = 1; + rootNode.children.forEach((childBoosted, i) => { + checkBoosted( + rootNode.children[i], + boostedMetaBigInfo.childPoolsInfo[i].rootPool, + boostedMetaBigInfo.childPoolsInfo[i], + numberOfNodes, + boostedMetaBigInfo.childPoolsInfo[i].proportion, + wrapMainTokens + ); + if (wrapMainTokens) + numberOfNodes = + boostedMetaBigInfo.childPoolsInfo[i].linearPools.length * 3 + 2; + else + numberOfNodes = + boostedMetaBigInfo.childPoolsInfo[i].linearPools.length * 2 + 2; + }); +} + +describe('Graph', () => { + // Single weightedPool - the algo should work for single pools too? + + context('linearPool', () => { + let linearInfo: LinearInfo; + let poolsGraph: PoolGraph; + let rootNode: Node; + + before(async () => { + const linearPool = { + tokens: { + wrappedSymbol: 'aDAI', + mainSymbol: 'DAI', + }, + balance: '1000000', + }; + + linearInfo = factories.linearPools + .transient({ pools: [linearPool] }) + .build(); + const poolProvider = new PoolsStaticRepository( + linearInfo.linearPools as unknown as SdkPool[] + ); + poolsGraph = new PoolGraph(poolProvider, { + network: Network.GOERLI, + rpcUrl: '', + }); + }); + context('using wrapped tokens', () => { + before(async () => { + rootNode = await poolsGraph.buildGraphFromRootPool( + linearInfo.linearPools[0].id, + true + ); + }); + it('should build single linearPool graph', async () => { + checkLinearNode( + rootNode, + 0, + linearInfo.linearPools, + linearInfo.wrappedTokens, + linearInfo.mainTokens, + 0, + true + ); + }); + + it('should sort in breadth first order', async () => { + const orderedNodes = PoolGraph.orderByBfs(rootNode).reverse(); + expect(orderedNodes.length).to.eq(3); + expect(orderedNodes[0].type).to.eq('Input'); + expect(orderedNodes[1].type).to.eq('WrappedToken'); + expect(orderedNodes[2].type).to.eq('AaveLinear'); + }); + }); + context('using non-wrapped tokens', () => { + before(async () => { + rootNode = await poolsGraph.buildGraphFromRootPool( + linearInfo.linearPools[0].id, + false + ); + }); + it('should build single linearPool graph', async () => { + checkLinearNode( + rootNode, + 0, + linearInfo.linearPools, + linearInfo.wrappedTokens, + linearInfo.mainTokens, + 0, + false + ); + }); + + it('should sort in breadth first order', async () => { + const orderedNodes = PoolGraph.orderByBfs(rootNode).reverse(); + expect(orderedNodes.length).to.eq(2); + expect(orderedNodes[0].type).to.eq('Input'); + expect(orderedNodes[1].type).to.eq('AaveLinear'); + }); + }); + }); + + context('boostedPool', () => { + let boostedPoolInfo: BoostedInfo; + let boostedPool: Pool; + let poolsGraph: PoolGraph; + let boostedNode: Node; + + before(() => { + // The boostedPool will contain these Linear pools. + const linearPools = [ + { + tokens: { + wrappedSymbol: 'aDAI', + mainSymbol: 'DAI', + }, + balance: '1000000', + }, + { + tokens: { + wrappedSymbol: 'aUSDC', + mainSymbol: 'USDC', + }, + balance: '500000', + }, + { + tokens: { + wrappedSymbol: 'aUSDT', + mainSymbol: 'USDT', + }, + balance: '500000', + }, + ]; + boostedPoolInfo = factories.boostedPool + .transient({ + linearPoolsParams: { + pools: linearPools, + }, + rootId: 'phantom_boosted_1', + rootAddress: 'address_phantom_boosted_1', + }) + .build(); + boostedPool = boostedPoolInfo.rootPool; + const pools = [...boostedPoolInfo.linearPools, boostedPool]; + // Create staticPools provider with boosted and linear pools + const poolProvider = new PoolsStaticRepository( + pools as unknown as SdkPool[] + ); + poolsGraph = new PoolGraph(poolProvider, { + network: Network.GOERLI, + rpcUrl: '', + }); + }); + + it('should throw when pool doesnt exist', async () => { + let errorMessage = ''; + try { + await poolsGraph.buildGraphFromRootPool('thisisntapool', true); + } catch (error) { + errorMessage = (error as Error).message; + } + expect(errorMessage).to.eq('balancer pool does not exist'); + }); + + context('using wrapped tokens', () => { + before(async () => { + boostedNode = await poolsGraph.buildGraphFromRootPool( + boostedPool.id, + true + ); + }); + + it('should build boostedPool graph', async () => { + checkBoosted( + boostedNode, + boostedPoolInfo.rootPool, + boostedPoolInfo, + 0, + '1', + true + ); + }); + + it('should sort in breadth first order', async () => { + const orderedNodes = PoolGraph.orderByBfs(boostedNode).reverse(); + expect(orderedNodes.length).to.eq(10); + expect(orderedNodes[0].type).to.eq('Input'); + expect(orderedNodes[1].type).to.eq('Input'); + expect(orderedNodes[2].type).to.eq('Input'); + expect(orderedNodes[3].type).to.eq('WrappedToken'); + expect(orderedNodes[4].type).to.eq('WrappedToken'); + expect(orderedNodes[5].type).to.eq('WrappedToken'); + expect(orderedNodes[6].type).to.eq('AaveLinear'); + expect(orderedNodes[7].type).to.eq('AaveLinear'); + expect(orderedNodes[8].type).to.eq('AaveLinear'); + expect(orderedNodes[9].type).to.eq('ComposableStable'); + }); + }); + + context('using non-wrapped tokens', () => { + before(async () => { + boostedNode = await poolsGraph.buildGraphFromRootPool( + boostedPool.id, + false + ); + }); + + it('should build boostedPool graph', async () => { + checkBoosted( + boostedNode, + boostedPoolInfo.rootPool, + boostedPoolInfo, + 0, + '1', + false + ); + }); + + it('should sort in breadth first order', async () => { + const orderedNodes = PoolGraph.orderByBfs(boostedNode).reverse(); + expect(orderedNodes.length).to.eq(7); + expect(orderedNodes[0].type).to.eq('Input'); + expect(orderedNodes[1].type).to.eq('Input'); + expect(orderedNodes[2].type).to.eq('Input'); + expect(orderedNodes[3].type).to.eq('AaveLinear'); + expect(orderedNodes[4].type).to.eq('AaveLinear'); + expect(orderedNodes[5].type).to.eq('AaveLinear'); + expect(orderedNodes[6].type).to.eq('ComposableStable'); + }); + }); + }); + + context('boostedMetaPool', () => { + let boostedMetaInfo: BoostedMetaInfo; + let rootPool: Pool; + let poolsGraph: PoolGraph; + let boostedNode: Node; + + before(() => { + // The boostedMeta will have: + // - boosted with linearPools[0], linearPools[1], linearPools[2] + // - a single linearPool, linearPools[3] + // Note proportions are referenced to parent nodes + const childBoostedParams: BoostedParams = { + rootId: 'id-child', + rootAddress: 'address-child', + rootBalance: '500000', + linearPoolsParams: { + pools: [ + { + tokens: { + wrappedSymbol: 'aDAI', + mainSymbol: 'DAI', + }, + balance: '1000000', + }, + { + tokens: { + wrappedSymbol: 'aUSDC', + mainSymbol: 'USDC', + }, + balance: '500000', + }, + { + tokens: { + wrappedSymbol: 'aUSDT', + mainSymbol: 'USDT', + }, + balance: '500000', + }, + ], + }, + }; + const childLinearParam: LinearParams = { + pools: [ + { + tokens: { + wrappedSymbol: 'aSTABLE', + mainSymbol: 'STABLE', + }, + balance: '500000', + }, + ], + }; + boostedMetaInfo = factories.boostedMetaPool + .transient({ + rootId: 'id-parent', + rootAddress: 'address-parent', + rootBalance: '1000000', + childBoostedParams, + childLinearParam, + }) + .build(); + + rootPool = boostedMetaInfo.rootInfo.pool; + const pools = [ + ...boostedMetaInfo.childLinearInfo.linearPools, + boostedMetaInfo.childBoostedInfo.rootPool, + ...boostedMetaInfo.childBoostedInfo.linearPools, + rootPool, + ]; + // // Create staticPools provider with above pools + const poolProvider = new PoolsStaticRepository( + pools as unknown as SdkPool[] + ); + poolsGraph = new PoolGraph(poolProvider, { + network: Network.GOERLI, + rpcUrl: '', + }); + }); + + context('using wrapped tokens', () => { + before(async () => { + boostedNode = await poolsGraph.buildGraphFromRootPool( + rootPool.id, + true + ); + }); + + it('should build boostedPool graph', async () => { + checkBoostedMeta(boostedNode, boostedMetaInfo, true); + }); + + it('should sort in breadth first order', async () => { + const orderedNodes = PoolGraph.orderByBfs(boostedNode).reverse(); + expect(orderedNodes.length).to.eq(14); + expect(orderedNodes[0].type).to.eq('Input'); + expect(orderedNodes[1].type).to.eq('Input'); + expect(orderedNodes[2].type).to.eq('Input'); + expect(orderedNodes[3].type).to.eq('Input'); + expect(orderedNodes[4].type).to.eq('WrappedToken'); + expect(orderedNodes[5].type).to.eq('WrappedToken'); + expect(orderedNodes[6].type).to.eq('WrappedToken'); + expect(orderedNodes[7].type).to.eq('WrappedToken'); + expect(orderedNodes[8].type).to.eq('AaveLinear'); + expect(orderedNodes[9].type).to.eq('AaveLinear'); + expect(orderedNodes[10].type).to.eq('AaveLinear'); + expect(orderedNodes[11].type).to.eq('AaveLinear'); + expect(orderedNodes[12].type).to.eq('ComposableStable'); + expect(orderedNodes[13].type).to.eq('ComposableStable'); + }); + }); + + context('using non-wrapped tokens', () => { + before(async () => { + boostedNode = await poolsGraph.buildGraphFromRootPool( + rootPool.id, + false + ); + }); + + it('should build boostedPool graph', async () => { + checkBoostedMeta(boostedNode, boostedMetaInfo, false); + }); + + it('should sort in breadth first order', async () => { + const orderedNodes = PoolGraph.orderByBfs(boostedNode).reverse(); + expect(orderedNodes.length).to.eq(10); + expect(orderedNodes[0].type).to.eq('Input'); + expect(orderedNodes[1].type).to.eq('Input'); + expect(orderedNodes[2].type).to.eq('Input'); + expect(orderedNodes[3].type).to.eq('Input'); + expect(orderedNodes[4].type).to.eq('AaveLinear'); + expect(orderedNodes[5].type).to.eq('AaveLinear'); + expect(orderedNodes[6].type).to.eq('AaveLinear'); + expect(orderedNodes[7].type).to.eq('AaveLinear'); + expect(orderedNodes[8].type).to.eq('ComposableStable'); + expect(orderedNodes[9].type).to.eq('ComposableStable'); + }); + }); + }); + + context('boostedMetaBigPool', () => { + let boostedMetaBigInfo: BoostedMetaBigInfo; + let boostedPool: Pool; + let poolsGraph: PoolGraph; + let boostedNode: Node; + + before(() => { + // The boostedMetaBig will have a phantomStable with two boosted. + // Note: + // first pool will be parent + // proportions are referenced to parent nodes + const child1LinearPools: LinearParams = { + pools: [ + { + tokens: { + wrappedSymbol: 'aDAI', + mainSymbol: 'DAI', + }, + balance: '1000000', + }, + { + tokens: { + wrappedSymbol: 'aUSDC', + mainSymbol: 'USDC', + }, + balance: '500000', + }, + { + tokens: { + wrappedSymbol: 'aUSDT', + mainSymbol: 'USDT', + }, + balance: '500000', + }, + ], + }; + const childBoosted1: BoostedParams = { + linearPoolsParams: child1LinearPools, + rootId: 'childBoosted1-id', + rootAddress: 'childBoosted1-address', + rootBalance: '1000000', + }; + const child2LinearPools: LinearParams = { + pools: [ + { + tokens: { + wrappedSymbol: 'cDAI', + mainSymbol: 'DAI', + }, + balance: '4000000', + }, + { + tokens: { + wrappedSymbol: 'cUSDC', + mainSymbol: 'USDC', + }, + balance: '4000000', + }, + { + tokens: { + wrappedSymbol: 'cUSDT', + mainSymbol: 'USDT', + }, + balance: '2000000', + }, + ], + }; + const childBoosted2: BoostedParams = { + linearPoolsParams: child2LinearPools, + rootId: 'childBoosted2-id', + rootAddress: 'childBoosted2-address', + rootBalance: '1000000', + }; + const parentPool: BoostedMetaBigParams = { + rootId: 'parentBoosted-id', + rootAddress: 'parentBoosted-address', + rootBalance: '7777777', + childPools: [childBoosted1, childBoosted2], + }; + + boostedMetaBigInfo = factories.boostedMetaBigPool + .transient(parentPool) + .build(); + boostedPool = boostedMetaBigInfo.rootPool; + const pools = [ + ...boostedMetaBigInfo.childPools, + boostedMetaBigInfo.rootPool, + ]; + // // Create staticPools provider with above pools + const poolProvider = new PoolsStaticRepository( + pools as unknown as SdkPool[] + ); + poolsGraph = new PoolGraph(poolProvider, { + network: Network.GOERLI, + rpcUrl: '', + }); + }); + + context('using wrapped tokens', () => { + before(async () => { + boostedNode = await poolsGraph.buildGraphFromRootPool( + boostedPool.id, + true + ); + }); + + it('should build boostedPool graph', async () => { + checkBoostedMetaBig(boostedNode, boostedMetaBigInfo, true); + }); + + it('should sort in breadth first order', async () => { + const orderedNodes = PoolGraph.orderByBfs(boostedNode).reverse(); + expect(orderedNodes.length).to.eq(21); + expect(orderedNodes[0].type).to.eq('Input'); + expect(orderedNodes[1].type).to.eq('Input'); + expect(orderedNodes[2].type).to.eq('Input'); + expect(orderedNodes[3].type).to.eq('Input'); + expect(orderedNodes[4].type).to.eq('Input'); + expect(orderedNodes[5].type).to.eq('Input'); + expect(orderedNodes[6].type).to.eq('WrappedToken'); + expect(orderedNodes[7].type).to.eq('WrappedToken'); + expect(orderedNodes[8].type).to.eq('WrappedToken'); + expect(orderedNodes[9].type).to.eq('WrappedToken'); + expect(orderedNodes[10].type).to.eq('WrappedToken'); + expect(orderedNodes[11].type).to.eq('WrappedToken'); + expect(orderedNodes[12].type).to.eq('AaveLinear'); + expect(orderedNodes[13].type).to.eq('AaveLinear'); + expect(orderedNodes[14].type).to.eq('AaveLinear'); + expect(orderedNodes[15].type).to.eq('AaveLinear'); + expect(orderedNodes[16].type).to.eq('AaveLinear'); + expect(orderedNodes[17].type).to.eq('AaveLinear'); + expect(orderedNodes[18].type).to.eq('ComposableStable'); + expect(orderedNodes[19].type).to.eq('ComposableStable'); + expect(orderedNodes[20].type).to.eq('ComposableStable'); + }); + }); + + context('using non-wrapped tokens', () => { + before(async () => { + boostedNode = await poolsGraph.buildGraphFromRootPool( + boostedPool.id, + false + ); + }); + + it('should build boostedPool graph', async () => { + checkBoostedMetaBig(boostedNode, boostedMetaBigInfo, false); + }); + + it('should sort in breadth first order', async () => { + const orderedNodes = PoolGraph.orderByBfs(boostedNode).reverse(); + expect(orderedNodes.length).to.eq(15); + expect(orderedNodes[0].type).to.eq('Input'); + expect(orderedNodes[1].type).to.eq('Input'); + expect(orderedNodes[2].type).to.eq('Input'); + expect(orderedNodes[3].type).to.eq('Input'); + expect(orderedNodes[4].type).to.eq('Input'); + expect(orderedNodes[5].type).to.eq('Input'); + expect(orderedNodes[6].type).to.eq('AaveLinear'); + expect(orderedNodes[7].type).to.eq('AaveLinear'); + expect(orderedNodes[8].type).to.eq('AaveLinear'); + expect(orderedNodes[9].type).to.eq('AaveLinear'); + expect(orderedNodes[10].type).to.eq('AaveLinear'); + expect(orderedNodes[11].type).to.eq('AaveLinear'); + expect(orderedNodes[12].type).to.eq('ComposableStable'); + expect(orderedNodes[13].type).to.eq('ComposableStable'); + expect(orderedNodes[14].type).to.eq('ComposableStable'); + }); + }); + }); +}); diff --git a/balancer-js/src/modules/graph/graph.ts b/balancer-js/src/modules/graph/graph.ts new file mode 100644 index 000000000..c2bc03cbc --- /dev/null +++ b/balancer-js/src/modules/graph/graph.ts @@ -0,0 +1,381 @@ +import { BalancerError, BalancerErrorCode } from '@/balancerErrors'; +import { isSameAddress, parsePoolInfo } from '@/lib/utils'; +import { BalancerSdkConfig, Pool, PoolAttribute, PoolType } from '@/types'; +import { Zero, WeiPerEther } from '@ethersproject/constants'; +import { BigNumber, parseFixed } from '@ethersproject/bignumber'; +import { Findable } from '../data/types'; +import { Pools } from '../pools'; +import { getNetworkConfig } from '../sdk.helpers'; + +type SpotPrices = { [tokenIn: string]: string }; +export interface Node { + address: string; + id: string; + joinAction: JoinAction; + exitAction: ExitAction; + type: string; + children: Node[]; + marked: boolean; + index: string; + proportionOfParent: BigNumber; + parent: Node | undefined; + isLeaf: boolean; + spotPrices: SpotPrices; + decimals: number; +} + +type JoinAction = + | 'input' + | 'batchSwap' + | 'wrap' + | 'joinPool' + | 'wrapAaveDynamicToken' + | 'wrapERC4626'; +const joinActions = new Map(); +joinActions.set(PoolType.AaveLinear, 'batchSwap'); +joinActions.set(PoolType.ERC4626Linear, 'batchSwap'); +joinActions.set(PoolType.Element, 'batchSwap'); +joinActions.set(PoolType.Investment, 'joinPool'); +joinActions.set(PoolType.LiquidityBootstrapping, 'joinPool'); +joinActions.set(PoolType.MetaStable, 'joinPool'); +joinActions.set(PoolType.Stable, 'joinPool'); +joinActions.set(PoolType.StablePhantom, 'batchSwap'); +joinActions.set(PoolType.Weighted, 'joinPool'); +joinActions.set(PoolType.ComposableStable, 'joinPool'); + +type ExitAction = + | 'output' + | 'batchSwap' + | 'unwrap' + | 'exitPool' + | 'unwrapAaveStaticToken' + | 'unwrapERC4626'; +const exitActions = new Map(); +exitActions.set(PoolType.AaveLinear, 'batchSwap'); +exitActions.set(PoolType.ERC4626Linear, 'batchSwap'); +exitActions.set(PoolType.Element, 'batchSwap'); +exitActions.set(PoolType.Investment, 'exitPool'); +exitActions.set(PoolType.LiquidityBootstrapping, 'exitPool'); +exitActions.set(PoolType.MetaStable, 'exitPool'); +exitActions.set(PoolType.Stable, 'exitPool'); +exitActions.set(PoolType.StablePhantom, 'batchSwap'); +exitActions.set(PoolType.Weighted, 'exitPool'); +exitActions.set(PoolType.ComposableStable, 'exitPool'); + +export class PoolGraph { + constructor( + private pools: Findable, + private sdkConfig: BalancerSdkConfig + ) {} + + async buildGraphFromRootPool( + poolId: string, + wrapMainTokens: boolean + ): Promise { + const rootPool = await this.pools.find(poolId); + if (!rootPool) throw new BalancerError(BalancerErrorCode.POOL_DOESNT_EXIST); + const nodeIndex = 0; + const rootNode = await this.buildGraphFromPool( + rootPool.address, + nodeIndex, + undefined, + WeiPerEther, + wrapMainTokens + ); + return rootNode[0]; + } + + getTokenTotal(pool: Pool): BigNumber { + const bptIndex = pool.tokensList.indexOf(pool.address); + let total = Zero; + const { parsedBalances } = parsePoolInfo(pool); + parsedBalances.forEach((balance, i) => { + // Ignore phantomBpt balance + if (bptIndex !== i) { + total = total.add(balance); + } + }); + return total; + } + + async buildGraphFromPool( + address: string, + nodeIndex: number, + parent: Node | undefined, + proportionOfParent: BigNumber, + wrapMainTokens: boolean + ): Promise<[Node, number]> { + const pool = await this.pools.findBy('address', address); + + if (!pool) { + if (!parent) { + // If pool not found by address and is root pool (without parent), then throw error + throw new BalancerError(BalancerErrorCode.POOL_DOESNT_EXIST); + } else { + // If pool not found by address, but it has parent, assume it's a leaf token and add a leafTokenNode + // TODO: maybe it's a safety issue? Can we be safer? + const parentPool = (await this.pools.findBy( + 'address', + parent.address + )) as Pool; + const leafTokenDecimals = + parentPool.tokens[parentPool.tokensList.indexOf(address)].decimals ?? + 18; + + const nodeInfo = PoolGraph.createInputTokenNode( + nodeIndex, + address, + leafTokenDecimals, + parent, + proportionOfParent + ); + return nodeInfo; + } + } + + const joinAction = joinActions.get(pool.poolType); + const exitAction = exitActions.get(pool.poolType); + if (!joinAction || !exitAction) + throw new BalancerError(BalancerErrorCode.UNSUPPORTED_POOL_TYPE); + + const tokenTotal = this.getTokenTotal(pool); + const network = getNetworkConfig(this.sdkConfig); + const controller = Pools.wrap(pool, network); + const spotPrices: SpotPrices = {}; + let decimals = 18; + // Spot price of a path is product of the sp of each pool in path. We calculate the sp for each pool token here to use as required later. + pool.tokens.forEach((token) => { + if (isSameAddress(token.address, pool.address)) { + // Updated node with BPT token decimal + decimals = token.decimals ? token.decimals : 18; + return; + } + const sp = controller.calcSpotPrice(token.address, pool.address, true); + spotPrices[token.address] = sp; + }); + + let poolNode: Node = { + address: pool.address, + id: pool.id, + type: pool.poolType, + joinAction, + exitAction, + children: [], + marked: false, + index: nodeIndex.toString(), + parent, + proportionOfParent, + isLeaf: false, + spotPrices, + decimals, + }; + nodeIndex++; + if (pool.poolType.toString().includes('Linear')) { + [poolNode, nodeIndex] = this.createLinearNodeChildren( + poolNode, + nodeIndex, + pool, + wrapMainTokens + ); + } else { + const { parsedBalances } = parsePoolInfo(pool); + for (let i = 0; i < pool.tokens.length; i++) { + // ignore any phantomBpt tokens + if (isSameAddress(pool.tokens[i].address, pool.address)) continue; + let proportion: BigNumber; + // If the pool is a weighted pool we can use the actual tokenWeight as proportion + if (pool.poolType === 'Weighted') { + const tokenWeight = pool.tokens[i].weight as string; + proportion = parseFixed(tokenWeight, 18); + } else { + proportion = BigNumber.from(parsedBalances[i]) + .mul((1e18).toString()) + .div(tokenTotal); + } + const finalProportion = proportion + .mul(proportionOfParent) + .div((1e18).toString()); + const childNode = await this.buildGraphFromPool( + pool.tokens[i].address, + nodeIndex, + poolNode, + finalProportion, + wrapMainTokens + ); + nodeIndex = childNode[1]; + if (childNode[0]) poolNode.children.push(childNode[0]); + } + } + return [poolNode, nodeIndex]; + } + + createLinearNodeChildren( + linearPoolNode: Node, + nodeIndex: number, + linearPool: Pool, + wrapMainTokens: boolean + ): [Node, number] { + if (wrapMainTokens) { + // Linear pool will be joined via wrapped token. This will be the child node. + const wrappedNodeInfo = this.createWrappedTokenNode( + linearPool, + nodeIndex, + linearPoolNode, + linearPoolNode.proportionOfParent + ); + linearPoolNode.children.push(wrappedNodeInfo[0]); + return [linearPoolNode, wrappedNodeInfo[1]]; + } else { + // Main token + if (linearPool.mainIndex === undefined) + throw new Error('Issue With Linear Pool'); + + const mainTokenDecimals = + linearPool.tokens[linearPool.mainIndex].decimals ?? 18; + + const nodeInfo = PoolGraph.createInputTokenNode( + nodeIndex, + linearPool.tokensList[linearPool.mainIndex], + mainTokenDecimals, + linearPoolNode, + linearPoolNode.proportionOfParent + ); + linearPoolNode.children.push(nodeInfo[0]); + nodeIndex = nodeInfo[1]; + return [linearPoolNode, nodeIndex]; + } + } + + createWrappedTokenNode( + linearPool: Pool, + nodeIndex: number, + parent: Node | undefined, + proportionOfParent: BigNumber + ): [Node, number] { + if ( + linearPool.wrappedIndex === undefined || + linearPool.mainIndex === undefined + ) + throw new Error('Issue With Linear Pool'); + + // Relayer can support different wrapped tokens + let joinAction: JoinAction = 'wrapAaveDynamicToken'; + switch (linearPool.poolType) { + case PoolType.ERC4626Linear: + joinAction = 'wrapERC4626'; + } + let exitAction: ExitAction = 'unwrapAaveStaticToken'; + switch (linearPool.poolType) { + case PoolType.ERC4626Linear: + exitAction = 'unwrapERC4626'; + } + + const wrappedTokenNode: Node = { + type: 'WrappedToken', + address: linearPool.tokensList[linearPool.wrappedIndex], + id: 'N/A', + children: [], + marked: false, + joinAction, + exitAction, + index: nodeIndex.toString(), + parent, + proportionOfParent, + isLeaf: false, + spotPrices: {}, + decimals: 18, + }; + nodeIndex++; + + const mainTokenDecimals = + linearPool.tokens[linearPool.mainIndex].decimals ?? 18; + + const inputNode = PoolGraph.createInputTokenNode( + nodeIndex, + linearPool.tokensList[linearPool.mainIndex], + mainTokenDecimals, + wrappedTokenNode, + proportionOfParent + ); + wrappedTokenNode.children = [inputNode[0]]; + nodeIndex = inputNode[1]; + return [wrappedTokenNode, nodeIndex]; + } + + static createInputTokenNode( + nodeIndex: number, + address: string, + decimals: number, + parent: Node | undefined, + proportionOfParent: BigNumber + ): [Node, number] { + return [ + { + address, + id: 'N/A', + type: 'Input', + children: [], + marked: false, + joinAction: 'input', + exitAction: 'output', + index: nodeIndex.toString(), // This will be updated with real amounts in join construction. + parent, + proportionOfParent, + isLeaf: true, + spotPrices: {}, + decimals, + }, + nodeIndex + 1, + ]; + } + + static orderByBfs(root: Node): Node[] { + // Breadth first traversal of graph + const nodes: Node[] = []; + const orderedNodes: Node[] = []; + root.marked = true; + nodes.push(root); + while (nodes.length > 0) { + const currentNode = nodes.shift(); // removes first + if (currentNode) orderedNodes.push(currentNode); + currentNode?.children.forEach((c) => { + if (!c.marked) { + c.marked = true; + nodes.push(c); + } + }); + } + return orderedNodes; + } + + // Return a list of leaf token addresses + static getLeafAddresses(nodes: Node[]): string[] { + return nodes.filter((n) => n.isLeaf).map((n) => n.address); + } + + // Get full graph from root pool and return ordered nodes + static getGraphNodes = async ( + isJoin: boolean, + chainId: number, + poolId: string, + pools: Findable, + wrapMainTokens: boolean + ): Promise => { + const rootPool = await pools.find(poolId); + if (!rootPool) throw new BalancerError(BalancerErrorCode.POOL_DOESNT_EXIST); + const poolsGraph = new PoolGraph(pools, { + network: chainId, + rpcUrl: '', + }); + + const rootNode = await poolsGraph.buildGraphFromRootPool( + poolId, + wrapMainTokens + ); + + if (rootNode.id !== poolId) throw new Error('Error creating graph nodes'); + + if (isJoin) return PoolGraph.orderByBfs(rootNode).reverse(); + else return PoolGraph.orderByBfs(rootNode); + }; +} diff --git a/balancer-js/src/modules/joins/joins.module.integration.spec.ts b/balancer-js/src/modules/joins/joins.module.integration.spec.ts new file mode 100644 index 000000000..cfca3b54c --- /dev/null +++ b/balancer-js/src/modules/joins/joins.module.integration.spec.ts @@ -0,0 +1,1230 @@ +// yarn test:only ./src/modules/joins/joins.module.integration.spec.ts +import dotenv from 'dotenv'; +import { expect } from 'chai'; +import hardhat from 'hardhat'; + +import { BalancerSDK, BalancerTenderlyConfig, Network } from '@/.'; +import { BigNumber, parseFixed } from '@ethersproject/bignumber'; +import { Contracts } from '@/modules/contracts/contracts.module'; +import { forkSetup, getBalances } from '@/test/lib/utils'; +import { ADDRESSES } from '@/test/lib/constants'; +import { Relayer } from '@/modules/relayer/relayer.module'; +import { JsonRpcSigner } from '@ethersproject/providers'; + +dotenv.config(); + +const TEST_BOOSTED = true; +const TEST_BOOSTED_META = true; +const TEST_BOOSTED_META_ALT = true; +const TEST_BOOSTED_META_BIG = true; +const TEST_BOOSTED_WEIGHTED_SIMPLE = true; +const TEST_BOOSTED_WEIGHTED_GENERAL = true; +const TEST_BOOSTED_WEIGHTED_META = true; +const TEST_BOOSTED_WEIGHTED_META_ALT = true; +const TEST_BOOSTED_WEIGHTED_META_GENERAL = true; + +/* + * Testing on GOERLI + * - Update hardhat.config.js with chainId = 5 + * - Update ALCHEMY_URL on .env with a goerli api key + * - Run node on terminal: yarn run node + * - Uncomment section below: + */ +const network = Network.GOERLI; +const blockNumber = 8038074; +const customSubgraphUrl = + 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-goerli-v2-beta'; +const { ALCHEMY_URL_GOERLI: jsonRpcUrl } = process.env; +const rpcUrl = 'http://127.0.0.1:8000'; + +/* + * Testing on MAINNET + * - Update hardhat.config.js with chainId = 1 + * - Update ALCHEMY_URL on .env with a mainnet api key + * - Run node on terminal: yarn run node + * - Uncomment section below: + */ +// const network = Network.MAINNET; +// const blockNumber = 15519886; +// const customSubgraphUrl = +// 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-v2-beta'; +// const { ALCHEMY_URL: jsonRpcUrl } = process.env; +// const rpcUrl = 'http://127.0.0.1:8545'; + +const { TENDERLY_ACCESS_KEY, TENDERLY_USER, TENDERLY_PROJECT } = process.env; +const { ethers } = hardhat; +const MAX_GAS_LIMIT = 8e6; + +// Custom Tenderly configuration parameters - remove in order to use default values +const tenderlyConfig: BalancerTenderlyConfig = { + accessKey: TENDERLY_ACCESS_KEY as string, + user: TENDERLY_USER as string, + project: TENDERLY_PROJECT as string, + blockNumber, +}; + +const sdk = new BalancerSDK({ + network, + rpcUrl, + customSubgraphUrl, + tenderly: tenderlyConfig, +}); +const { pools } = sdk; +const provider = new ethers.providers.JsonRpcProvider(rpcUrl, network); +const signer = provider.getSigner(); +const { contracts, contractAddresses } = new Contracts( + network as number, + provider +); +const relayer = contractAddresses.relayerV4 as string; +const addresses = ADDRESSES[network]; + +interface Test { + signer: JsonRpcSigner; + description: string; + pool: { + id: string; + address: string; + }; + tokensIn: string[]; + amountsIn: string[]; + authorisation: string | undefined; + wrapMainTokens: boolean; +} + +const runTests = async (tests: Test[]) => { + for (let i = 0; i < tests.length; i++) { + const test = tests[i]; + it(test.description, async () => { + const userAddress = await test.signer.getAddress(); + const authorisation = await Relayer.signRelayerApproval( + relayer, + userAddress, + signer, + contracts.vault + ); + await testFlow( + userAddress, + test.pool, + test.tokensIn, + test.amountsIn, + test.wrapMainTokens, + authorisation + ); + }).timeout(120000); + } +}; + +const testFlow = async ( + userAddress: string, + pool: { id: string; address: string }, + tokensIn: string[], + amountsIn: string[], + wrapMainTokens: boolean, + authorisation: string | undefined +) => { + const [bptBalanceBefore, ...tokensInBalanceBefore] = await getBalances( + [pool.address, ...tokensIn], + signer, + userAddress + ); + + const gasLimit = MAX_GAS_LIMIT; + const slippage = '10'; // 10 bps = 0.1% + + const query = await pools.generalisedJoin( + pool.id, + tokensIn, + amountsIn, + userAddress, + wrapMainTokens, + slippage, + authorisation + ); + + const response = await signer.sendTransaction({ + to: query.to, + data: query.callData, + gasLimit, + }); + + const receipt = await response.wait(); + console.log('Gas used', receipt.gasUsed.toString()); + + const [bptBalanceAfter, ...tokensInBalanceAfter] = await getBalances( + [pool.address, ...tokensIn], + signer, + userAddress + ); + expect(receipt.status).to.eql(1); + expect(BigNumber.from(query.minOut).gte('0')).to.be.true; + expect(BigNumber.from(query.expectedOut).gt(query.minOut)).to.be.true; + tokensInBalanceAfter.forEach((balanceAfter, i) => { + expect(balanceAfter.toString()).to.eq( + tokensInBalanceBefore[i].sub(amountsIn[i]).toString() + ); + }); + expect(bptBalanceBefore.eq(0)).to.be.true; + expect(bptBalanceAfter.gte(query.minOut)).to.be.true; + console.log(bptBalanceAfter.toString(), 'bpt after'); + console.log(query.minOut, 'minOut'); + console.log(query.expectedOut, 'expectedOut'); +}; + +// following contexts currently applies to GOERLI only +describe('generalised join execution', async () => { + /* + bbamaiweth: ComposableStable, baMai/baWeth + baMai: Linear, aMai/Mai + baWeth: Linear, aWeth/Weth + */ + context('boosted', async () => { + if (!TEST_BOOSTED) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.MAI.address, + addresses.WETH.address, + addresses.waMAI.address, + addresses.waWETH.address, + addresses.bbamai.address, + addresses.bbaweth.address, + ]; + const slots = [ + addresses.MAI.slot, + addresses.WETH.slot, + addresses.waMAI.slot, + addresses.waWETH.slot, + addresses.bbamai.slot, + addresses.bbaweth.slot, + ]; + const balances = [ + parseFixed('100', 18).toString(), + parseFixed('100', 18).toString(), + '0', + '0', + parseFixed('100', addresses.bbamai.decimals).toString(), + parseFixed('100', addresses.bbaweth.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.bbamaiweth.id, + address: addresses.bbamaiweth.address, + }, + tokensIn: [addresses.MAI.address, addresses.WETH.address], + amountsIn: [ + parseFixed('100', 18).toString(), + parseFixed('100', 18).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with 1 linear', + // pool: { + // id: addresses.bbamaiweth.id, + // address: addresses.bbamaiweth.address, + // }, + // tokensIn: [addresses.bbamai.address], + // amountsIn: [parseFixed('10', 18).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with 1 leaf and 1 linear', + pool: { + id: addresses.bbamaiweth.id, + address: addresses.bbamaiweth.address, + }, + tokensIn: [addresses.WETH.address, addresses.bbamai.address], + amountsIn: [ + parseFixed('10', 18).toString(), + parseFixed('10', 18).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); + + /* + boostedMeta1: ComposableStable, baMai/bbausd2 + baMai: Linear, aMai/Mai + bbausd2 (boosted): ComposableStable, baUsdt/baDai/baUsdc + */ + context('boostedMeta', async () => { + if (!TEST_BOOSTED_META) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.MAI.address, + addresses.waDAI.address, + addresses.waUSDC.address, + addresses.waUSDT.address, + addresses.waMAI.address, + addresses.bbadai.address, + addresses.bbausdc.address, + addresses.bbausdt.address, + addresses.bbamai.address, + addresses.bbausd2.address, + ]; + const slots = [ + addresses.DAI.slot, + addresses.USDC.slot, + addresses.USDT.slot, + addresses.MAI.slot, + addresses.waDAI.slot, + addresses.waUSDC.slot, + addresses.waUSDT.slot, + addresses.waMAI.slot, + addresses.bbadai.slot, + addresses.bbausdc.slot, + addresses.bbausdt.slot, + addresses.bbamai.slot, + addresses.bbausd2.slot, + ]; + const balances = [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.MAI.decimals).toString(), + '0', + '0', + '0', + '0', + parseFixed('10', addresses.bbadai.decimals).toString(), + parseFixed('10', addresses.bbausdc.decimals).toString(), + parseFixed('10', addresses.bbausdt.decimals).toString(), + parseFixed('10', addresses.bbamai.decimals).toString(), + parseFixed('10', addresses.bbausd2.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.boostedMeta1.id, + address: addresses.boostedMeta1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.MAI.address, + ], + amountsIn: [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('0', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.MAI.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with child linear', + // pool: { + // id: addresses.boostedMeta1.id, + // address: addresses.boostedMeta1.address, + // }, + // tokensIn: [addresses.bbamai.address], + // amountsIn: [parseFixed('10', addresses.bbamai.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with some leafs, linears and boosted', + pool: { + id: addresses.boostedMeta1.id, + address: addresses.boostedMeta1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.bbamai.address, + addresses.bbausdt.address, + addresses.bbausd2.address, + ], + amountsIn: [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('0', addresses.bbamai.decimals).toString(), + parseFixed('10', addresses.bbausdt.decimals).toString(), + parseFixed('10', addresses.bbausd2.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); + + /* + boostedMetaAlt1: ComposableStable, Mai/bbausd2 + bbausd2 (boosted): ComposableStable, baUsdt/baDai/baUsdc + */ + context('boostedMetaAlt', async () => { + if (!TEST_BOOSTED_META_ALT) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.MAI.address, + addresses.waDAI.address, + addresses.waUSDC.address, + addresses.waUSDT.address, + addresses.bbausdc.address, + addresses.bbausdt.address, + addresses.bbadai.address, + addresses.bbamai.address, + addresses.bbausd2.address, + ]; + const slots = [ + addresses.DAI.slot, + addresses.USDC.slot, + addresses.USDT.slot, + addresses.MAI.slot, + addresses.waDAI.slot, + addresses.waUSDC.slot, + addresses.waUSDT.slot, + addresses.bbausdc.slot, + addresses.bbausdt.slot, + addresses.bbadai.slot, + addresses.bbamai.slot, + addresses.bbausd2.slot, + ]; + const balances = [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.MAI.decimals).toString(), + '0', + '0', + '0', + parseFixed('10', addresses.bbausdc.decimals).toString(), + parseFixed('10', addresses.bbausdt.decimals).toString(), + parseFixed('10', addresses.bbadai.decimals).toString(), + parseFixed('10', addresses.bbamai.decimals).toString(), + parseFixed('10', addresses.bbausd2.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.boostedMetaAlt1.id, + address: addresses.boostedMetaAlt1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.MAI.address, + ], + amountsIn: [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.MAI.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with single leaf token', + // pool: { + // id: addresses.boostedMetaAlt1.id, + // address: addresses.boostedMetaAlt1.address, + // }, + // tokensIn: [addresses.MAI.address], + // amountsIn: [parseFixed('10', addresses.MAI.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + // { + // signer, + // description: 'join with child linear', + // pool: { + // id: addresses.boostedMetaAlt1.id, + // address: addresses.boostedMetaAlt1.address, + // }, + // tokensIn: [addresses.bbausdc.address], + // amountsIn: [parseFixed('3', addresses.bbausdc.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + // { + // signer, + // description: 'join with child boosted', + // pool: { + // id: addresses.boostedMetaAlt1.id, + // address: addresses.boostedMetaAlt1.address, + // }, + // tokensIn: [addresses.bbausd2.address], + // amountsIn: [parseFixed('10', addresses.bbausd2.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with some leafs, linears and boosted', + pool: { + id: addresses.boostedMetaAlt1.id, + address: addresses.boostedMetaAlt1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDT.address, + addresses.bbadai.address, + addresses.bbausdc.address, + addresses.bbausd2.address, + ], + amountsIn: [ + parseFixed('4', addresses.DAI.decimals).toString(), + parseFixed('0', addresses.USDT.decimals).toString(), + parseFixed('4', addresses.bbadai.decimals).toString(), + parseFixed('4', addresses.bbausdc.decimals).toString(), + parseFixed('4', addresses.bbausd2.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); + + /* + boostedMetaBig1: ComposableStable, bbamaiweth/bbausd2 + bbamaiweth: ComposableStable, baMai/baWeth + baMai: Linear, aMai/Mai + baWeth: Linear, aWeth/Weth + bbausd2 (boosted): ComposableStable, baUsdt/baDai/baUsdc + */ + context('boostedMetaBig', async () => { + if (!TEST_BOOSTED_META_BIG) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.MAI.address, + addresses.WETH.address, + addresses.waDAI.address, + addresses.waUSDC.address, + addresses.waUSDT.address, + addresses.waMAI.address, + addresses.waWETH.address, + addresses.bbadai.address, + addresses.bbausdc.address, + addresses.bbausdt.address, + addresses.bbamai.address, + addresses.bbamaiweth.address, + addresses.bbausd2.address, + ]; + const slots = [ + addresses.DAI.slot, + addresses.USDC.slot, + addresses.USDT.slot, + addresses.MAI.slot, + addresses.WETH.slot, + addresses.waDAI.slot, + addresses.waUSDC.slot, + addresses.waUSDT.slot, + addresses.waMAI.slot, + addresses.waWETH.slot, + addresses.bbadai.slot, + addresses.bbausdc.slot, + addresses.bbausdt.slot, + addresses.bbamai.slot, + addresses.bbamaiweth.slot, + addresses.bbausd2.slot, + ]; + const balances = [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.MAI.decimals).toString(), + parseFixed('10', addresses.WETH.decimals).toString(), + '0', + '0', + '0', + '0', + '0', + parseFixed('10', addresses.bbadai.decimals).toString(), + parseFixed('10', addresses.bbausdc.decimals).toString(), + parseFixed('10', addresses.bbausdt.decimals).toString(), + parseFixed('10', addresses.bbamai.decimals).toString(), + parseFixed('10', addresses.bbamaiweth.decimals).toString(), + parseFixed('10', addresses.bbausd2.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.boostedMetaBig1.id, + address: addresses.boostedMetaBig1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.MAI.address, + addresses.WETH.address, + ], + amountsIn: [ + parseFixed('1', addresses.DAI.decimals).toString(), + parseFixed('1', addresses.USDC.decimals).toString(), + parseFixed('1', addresses.USDT.decimals).toString(), + parseFixed('1', addresses.MAI.decimals).toString(), + parseFixed('1', addresses.WETH.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with child boosted', + // pool: { + // id: addresses.boostedMetaBig1.id, + // address: addresses.boostedMetaBig1.address, + // }, + // tokensIn: [addresses.bbamaiweth.address], + // amountsIn: [parseFixed('10', addresses.bbamaiweth.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with leaf and child boosted', + pool: { + id: addresses.boostedMetaBig1.id, + address: addresses.boostedMetaBig1.address, + }, + tokensIn: [addresses.DAI.address, addresses.bbamaiweth.address], + amountsIn: [ + parseFixed('1', addresses.DAI.decimals).toString(), + parseFixed('1', addresses.bbamaiweth.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + { + signer, + description: 'join with some leafs, linears and boosted', + pool: { + id: addresses.boostedMetaBig1.id, + address: addresses.boostedMetaBig1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.WETH.address, + addresses.bbausdt.address, + addresses.bbamai.address, + addresses.bbamaiweth.address, + addresses.bbausd2.address, + ], + amountsIn: [ + parseFixed('1', addresses.DAI.decimals).toString(), + parseFixed('0', addresses.USDC.decimals).toString(), + parseFixed('1', addresses.USDT.decimals).toString(), + parseFixed('1', addresses.WETH.decimals).toString(), + parseFixed('1', addresses.bbausdt.decimals).toString(), + parseFixed('1', addresses.bbamai.decimals).toString(), + parseFixed('1', addresses.bbamaiweth.decimals).toString(), + parseFixed('1', addresses.bbausd2.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); + + /* + boostedWeightedSimple1: 1 Linear + 1 normal token + b-a-weth: Linear, aWeth/Weth + BAL + */ + context('boostedWeightedSimple', async () => { + if (!TEST_BOOSTED_WEIGHTED_SIMPLE) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.BAL.address, + addresses.WETH.address, + addresses.waWETH.address, + addresses.bbaweth.address, + ]; + const slots = [ + addresses.BAL.slot, + addresses.WETH.slot, + addresses.waWETH.slot, + addresses.bbaweth.slot, + ]; + const balances = [ + parseFixed('10', addresses.BAL.decimals).toString(), + parseFixed('10', addresses.WETH.decimals).toString(), + '0', + parseFixed('10', addresses.bbaweth.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.boostedWeightedSimple1.id, + address: addresses.boostedWeightedSimple1.address, + }, + tokensIn: [addresses.BAL.address, addresses.WETH.address], + amountsIn: [ + parseFixed('10', addresses.BAL.decimals).toString(), + parseFixed('10', addresses.WETH.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with child linear', + // pool: { + // id: addresses.boostedWeightedSimple1.id, + // address: addresses.boostedWeightedSimple1.address, + // }, + // tokensIn: [addresses.bbaweth.address], + // amountsIn: [parseFixed('10', addresses.bbaweth.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with leaf and child linear', + pool: { + id: addresses.boostedWeightedSimple1.id, + address: addresses.boostedWeightedSimple1.address, + }, + tokensIn: [addresses.BAL.address, addresses.bbaweth.address], + amountsIn: [ + parseFixed('1', addresses.BAL.decimals).toString(), + parseFixed('1', addresses.bbaweth.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); + + /* + boostedWeightedGeneral1: N Linear + M normal tokens + b-a-dai: Linear, aDai/Dai + b-a-mai: Linear, aMai/Mai + BAL + USDC + */ + context('boostedWeightedGeneral', async () => { + if (!TEST_BOOSTED_WEIGHTED_GENERAL) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.DAI.address, + addresses.MAI.address, + addresses.BAL.address, + addresses.USDC_old.address, + addresses.bbadai.address, + addresses.bbamai.address, + ]; + const slots = [ + addresses.DAI.slot, + addresses.MAI.slot, + addresses.BAL.slot, + addresses.USDC_old.slot, + addresses.bbadai.slot, + addresses.bbamai.slot, + ]; + const balances = [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.MAI.decimals).toString(), + parseFixed('10', addresses.BAL.decimals).toString(), + parseFixed('10', addresses.USDC_old.decimals).toString(), + parseFixed('10', addresses.bbadai.decimals).toString(), + parseFixed('10', addresses.bbamai.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.boostedWeightedGeneral1.id, + address: addresses.boostedWeightedGeneral1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.MAI.address, + addresses.BAL.address, + addresses.USDC_old.address, + ], + amountsIn: [ + parseFixed('1', addresses.DAI.decimals).toString(), + parseFixed('1', addresses.MAI.decimals).toString(), + parseFixed('1', addresses.BAL.decimals).toString(), + parseFixed('1', addresses.USDC_old.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with child linear', + // pool: { + // id: addresses.boostedWeightedGeneral1.id, + // address: addresses.boostedWeightedGeneral1.address, + // }, + // tokensIn: [addresses.bbadai.address], + // amountsIn: [parseFixed('10', addresses.bbadai.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with some leafs and linear', + pool: { + id: addresses.boostedWeightedGeneral1.id, + address: addresses.boostedWeightedGeneral1.address, + }, + tokensIn: [ + addresses.MAI.address, + addresses.BAL.address, + addresses.bbamai.address, + ], + amountsIn: [ + parseFixed('10', addresses.MAI.decimals).toString(), + parseFixed('10', addresses.BAL.decimals).toString(), + parseFixed('10', addresses.bbamai.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); + + /* + boostedWeightedMeta1: 1 Linear + 1 ComposableStable + b-a-weth: Linear, aWeth/Weth + bb-a-usd2: ComposableStable, b-a-usdc/b-a-usdt/b-a-dai + BAL + */ + context('boostedWeightedMeta', async () => { + if (!TEST_BOOSTED_WEIGHTED_META) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.WETH.address, + addresses.bbadai.address, + addresses.bbausdc.address, + addresses.bbausdt.address, + addresses.bbaweth.address, + addresses.bbausd2.address, + ]; + const slots = [ + addresses.DAI.slot, + addresses.USDC.slot, + addresses.USDT.slot, + addresses.WETH.slot, + addresses.bbadai.slot, + addresses.bbausdc.slot, + addresses.bbausdt.slot, + addresses.bbaweth.slot, + addresses.bbausd2.slot, + ]; + const balances = [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.WETH.decimals).toString(), + parseFixed('10', addresses.bbadai.decimals).toString(), + parseFixed('10', addresses.bbausdc.decimals).toString(), + parseFixed('10', addresses.bbausdt.decimals).toString(), + parseFixed('10', addresses.bbaweth.decimals).toString(), + parseFixed('10', addresses.bbausd2.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.boostedWeightedMeta1.id, + address: addresses.boostedWeightedMeta1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.WETH.address, + ], + amountsIn: [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.WETH.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with child linear', + // pool: { + // id: addresses.boostedWeightedMeta1.id, + // address: addresses.boostedWeightedMeta1.address, + // }, + // tokensIn: [addresses.bbaweth.address], + // amountsIn: [parseFixed('10', addresses.bbaweth.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with some leafs, linears and boosted', + pool: { + id: addresses.boostedWeightedMeta1.id, + address: addresses.boostedWeightedMeta1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.WETH.address, + addresses.bbausdt.address, + addresses.bbaweth.address, + addresses.bbausd2.address, + ], + amountsIn: [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('0', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.WETH.decimals).toString(), + parseFixed('10', addresses.bbausdt.decimals).toString(), + parseFixed('10', addresses.bbaweth.decimals).toString(), + parseFixed('10', addresses.bbausd2.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); + + /* + boostedWeightedMetaAlt1: 1 normal token + 1 ComposableStable + WETH + b-a-usd2: ComposableStable, b-a-usdt/b-a-usdc/b-a-dai + */ + context('boostedWeightedMetaAlt', async () => { + if (!TEST_BOOSTED_WEIGHTED_META_ALT) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.WETH.address, + addresses.bbadai.address, + addresses.bbausdc.address, + addresses.bbausdt.address, + addresses.bbausd2.address, + ]; + const slots = [ + addresses.DAI.slot, + addresses.USDC.slot, + addresses.USDT.slot, + addresses.WETH.slot, + addresses.bbadai.slot, + addresses.bbausdc.slot, + addresses.bbausdt.slot, + addresses.bbausd2.slot, + ]; + const balances = [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.WETH.decimals).toString(), + parseFixed('10', addresses.bbadai.decimals).toString(), + parseFixed('10', addresses.bbausdc.decimals).toString(), + parseFixed('10', addresses.bbausdt.decimals).toString(), + parseFixed('10', addresses.bbausd2.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.boostedWeightedMetaAlt1.id, + address: addresses.boostedWeightedMetaAlt1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.WETH.address, + ], + amountsIn: [ + parseFixed('1', addresses.DAI.decimals).toString(), + parseFixed('1', addresses.USDC.decimals).toString(), + parseFixed('1', addresses.USDT.decimals).toString(), + parseFixed('1', addresses.WETH.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with child linear', + // pool: { + // id: addresses.boostedWeightedMetaAlt1.id, + // address: addresses.boostedWeightedMetaAlt1.address, + // }, + // tokensIn: [addresses.bbausdt.address], + // amountsIn: [parseFixed('1', addresses.bbausdt.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with leaf and child linear', + pool: { + id: addresses.boostedWeightedMetaAlt1.id, + address: addresses.boostedWeightedMetaAlt1.address, + }, + tokensIn: [ + addresses.USDC.address, + addresses.WETH.address, + addresses.bbadai.address, + addresses.bbausdc.address, + addresses.bbausdt.address, + addresses.bbausd2.address, + ], + amountsIn: [ + parseFixed('1', addresses.USDC.decimals).toString(), + parseFixed('1', addresses.WETH.decimals).toString(), + parseFixed('1', addresses.bbadai.decimals).toString(), + parseFixed('1', addresses.bbausdc.decimals).toString(), + parseFixed('0', addresses.bbausdt.decimals).toString(), + parseFixed('1', addresses.bbausd2.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); + + /* + boostedWeightedMetaGeneral1: N Linear + 1 ComposableStable + b-a-usdt: Linear, aUSDT/USDT + b-a-usdc: Linear, aUSDC/USDC + b-a-weth: Linear, aWeth/Weth + b-a-usd2: ComposableStable, b-a-usdt/b-a-usdc/b-a-dai + */ + context('boostedWeightedMetaGeneral', async () => { + if (!TEST_BOOSTED_WEIGHTED_META_GENERAL) return true; + let authorisation: string | undefined; + beforeEach(async () => { + const tokens = [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.WETH.address, + addresses.bbadai.address, + addresses.bbausdc.address, + addresses.bbausdt.address, + addresses.bbaweth.address, + addresses.bbausd2.address, + ]; + const slots = [ + addresses.DAI.slot, + addresses.USDC.slot, + addresses.USDT.slot, + addresses.WETH.slot, + addresses.bbadai.slot, + addresses.bbausdc.slot, + addresses.bbausdt.slot, + addresses.bbaweth.slot, + addresses.bbausd2.slot, + ]; + const balances = [ + parseFixed('10', addresses.DAI.decimals).toString(), + parseFixed('10', addresses.USDC.decimals).toString(), + parseFixed('10', addresses.USDT.decimals).toString(), + parseFixed('10', addresses.WETH.decimals).toString(), + parseFixed('10', addresses.bbadai.decimals).toString(), + parseFixed('10', addresses.bbausdc.decimals).toString(), + parseFixed('10', addresses.bbausdt.decimals).toString(), + parseFixed('10', addresses.bbaweth.decimals).toString(), + parseFixed('10', addresses.bbausd2.decimals).toString(), + ]; + await forkSetup( + signer, + tokens, + slots, + balances, + jsonRpcUrl as string, + blockNumber + ); + }); + + await runTests([ + { + signer, + description: 'join with all leaf tokens', + pool: { + id: addresses.boostedWeightedMetaGeneral1.id, + address: addresses.boostedWeightedMetaGeneral1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.USDT.address, + addresses.WETH.address, + ], + amountsIn: [ + parseFixed('1', addresses.DAI.decimals).toString(), + parseFixed('1', addresses.USDC.decimals).toString(), + parseFixed('1', addresses.USDT.decimals).toString(), + parseFixed('1', addresses.WETH.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + // { + // signer, + // description: 'join with child linear', + // pool: { + // id: addresses.boostedWeightedMetaGeneral1.id, + // address: addresses.boostedWeightedMetaGeneral1.address, + // }, + // tokensIn: [addresses.bbausdc.address], + // amountsIn: [parseFixed('10', addresses.bbausdc.decimals).toString()], + // authorisation: authorisation, + // wrapMainTokens: false, + // }, + { + signer, + description: 'join with some leafs, linears and boosted', + pool: { + id: addresses.boostedWeightedMetaGeneral1.id, + address: addresses.boostedWeightedMetaGeneral1.address, + }, + tokensIn: [ + addresses.DAI.address, + addresses.USDC.address, + addresses.WETH.address, + addresses.bbadai.address, + addresses.bbaweth.address, + addresses.bbausd2.address, + ], + amountsIn: [ + parseFixed('1', addresses.DAI.decimals).toString(), + parseFixed('1', addresses.USDC.decimals).toString(), + parseFixed('0', addresses.WETH.decimals).toString(), + parseFixed('1', addresses.bbadai.decimals).toString(), + parseFixed('1', addresses.bbaweth.decimals).toString(), + parseFixed('1', addresses.bbausd2.decimals).toString(), + ], + authorisation: authorisation, + wrapMainTokens: false, + }, + ]); + }); +}); diff --git a/balancer-js/src/modules/joins/joins.module.ts b/balancer-js/src/modules/joins/joins.module.ts new file mode 100644 index 000000000..da74ed427 --- /dev/null +++ b/balancer-js/src/modules/joins/joins.module.ts @@ -0,0 +1,947 @@ +import { defaultAbiCoder } from '@ethersproject/abi'; +import { cloneDeep } from 'lodash'; +import { Interface } from '@ethersproject/abi'; +import { BigNumber, parseFixed } from '@ethersproject/bignumber'; +import { + AddressZero, + MaxInt256, + WeiPerEther, + Zero, +} from '@ethersproject/constants'; + +import { BalancerError, BalancerErrorCode } from '@/balancerErrors'; +import { Relayer } from '@/modules/relayer/relayer.module'; +import { BatchSwapStep, FundManagement, SwapType } from '@/modules/swaps/types'; +import { StablePoolEncoder } from '@/pool-stable'; +import { + BalancerNetworkConfig, + JoinPoolRequest, + Pool, + PoolAttribute, + PoolType, +} from '@/types'; +import { Findable } from '../data/types'; +import { PoolGraph, Node } from '../graph/graph'; + +import { subSlippage } from '@/lib/utils/slippageHelper'; +import TenderlyHelper from '@/lib/utils/tenderlyHelper'; +import balancerRelayerAbi from '@/lib/abi/RelayerV4.json'; +import { networkAddresses } from '@/lib/constants/config'; +import { AssetHelpers, isSameAddress } from '@/lib/utils'; +import { + SolidityMaths, + _computeScalingFactor, + _upscale, +} from '@/lib/utils/solidityMaths'; +import { calcPriceImpact } from '../pricing/priceImpact'; +import { WeightedPoolEncoder } from '@/pool-weighted'; +import { getPoolAddress } from '@/pool-utils'; +const balancerRelayerInterface = new Interface(balancerRelayerAbi); + +export class Join { + private relayer: string; + private wrappedNativeAsset; + private tenderlyHelper: TenderlyHelper; + constructor( + private pools: Findable, + private networkConfig: BalancerNetworkConfig + ) { + const { tokens, contracts } = networkAddresses(networkConfig.chainId); + this.relayer = contracts.relayerV4 as string; + this.wrappedNativeAsset = tokens.wrappedNativeAsset; + + this.tenderlyHelper = new TenderlyHelper( + networkConfig.chainId, + networkConfig.tenderly + ); + } + + async joinPool( + poolId: string, + tokensIn: string[], + amountsIn: string[], + userAddress: string, + wrapMainTokens: boolean, + slippage: string, + authorisation?: string + ): Promise<{ + to: string; + callData: string; + expectedOut: string; + minOut: string; + priceImpact: string; + }> { + if (tokensIn.length != amountsIn.length) + throw new BalancerError(BalancerErrorCode.INPUT_LENGTH_MISMATCH); + + // Create nodes for each pool/token interaction and order by breadth first + const orderedNodes = await PoolGraph.getGraphNodes( + true, + this.networkConfig.chainId, + poolId, + this.pools, + wrapMainTokens + ); + + const joinPaths = Join.getJoinPaths(orderedNodes, tokensIn, amountsIn); + + const totalBptZeroPi = Join.totalBptZeroPriceImpact(joinPaths); + /* + - Create calls with 0 min bpt for each root join + - static call (or V4 special call) to get actual amounts for each root join + - Apply slippage to amounts + - Recreate calls with minAmounts === actualAmountsWithSlippage + - Return minAmoutOut (sum actualAmountsWithSlippage), UI would use this to display to user + - Return updatedCalls, UI would use this to execute tx + */ + // Create calls with 0 expected for each root join + // Peek is enabled here so we can static call the returned amounts and use these to set limits + const { callData: queryData, outputIndexes } = await this.createCalls( + joinPaths, + userAddress, + undefined, + authorisation + ); + + // static call (or V4 special call) to get actual amounts for each root join + const { amountsOut, totalAmountOut } = await this.amountsOutByJoinPath( + userAddress, + queryData, + tokensIn, + outputIndexes + ); + + const { minAmountsOut, totalMinAmountOut } = this.minAmountsOutByJoinPath( + slippage, + amountsOut, + totalAmountOut + ); + const priceImpact = calcPriceImpact( + BigInt(totalAmountOut), + totalBptZeroPi.toBigInt(), + true + ).toString(); + + // Create calls with minAmountsOut + const { callData, deltas } = await this.createCalls( + joinPaths, + userAddress, + minAmountsOut, + authorisation + ); + + this.assertDeltas(poolId, deltas, tokensIn, amountsIn, totalMinAmountOut); + + return { + to: this.relayer, + callData, + expectedOut: totalAmountOut, + minOut: totalMinAmountOut, + priceImpact, + }; + } + + private assertDeltas( + poolId: string, + deltas: Record, + tokensIn: string[], + amountsIn: string[], + minBptOut: string + ): void { + const poolAddress = getPoolAddress(poolId); + const outDiff = deltas[poolAddress.toLowerCase()].add(minBptOut); + + if (outDiff.abs().gt(3)) { + console.error( + `join assertDeltas, bptOut: `, + poolAddress, + minBptOut, + deltas[poolAddress.toLowerCase()]?.toString() + ); + throw new BalancerError(BalancerErrorCode.JOIN_DELTA_AMOUNTS); + } + delete deltas[poolAddress.toLowerCase()]; + + tokensIn.forEach((token, i) => { + if ( + !BigNumber.from(amountsIn[i]).eq(0) && + deltas[token.toLowerCase()]?.toString() !== amountsIn[i] + ) { + console.error( + `join assertDeltas, tokenIn: `, + token, + amountsIn[i], + deltas[token.toLowerCase()]?.toString() + ); + throw new BalancerError(BalancerErrorCode.JOIN_DELTA_AMOUNTS); + } + delete deltas[token.toLowerCase()]; + }); + + for (const token in deltas) { + if (deltas[token].toString() !== '0') { + console.error( + `join assertDeltas, non-input token should be 0: `, + token, + deltas[token].toString() + ); + throw new BalancerError(BalancerErrorCode.JOIN_DELTA_AMOUNTS); + } + } + } + + // Create join paths from tokensIn all the way to the root node. + static getJoinPaths = ( + orderedNodes: Node[], + tokensIn: string[], + amountsIn: string[] + ): Node[][] => { + const joinPaths: Node[][] = []; + + // Filter all nodes that contain a token in the tokensIn array + const inputNodes = orderedNodes.filter((node) => + tokensIn + .filter((t, i) => BigNumber.from(amountsIn[i]).gt(0)) // Remove input tokens with 0 amounts + .map((tokenIn) => tokenIn.toLowerCase()) + .includes(node.address.toLowerCase()) + ); + + // If inputNodes contain at least one leaf token, then add path to join proportionally with all leaf tokens contained in tokensIn + const containsLeafNode = inputNodes.some((node) => node.isLeaf); + if (containsLeafNode) { + joinPaths.push(orderedNodes); + } + + // Add a join path for each non-leaf input node + const nonLeafInputNodes = inputNodes.filter((node) => !node.isLeaf); + nonLeafInputNodes.forEach((nonLeafInputNode) => { + // Get amount in for current node + const nonLeafAmountIn = amountsIn.find((amountIn, i) => + isSameAddress(tokensIn[i], nonLeafInputNode.address) + ) as string; + // Split amount in between nodes with same non-leaf input token based on proportionOfParent + const totalProportions = nonLeafInputNodes + .filter((node) => isSameAddress(node.address, nonLeafInputNode.address)) + .reduce( + (total, node) => total.add(node.proportionOfParent), + BigNumber.from(0) + ); + const proportionalNonLeafAmountIn = BigNumber.from(nonLeafAmountIn) + .mul(nonLeafInputNode.proportionOfParent) + .div(totalProportions) + .toString(); + // Create input node for current non-leaf input token + const [inputTokenNode] = PoolGraph.createInputTokenNode( + 0, // temp value that will be updated after creation + nonLeafInputNode.address, + nonLeafInputNode.decimals, + nonLeafInputNode.parent, + WeiPerEther + ); + // Update index to be actual amount in + inputTokenNode.index = proportionalNonLeafAmountIn; + inputTokenNode.isLeaf = false; + // Start join path with input node + const nonLeafJoinPath = [inputTokenNode]; + // Add each parent to the join path until we reach the root node + let parent = nonLeafInputNode.parent; + while (parent) { + nonLeafJoinPath.push(cloneDeep(parent)); + parent = parent.parent; + } + // Add join path to list of join paths + joinPaths.push(nonLeafJoinPath); + }); + + // After creating all join paths, update the index of each input node to be the amount in for that node + // All other node indexes will be used as a reference to store the amounts out for that node + this.updateInputAmounts(joinPaths, tokensIn, amountsIn); + + return joinPaths; + }; + + /* + AmountsIn should be adjusted after being split between tokensIn to fix eventual rounding issues. + This prevents the transaction to leave out dust amounts. + */ + private static updateInputAmounts = ( + joinPaths: Node[][], + tokensIn: string[], + amountsIn: string[] + ): void => { + // Helper function to calculate and adjust amount difference for each token in + const ajdustAmountInDiff = ( + tokenInInputNodes: Node[], + amountIn: string + ): void => { + if (tokenInInputNodes.length > 1) { + // Sum of amountsIn from each input node with same tokenIn + const amountsInSumforTokenIn = tokenInInputNodes.reduce( + (sum, currentNode) => sum.add(currentNode.index), + BigNumber.from(0) + ); + // Compare total amountIn with sum of amountIn split between each input node with same tokenIn + const diff = BigNumber.from(amountIn).sub(amountsInSumforTokenIn); + // Apply difference to first input node with same tokenIn + tokenInInputNodes[0].index = diff + .add(tokenInInputNodes[0].index) + .toString(); + } + }; + + // Update amountsIn within leaf join path + const leafJoinPath = joinPaths.find((joinPath) => joinPath[0].isLeaf); + if (leafJoinPath) { + // Update input proportions so inputs are shared correctly between leaf nodes with same tokenIn + const totalProportions = this.updateTotalProportions(leafJoinPath); + // Update input nodes to have correct input amount + leafJoinPath.forEach((node) => { + if (node.joinAction === 'input') + node = this.updateNodeAmount( + node, + tokensIn, + amountsIn, + totalProportions + ); + }); + // Adjust amountIn for each tokenIn to fix eventual rounding issues + tokensIn.forEach((tokenIn, i) => { + const tokenInInputNodes = leafJoinPath.filter( + (inputNode) => + inputNode.isLeaf && isSameAddress(inputNode.address, tokenIn) + ); + ajdustAmountInDiff(tokenInInputNodes, amountsIn[i]); + }); + } + + // Adjust amountsIn shared between non-leaf join paths with same tokenIn + const nonLeafJoinPaths = joinPaths.filter( + (joinPath) => !joinPath[0].isLeaf + ); + if (nonLeafJoinPaths.length > 1) { + tokensIn.forEach((tokenIn, i) => { + const tokenInInputNodes = nonLeafJoinPaths + .map((path) => path[0]) + .filter((node) => isSameAddress(node.address, tokenIn)); + ajdustAmountInDiff(tokenInInputNodes, amountsIn[i]); + }); + } + }; + + createCalls = async ( + joinPaths: Node[][], + userAddress: string, + minAmountsOut?: string[], // one for each joinPath + authorisation?: string + ): Promise<{ + callData: string; + outputIndexes: number[]; + deltas: Record; + }> => { + // Create calls for both leaf and non-leaf inputs + const { calls, outputIndexes, deltas } = this.createActionCalls( + joinPaths, + userAddress, + minAmountsOut + ); + + if (authorisation) { + calls.unshift(this.createSetRelayerApproval(authorisation)); + } + + const callData = balancerRelayerInterface.encodeFunctionData('multicall', [ + calls, + ]); + + return { + callData, + outputIndexes: authorisation + ? outputIndexes.map((i) => i + 1) + : outputIndexes, + deltas, + }; + }; + + /* + 1. For each input token: + 1. recursively find the spot price for each pool in the path of the join + 2. take the product to get the spot price of the path + 3. multiply the input amount of that token by the path spot price to get the "zeroPriceImpact" amount of BPT for that token + 2. Sum each tokens zeroPriceImpact BPT amount to get total zeroPriceImpact BPT + */ + static totalBptZeroPriceImpact = (joinPaths: Node[][]): BigNumber => { + // Add bptZeroPriceImpact for all inputs + let totalBptZeroPi = BigNumber.from('0'); + joinPaths.forEach((joinPath) => { + const isLeafJoin = joinPath[0].isLeaf; + if (isLeafJoin) { + // Calculate bptZeroPriceImpact for leaf inputs + const leafNodes = joinPath.filter((node) => node.isLeaf); + leafNodes.forEach((leafNode) => { + const bptOut = this.bptOutZeroPiForInputNode(leafNode); + totalBptZeroPi = totalBptZeroPi.add(bptOut); + }); + } else { + // Calculate bptZeroPriceImpact for non-leaf inputs + const bptOut = this.bptOutZeroPiForInputNode(joinPath[0]); + totalBptZeroPi = totalBptZeroPi.add(bptOut); + } + }); + return totalBptZeroPi; + }; + + /* + 1. recursively find the spot price for each pool in the path of the join + 2. take the product to get the spot price of the path + 3. multiply the input amount of that token by the path spot price to get the "zeroPriceImpact" amount of BPT for that token + */ + static bptOutZeroPiForInputNode = (inputNode: Node): bigint => { + if (inputNode.index === '0' || inputNode.joinAction !== 'input') + return BigInt(0); + let spProduct = 1; + let parentNode: Node | undefined = inputNode.parent; + let childAddress = inputNode.address; + // Traverse up graph until we reach root adding each node + while (parentNode !== undefined) { + if ( + parentNode.joinAction === 'batchSwap' || + parentNode.joinAction === 'joinPool' + ) { + const sp = parentNode.spotPrices[childAddress.toLowerCase()]; + spProduct = spProduct * parseFloat(sp); + childAddress = parentNode.address; + } + parentNode = parentNode.parent; + } + const spPriceScaled = parseFixed(spProduct.toFixed(18), 18); + const scalingFactor = _computeScalingFactor(BigInt(inputNode.decimals)); + const inputAmountScaled = _upscale(BigInt(inputNode.index), scalingFactor); + const bptOut = SolidityMaths.divDownFixed( + inputAmountScaled, + spPriceScaled.toBigInt() + ); + return bptOut; + }; + + /* + Simulate transaction and decodes each output of interest. + */ + amountsOutByJoinPath = async ( + userAddress: string, + callData: string, + tokensIn: string[], + outputIndexes: number[] + ): Promise<{ amountsOut: string[]; totalAmountOut: string }> => { + const amountsOut: string[] = []; + + const staticResult = await this.tenderlyHelper.simulateMulticall( + this.relayer, + callData, + userAddress, + tokensIn + ); + + const multicallResult = defaultAbiCoder.decode( + ['bytes[]'], + staticResult + )[0] as string[]; + + let totalAmountOut = BigNumber.from('0'); + // Decode each root output + outputIndexes.forEach((outputIndex) => { + const value = defaultAbiCoder.decode( + ['uint256'], + multicallResult[outputIndex] + ); + amountsOut.push(value.toString()); + totalAmountOut = totalAmountOut.add(value.toString()); + }); + + return { + amountsOut, + totalAmountOut: totalAmountOut.toString(), + }; + }; + + /* + Apply slippage to amounts + */ + minAmountsOutByJoinPath = ( + slippage: string, + amounts: string[], + totalAmountOut: string + ): { minAmountsOut: string[]; totalMinAmountOut: string } => { + const minAmountsOut = amounts.map((amount) => + subSlippage(BigNumber.from(amount), BigNumber.from(slippage)).toString() + ); + const totalMinAmountOut = subSlippage( + BigNumber.from(totalAmountOut), + BigNumber.from(slippage) + ).toString(); + + return { + minAmountsOut, + totalMinAmountOut, + }; + }; + + updateDeltas( + deltas: Record, + assets: string[], + amounts: string[] + ): Record { + assets.forEach((t, i) => { + const asset = t.toLowerCase(); + if (!deltas[asset]) deltas[asset] = Zero; + deltas[asset] = deltas[asset].add(amounts[i]); + }); + return deltas; + } + + // Create actions for each Node and return in multicall array + // Create calls for each path, use value stored in minBptAmounts if available + createActionCalls = ( + joinPaths: Node[][], + userAddress: string, + minAmountsOut?: string[] + ): { + calls: string[]; + outputIndexes: number[]; + deltas: Record; + } => { + const calls: string[] = []; + const outputIndexes: number[] = []; + const isPeek = !minAmountsOut; + const deltas: Record = {}; + + joinPaths.forEach((joinPath, j) => { + const isLeafJoin = joinPath[0].isLeaf; + joinPath.forEach((node, i) => { + let nodeChildrenWithinJoinPath; + if (isLeafJoin) { + nodeChildrenWithinJoinPath = joinPath.filter( + (joinNode) => + node.children.map((n) => n.address).includes(joinNode.address) && + node.index === joinNode.parent?.index // Ensure child nodes with same address are not included + ); + } else { + nodeChildrenWithinJoinPath = i > 0 ? [joinPath[i - 1]] : []; + } + + // Prevent adding action calls with input amounts equal 0 + if ( + nodeChildrenWithinJoinPath.length > 0 && + nodeChildrenWithinJoinPath.filter((c) => c.index !== '0').length === 0 + ) { + node.index = '0'; + return; + } + + // If child node was input the tokens come from user not relayer + // wrapped tokens have to come from user (Relayer has no approval for wrapped tokens) + const fromUser = nodeChildrenWithinJoinPath.some( + (child) => + child.joinAction === 'input' || + child.joinAction === 'wrapAaveDynamicToken' + ); + const sender = fromUser ? userAddress : userAddress; + + const isLastChainedCall = i === joinPath.length - 1; + // Always send to user on last call otherwise send to relayer + const recipient = isLastChainedCall ? userAddress : userAddress; + // Last action will use minBptOut to protect user. Middle calls can safely have 0 minimum as tx will revert if last fails. + const minOut = + isLastChainedCall && minAmountsOut ? minAmountsOut[j] : '0'; + + switch (node.joinAction) { + // TODO - Add other Relayer supported Unwraps + case 'wrapAaveDynamicToken': + // relayer has no allowance to spend its own wrapped tokens so recipient must be the user + calls.push( + this.createAaveWrap( + node, + nodeChildrenWithinJoinPath, + j, + sender, + userAddress + ) + ); + break; + case 'batchSwap': { + const [call, assets, limits] = this.createBatchSwap( + node, + nodeChildrenWithinJoinPath, + j, + minOut, + sender, + recipient + ); + calls.push(call); + this.updateDeltas(deltas, assets, limits); + break; + } + case 'joinPool': { + const [call, tokensIn, amountsIn, minBptOut] = this.createJoinPool( + node, + nodeChildrenWithinJoinPath, + j, + minOut, + sender, + recipient + ); + calls.push(call); + this.updateDeltas( + deltas, + [node.address, ...tokensIn], + [minBptOut, ...amountsIn] + ); + break; + } + } + }); + if (isPeek) { + const outputRef = 100 * j; + const peekCall = Relayer.encodePeekChainedReferenceValue( + Relayer.toChainedReference(outputRef, false) + ); + calls.push(peekCall); + outputIndexes.push(calls.indexOf(peekCall)); + } + }); + + return { calls, outputIndexes, deltas }; + }; + + /** + * Creates a map of node address and total proportion. Used for the case where there may be multiple inputs using same token, e.g. DAI input to 2 pools. + * @param nodes nodes to consider. + */ + static updateTotalProportions = ( + nodes: Node[] + ): Record => { + const totalProportions: Record = {}; + nodes.forEach((node) => { + if (!totalProportions[node.address]) + totalProportions[node.address] = node.proportionOfParent; + else { + totalProportions[node.address] = totalProportions[node.address].add( + node.proportionOfParent + ); + } + }); + return totalProportions; + }; + + /** + * Uses relayer to approve itself to act in behalf of the user + * + * @param authorisation Encoded authorisation call. + * @returns relayer approval call + */ + createSetRelayerApproval = (authorisation: string): string => { + return Relayer.encodeSetRelayerApproval(this.relayer, true, authorisation); + }; + + static updateNodeAmount = ( + node: Node, + tokensIn: string[], + amountsIn: string[], + totalProportions: Record + ): Node => { + /* + An input node requires a real amount (not an outputRef) as it is first node in chain. + This amount will be used when chaining to parent. + Amounts are split proportionally between all inputs with same token. + */ + const tokenIndex = tokensIn + .map((t) => t.toLowerCase()) + .indexOf(node.address.toLowerCase()); + if (tokenIndex === -1) { + node.index = '0'; + return node; + } + + // Calculate proportional split + const totalProportion = totalProportions[node.address]; + const inputProportion = node.proportionOfParent + .mul((1e18).toString()) + .div(totalProportion); + const inputAmount = inputProportion + .mul(amountsIn[tokenIndex]) + .div((1e18).toString()); + // Update index with actual value + node.index = inputAmount.toString(); + // console.log( + // `${node.type} ${node.address} prop: ${node.proportionOfParent.toString()} + // ${node.joinAction} ( + // Inputs: ${inputAmount.toString()} + // OutputRef: ${node.index} + // )` + // ); + return node; + }; + + createAaveWrap = ( + node: Node, + nodeChildrenWithinJoinPath: Node[], + joinPathIndex: number, + sender: string, + recipient: string + ): string => { + // Throws error based on the assumption that aaveWrap apply only to input tokens from leaf nodes + if (nodeChildrenWithinJoinPath.length !== 1) + throw new Error('aaveWrap nodes should always have a single child node'); + + const childNode = nodeChildrenWithinJoinPath[0]; + + const staticToken = node.address; + const amount = childNode.index; + const call = Relayer.encodeWrapAaveDynamicToken({ + staticToken, + sender, + recipient, + amount, + fromUnderlying: true, + outputReference: this.getOutputRefValue(joinPathIndex, node).value, + }); + + // console.log( + // `${node.type} ${node.address} prop: ${node.proportionOfParent.toString()} + // ${node.joinAction} ( + // staticToken: ${staticToken}, + // input: ${amount}, + // outputRef: ${node.index.toString()} + // )` + // ); + + return call; + }; + + createBatchSwap = ( + node: Node, + nodeChildrenWithinJoinPath: Node[], + joinPathIndex: number, + expectedOut: string, + sender: string, + recipient: string + ): [string, string[], string[]] => { + // We only need batchSwaps for main/wrapped > linearBpt so shouldn't be more than token > token + if (nodeChildrenWithinJoinPath.length !== 1) + throw new Error('Unsupported batchswap'); + const inputToken = nodeChildrenWithinJoinPath[0].address; + const inputValue = this.getOutputRefValue( + joinPathIndex, + nodeChildrenWithinJoinPath[0] + ); + const assets = [node.address, inputToken]; + + // For tokens going in to the Vault, the limit shall be a positive number. For tokens going out of the Vault, the limit shall be a negative number. + // First asset will always be the output token (which will be linearBpt) so use expectedOut to set limit + // We don't know input amounts if they are part of a chain so set to max input + // TODO can we be safer? + const limits: string[] = [ + BigNumber.from(expectedOut).mul(-1).toString(), + inputValue.isRef ? MaxInt256.toString() : inputValue.value, + ]; + + // TODO Change to single swap to save gas + const swaps: BatchSwapStep[] = [ + { + poolId: node.id, + assetInIndex: 1, + assetOutIndex: 0, + amount: inputValue.value, + userData: '0x', + }, + ]; + + const funds: FundManagement = { + sender, + recipient, + fromInternalBalance: sender === this.relayer, + toInternalBalance: recipient === this.relayer, + }; + + const outputReferences = [ + { + index: assets + .map((a) => a.toLowerCase()) + .indexOf(node.address.toLowerCase()), + key: BigNumber.from(this.getOutputRefValue(joinPathIndex, node).value), + }, + ]; + + // console.log( + // `${node.type} ${node.address} prop: ${node.proportionOfParent.toString()} + // ${node.joinAction}( + // inputAmt: ${nodeChildrenWithinJoinPath[0].index}, + // inputToken: ${nodeChildrenWithinJoinPath[0].address}, + // pool: ${node.id}, + // outputToken: ${node.address}, + // outputRef: ${this.getOutputRefValue(joinPathIndex, node).value}, + // sender: ${sender}, + // recipient: ${recipient} + // )` + // ); + + const call = Relayer.encodeBatchSwap({ + swapType: SwapType.SwapExactIn, + swaps, + assets, + funds, + limits, + deadline: BigNumber.from(Math.ceil(Date.now() / 1000) + 3600), // 1 hour from now + value: '0', + outputReferences, + }); + + // If the sender is the Relayer the swap is part of a chain and shouldn't be considered for user deltas + const userTokenIn = sender === this.relayer ? '0' : limits[1]; + // If the receiver is the Relayer the swap is part of a chain and shouldn't be considered for user deltas + const userBptOut = recipient === this.relayer ? '0' : limits[0]; + + return [call, assets, [userBptOut, userTokenIn]]; + }; + + createJoinPool = ( + node: Node, + nodeChildrenWithinJoinPath: Node[], + joinPathIndex: number, + minAmountOut: string, + sender: string, + recipient: string + ): [string, string[], string[], string] => { + const inputTokens: string[] = []; + const inputAmts: string[] = []; + + // inputTokens needs to include each asset even if it has 0 amount + node.children.forEach((child) => { + inputTokens.push(child.address); + // non-leaf joins should set input amounts only for children that are in their joinPath + const childWithinJoinPath = nodeChildrenWithinJoinPath.find((c) => + isSameAddress(c.address, child.address) + ); + if (childWithinJoinPath) { + inputAmts.push( + this.getOutputRefValue(joinPathIndex, childWithinJoinPath).value + ); + } else { + inputAmts.push('0'); + } + }); + + if (node.type === PoolType.ComposableStable) { + // assets need to include the phantomPoolToken + inputTokens.push(node.address); + // need to add a placeholder so sorting works + inputAmts.push('0'); + } + + // sort inputs + const assetHelpers = new AssetHelpers(this.wrappedNativeAsset); + const [sortedTokens, sortedAmounts] = assetHelpers.sortTokens( + inputTokens, + inputAmts + ) as [string[], string[]]; + + // userData amounts should not include the BPT of the pool being joined + let userDataAmounts = []; + const bptIndex = sortedTokens + .map((t) => t.toLowerCase()) + .indexOf(node.address.toLowerCase()); + if (bptIndex === -1) { + userDataAmounts = sortedAmounts; + } else { + userDataAmounts = [ + ...sortedAmounts.slice(0, bptIndex), + ...sortedAmounts.slice(bptIndex + 1), + ]; + } + + let userData: string; + if (node.type === PoolType.Weighted) { + userData = WeightedPoolEncoder.joinExactTokensInForBPTOut( + userDataAmounts, + minAmountOut + ); + } else { + userData = StablePoolEncoder.joinExactTokensInForBPTOut( + userDataAmounts, + minAmountOut + ); + } + + // TODO: add test to join weth/wsteth pool using ETH + const ethIndex = sortedTokens.indexOf(AddressZero); + const value = ethIndex === -1 ? '0' : sortedAmounts[ethIndex]; + + // console.log( + // `${node.type} ${node.address} prop: ${node.proportionOfParent.toString()} + // ${node.joinAction}( + // poolId: ${node.id}, + // assets: ${sortedTokens.toString()}, + // maxAmtsIn: ${sortedAmounts.toString()}, + // amountsIn: ${userDataAmounts.toString()}, + // minOut: ${minAmountOut}, + // outputRef: ${this.getOutputRefValue(joinPathIndex, node).value}, + // sender: ${sender}, + // recipient: ${recipient} + // )` + // ); + + const call = Relayer.constructJoinCall({ + poolId: node.id, + kind: 0, + sender, + recipient, + value, + outputReference: this.getOutputRefValue(joinPathIndex, node).value, + joinPoolRequest: {} as JoinPoolRequest, + assets: sortedTokens, // Must include BPT token + maxAmountsIn: sortedAmounts, + userData, + fromInternalBalance: sender === this.relayer, + }); + + const userAmountsTokenIn = sortedAmounts.map((a) => + Relayer.isChainedReference(a) ? '0' : a + ); + const userAmountOut = Relayer.isChainedReference(minAmountOut) + ? '0' + : minAmountOut; + + return [ + call, + // If the sender is the Relayer the join is part of a chain and shouldn't be considered for user deltas + sender === this.relayer ? [] : sortedTokens, + sender === this.relayer ? [] : userAmountsTokenIn, + // If the receiver is the Relayer the join is part of a chain and shouldn't be considered for user deltas + recipient === this.relayer + ? Zero.toString() + : Zero.sub(userAmountOut).toString(), // -ve because coming from Vault + ]; + }; + + getOutputRefValue = ( + joinPathIndex: number, + node: Node + ): { value: string; isRef: boolean } => { + if (node.joinAction === 'input') { + // Input nodes have their indexes set as the actual input amount, instead of a chained reference + return { value: node.index, isRef: false }; + } else if (node.index !== '0' || !node.parent) { + // Root node (parent === undefined) has index zero, but should still pass chained reference as outputRef value + return { + value: Relayer.toChainedReference( + BigNumber.from(node.index).add(joinPathIndex * 100) + ).toString(), + isRef: true, + }; + } else { + return { + value: '0', + isRef: true, + }; + } + }; +} diff --git a/balancer-js/src/modules/liquidity/liquidity.module.spec.ts b/balancer-js/src/modules/liquidity/liquidity.module.spec.ts index cfec86788..08d372a6c 100644 --- a/balancer-js/src/modules/liquidity/liquidity.module.spec.ts +++ b/balancer-js/src/modules/liquidity/liquidity.module.spec.ts @@ -82,6 +82,12 @@ describe('Liquidity Module', () => { const liquidity = await liquidityProvider.getLiquidity(pool); expect(liquidity).to.be.eq('116.303077211035488'); }); + + it('Should not show a huge amount of liquidity for this AKITA pool', async () => { + const pool = findPool('0xc065798f227b49c150bcdc6cdc43149a12c4d757'); + const liquidity = await liquidityProvider.getLiquidity(pool); + expect(liquidity).to.be.eq('7781301.384420056605162613'); + }); }); context('Stable Pool calculations', () => { @@ -119,4 +125,15 @@ describe('Liquidity Module', () => { ); }); }); + + context('Composable Stable pool calculations', () => { + it('Correctly calculates liquidity of a composable stable pool with a boosted subpool', async () => { + const liquidity = await liquidityProvider.getLiquidity( + findPool('0xb54b2125b711cd183edd3dd09433439d53961652') + ); + expect(Number(liquidity).toFixed(8).toString()).to.be.eq( + '17901.40061800' + ); + }); + }); }); diff --git a/balancer-js/src/modules/liquidity/liquidity.module.ts b/balancer-js/src/modules/liquidity/liquidity.module.ts index 7ac4ce346..347c54e1c 100644 --- a/balancer-js/src/modules/liquidity/liquidity.module.ts +++ b/balancer-js/src/modules/liquidity/liquidity.module.ts @@ -65,7 +65,9 @@ export class Liquidity { address: token.address, decimals: token.decimals, priceRate: token.priceRate, - price: tokenPrice, + price: (tokenPrice?.usd && tokenPrice) || { + usd: token.token?.latestUSDPrice, + }, balance: token.balance, weight: token.weight, }; @@ -73,6 +75,12 @@ export class Liquidity { }) ); + // TODO: Just in case we need it soon. Otherwise remove without mercy. + // Any of the tokens is missing the price, use subgraph totalLiquidity + // if(nonPoolTokensWithUpdatedPrice.map((t) => t.price?.usd).indexOf(undefined) > -1) { + // return pool.totalLiquidity + // } + const tokenLiquidity = PoolTypeConcerns.from( pool.poolType ).liquidity.calcTotal(nonPoolTokensWithUpdatedPrice); diff --git a/balancer-js/src/modules/pools/apr/apr.integration.spec.ts b/balancer-js/src/modules/pools/apr/apr.integration.spec.ts index 26eddb672..8e95d2783 100644 --- a/balancer-js/src/modules/pools/apr/apr.integration.spec.ts +++ b/balancer-js/src/modules/pools/apr/apr.integration.spec.ts @@ -20,7 +20,7 @@ const veBalId = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014'; const usdStable = - '0x7b50775383d3d6f0215a8f290f2c9e2eebbeceb20000000000000000000000fe'; + '0xa13a9247ea42d743238089903570127dda72fe4400000000000000000000035d'; const btcEth = '0xa6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e'; diff --git a/balancer-js/src/modules/pools/apr/apr.ts b/balancer-js/src/modules/pools/apr/apr.ts index e7f1e019b..0cab12fe8 100644 --- a/balancer-js/src/modules/pools/apr/apr.ts +++ b/balancer-js/src/modules/pools/apr/apr.ts @@ -9,12 +9,9 @@ import type { TokenAttribute, LiquidityGauge, Network, + PoolToken, } from '@/types'; -import { - BaseFeeDistributor, - ProtocolFeesProvider, - RewardData, -} from '@/modules/data'; +import { BaseFeeDistributor, RewardData } from '@/modules/data'; import { ProtocolRevenue } from './protocol-revenue'; import { Liquidity } from '@/modules/liquidity/liquidity.module'; import { identity, zipObject, pickBy } from 'lodash'; @@ -60,8 +57,7 @@ export class PoolApr { private feeCollector: Findable, private yesterdaysPools?: Findable, private liquidityGauges?: Findable, - private feeDistributor?: BaseFeeDistributor, - private protocolFees?: ProtocolFeesProvider + private feeDistributor?: BaseFeeDistributor ) {} /** @@ -108,70 +104,89 @@ export class PoolApr { }); // Get each token APRs - const aprs = bptFreeTokens.map(async (token) => { - let apr = 0; - const tokenYield = await this.tokenYields.find(token.address); - - if (tokenYield) { - if (pool.poolType === 'MetaStable') { - apr = tokenYield * (1 - (await this.protocolSwapFeePercentage())); - } else if (pool.poolType === 'ComposableStable') { - if (token.isExemptFromYieldProtocolFee) { - apr = tokenYield; + const aprs = await Promise.all( + bptFreeTokens.map(async (token) => { + let apr = 0; + const tokenYield = await this.tokenYields.find(token.address); + + if (tokenYield) { + if (pool.poolType === 'MetaStable') { + apr = tokenYield * (1 - (await this.protocolSwapFeePercentage())); + } else if ( + pool.poolType === 'ComposableStable' || + (pool.poolType === 'Weighted' && pool.poolTypeVersion === 2) + ) { + if (token.isExemptFromYieldProtocolFee) { + apr = tokenYield; + } else { + apr = + tokenYield * + (1 - parseFloat(pool.protocolYieldFeeCache || '0.5')); + } } else { - const fees = await this.protocolFeesPercentage(); - apr = tokenYield * (1 - fees.yieldFee); - } - } else if (pool.poolType === 'Weighted' && pool.poolTypeVersion === 2) { - if (token.isExemptFromYieldProtocolFee) { apr = tokenYield; - } else { - apr = tokenYield * (1 - parseFloat(pool.protocolYieldFeeCache)); } } else { - apr = tokenYield; - } - } else { - // Handle subpool APRs with recursive call to get the subPool APR - const subPool = await this.pools.findBy('address', token.address); - - if (subPool) { - // INFO: Liquidity mining APR can't cascade to other pools - const subSwapFees = await this.swapFees(subPool); - const subtokenAprs = await this.tokenAprs(subPool); - apr = subSwapFees + subtokenAprs.total; + // Handle subpool APRs with recursive call to get the subPool APR + const subPool = await this.pools.findBy('address', token.address); + + if (subPool) { + // INFO: Liquidity mining APR can't cascade to other pools + const subSwapFees = await this.swapFees(subPool); + const subtokenAprs = await this.tokenAprs(subPool); + let subApr = subtokenAprs.total; + if ( + pool.poolType === 'ComposableStable' || + (pool.poolType === 'Weighted' && pool.poolTypeVersion === 2) + ) { + if (!token.isExemptFromYieldProtocolFee) { + subApr = + subApr * + (1 - parseFloat(pool.protocolYieldFeeCache || '0.5')); + } + } + apr = subSwapFees + subApr; + } } - } - return apr; - }); + return apr; + }) + ); // Get token weights normalised by usd price - const weights = bptFreeTokens.map(async (token): Promise => { + const getWeight = async (token: PoolToken): Promise => { + let tokenPrice: string | undefined; if (token.weight) { return parseFloat(token.weight); - } else { - let tokenPrice = - token.price?.usd || (await this.tokenPrices.find(token.address))?.usd; - if (!tokenPrice) { - const poolToken = await this.pools.findBy('address', token.address); - if (poolToken) { - tokenPrice = (await this.bptPrice(poolToken)).toString(); - } else { - throw `No price for ${token.address}`; - } + } else if (token.token?.pool?.poolType) { + const poolToken = await this.pools.findBy('address', token.address); + if (poolToken) { + tokenPrice = (await this.bptPrice(poolToken)).toString(); } + } else { + tokenPrice = + token.price?.usd || + (await this.tokenPrices.find(token.address))?.usd || + token.token?.latestUSDPrice; + } + if (tokenPrice) { // using floats assuming frontend purposes with low precision needs const tokenValue = parseFloat(token.balance) * parseFloat(tokenPrice); return tokenValue / parseFloat(totalLiquidity); + } else { + throw `No price for ${token.address}`; } - }); + }; // Normalise tokenAPRs according to weights const weightedAprs = await Promise.all( - aprs.map(async (apr, idx) => { - const [a, w] = await Promise.all([apr, weights[idx]]); - return Math.round(a * w); + bptFreeTokens.map(async (token, idx) => { + if (aprs[idx] === 0) { + return 0; + } + + const weight = await getWeight(token); + return Math.round(aprs[idx] * weight); }) ); @@ -419,10 +434,14 @@ export class PoolApr { * @returns Pool liquidity in USD */ private async totalLiquidity(pool: Pool): Promise { - const liquidityService = new Liquidity(this.pools, this.tokenPrices); - const liquidity = await liquidityService.getLiquidity(pool); - - return liquidity; + try { + const liquidityService = new Liquidity(this.pools, this.tokenPrices); + const liquidity = await liquidityService.getLiquidity(pool); + return liquidity; + } catch (err) { + console.error('Liquidity calculcation failed, falling back to subgraph'); + return pool.totalLiquidity; + } } /** @@ -444,17 +463,6 @@ export class PoolApr { return fee ? fee : 0; } - private async protocolFeesPercentage() { - if (this.protocolFees) { - return await this.protocolFees.getFees(); - } - - return { - swapFee: 0, - yieldFee: 0, - }; - } - private async rewardTokenApr(tokenAddress: string, rewardData: RewardData) { if (rewardData.period_finish.toNumber() < Date.now() / 1000) { return { diff --git a/balancer-js/src/modules/pools/impermanentLoss/impermanentLoss.integration.spec.ts b/balancer-js/src/modules/pools/impermanentLoss/impermanentLoss.integration.spec.ts new file mode 100644 index 000000000..fd512e57e --- /dev/null +++ b/balancer-js/src/modules/pools/impermanentLoss/impermanentLoss.integration.spec.ts @@ -0,0 +1,95 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { BalancerError, BalancerErrorCode } from '@/balancerErrors'; +import { ImpermanentLossService } from '@/modules/pools/impermanentLoss/impermanentLossService'; +import { BalancerSDK } from '@/modules/sdk.module'; +import { Network, Pool } from '@/types'; +import { expect } from 'chai'; + +const TEST_DATA: { [key: string]: { poolId: string } } = { + ComposableStablePool: { + poolId: + '0x8159462d255c1d24915cb51ec361f700174cd99400000000000000000000075d', + }, + WeightedPool: { + poolId: + '0x3d468ab2329f296e1b9d8476bb54dd77d8c2320f000200000000000000000426', + }, + WeightedPoolWithMissingPrice: { + poolId: + '0x017fe2f89a34a3485b66e50b3b25c588d70a787a0002000000000000000008c7', + }, + WeightedPoolWithMissingUserData: { + poolId: + '0x3d468ab2329f296e1b9d8476bb54dd77d8c2320f000200000000000000000426', + }, +}; + +const rpcUrl = 'https://rpc.ankr.com/polygon'; +const network = Network.POLYGON; +const sdk = new BalancerSDK({ network, rpcUrl }); +const service = new ImpermanentLossService( + sdk.data.tokenPrices, + sdk.data.tokenHistoricalPrices +); + +const getPool = async (poolId: string): Promise => { + const pool = await sdk.pools.find(poolId); + if (!pool) { + throw new Error('poll not found'); + } + return pool; +}; +/* + * REALLY MORE A LIST OF USE CASE SCENARIOS THAN AN INTEGRATION TEST. + * + * TODO: add stubbing + */ +describe('ImpermanentLossService', () => { + context('when queried for Composable Stable Pool', () => { + it('should return an IL gte 0', async () => { + const testData = TEST_DATA.ComposableStablePool; + const pool = await getPool(testData.poolId); + const timestamp = 1666601608; + const loss = await service.calcImpLoss(timestamp, pool); + expect(loss).gte(0); + }); + }); + context('when queried for Weighted Pool', () => { + it('should return an IL gte 0', async () => { + const testData = TEST_DATA.WeightedPool; + const pool = await getPool(testData.poolId); + const timestamp = 1666601608; + const loss = await service.calcImpLoss(timestamp, pool); + expect(loss).gte(0); + }); + }); + context('when queried for pool Weighted Pool with missing price', () => { + it('should throw an exception', async () => { + const testData = TEST_DATA.WeightedPoolWithMissingPrice; + const pool = await getPool(testData.poolId); + const timestamp = 1666276501; + try { + await service.calcImpLoss(timestamp, pool); + } catch (e: any) { + expect(e.message).eq( + BalancerError.getMessage(BalancerErrorCode.MISSING_PRICE_RATE) + ); + } + }); + }); + context('when queried for pool Weighted Pool with missing user data', () => { + it('should throw an exception', async () => { + const testData = TEST_DATA.WeightedPoolWithMissingUserData; + const pool = await getPool(testData.poolId); + const timestamp = Date.now() + 3600000; //1 hour from now + try { + await service.calcImpLoss(timestamp, pool); + } catch (e: any) { + expect(e.message).eq( + BalancerError.getMessage(BalancerErrorCode.TIMESTAMP_IN_THE_FUTURE) + ); + } + }); + }); +}); diff --git a/balancer-js/src/modules/pools/impermanentLoss/impermanentLoss.spec.ts b/balancer-js/src/modules/pools/impermanentLoss/impermanentLoss.spec.ts new file mode 100644 index 000000000..d9df1db2d --- /dev/null +++ b/balancer-js/src/modules/pools/impermanentLoss/impermanentLoss.spec.ts @@ -0,0 +1,455 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { BalancerError, BalancerErrorCode } from '@/balancerErrors'; +import { ImpermanentLossService } from '@/modules/pools/impermanentLoss/impermanentLossService'; +import { + MockHistoricalPriceProvider, + MockPriceProvider, +} from '@/test/lib/ImpermanentLossData'; +import { Pool } from '@/types'; +import { expect } from 'chai'; +import dotenv from 'dotenv'; +import { repositores, aaveRates } from '@/test/factories/data'; + +const stubbedRepositores = repositores({}); + +dotenv.config(); + +const mockTokenPriceProvider = new MockPriceProvider( + stubbedRepositores.tokenPrices, + stubbedRepositores.tokenPrices, + aaveRates +); +const mockHistoricalTokenPriceProvider = new MockHistoricalPriceProvider( + stubbedRepositores.tokenPrices, + aaveRates +); + +const service = new ImpermanentLossService( + mockTokenPriceProvider, + mockHistoricalTokenPriceProvider +); + +describe('ImpermanentLossService', () => { + context('service.getWeights', () => { + it('should return uniform distributed weights', async () => { + const poolTokens = [ + { + balance: '20252425.874518101545808004', + address: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + weight: null, + }, + { + balance: '19238580.71904976339020527', + address: '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', + weight: null, + }, + ]; + const weights = service.getWeights(poolTokens); + expect(weights).length(2); + expect(weights[0]).eq(0.5); + expect(weights[1]).eq(0.5); + }); + it('should return proper weights', async () => { + const poolTokens = [ + { + weight: '0.2', + balance: '0.440401496163206405', + address: '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619', + }, + { + weight: '0.8', + balance: '1005938.192755235524459442', + address: '0xe3627374ac4baf5375e79251b0af23afc450fc0e', + }, + ]; + const weights = service.getWeights(poolTokens); + expect(weights).length(2); + expect(weights[0]).eq(0.2); + expect(weights[1]).eq(0.8); + }); + it('should throw error if missing weight', async () => { + const poolTokens = [ + { + weight: null, + balance: '0.440401496163206405', + address: '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619', + }, + { + weight: '0.8', + balance: '1005938.192755235524459442', + address: '0xe3627374ac4baf5375e79251b0af23afc450fc0e', + }, + ]; + try { + service.getWeights(poolTokens); + } catch (e: any) { + expect(e.message).eq( + BalancerError.getMessage(BalancerErrorCode.MISSING_WEIGHT) + ); + } + }); + }); + context('service.getDelta', () => { + it('should return 50% delta variation', async () => { + const delta = service.getDelta(10, 15); + expect(delta).eq(0.5); + }); + it('should return no delta variation', async () => { + const delta = service.getDelta(10, 10); + expect(delta).eq(0); + }); + it('should return negative delta variation', async () => { + const delta = service.getDelta(15, 10); + expect(delta).closeTo(-0.3333, 3); + }); + it('should return negative delta variation', async () => { + const delta = service.getDelta(15, 10); + expect(delta).closeTo(-0.3333, 3); + }); + it('should throw an error for wrong parameter', async () => { + try { + service.getDelta(0, 10); + } catch (e: any) { + expect(e.message).eq( + BalancerError.getMessage(BalancerErrorCode.ILLEGAL_PARAMETER) + ); + } + }); + }); + context('service.getEntryPrices', () => { + it('should return prices for tokens', async () => { + const tokens = [ + '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', + ]; + const prices = await service.getEntryPrices(1666276501, tokens); + expect(prices['0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270']).eq( + 0.9993785272283172 + ); + expect(prices['0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4']).eq( + 1.9996776052990013 + ); + }); + it('should throw error for missing prices', async () => { + const tokens = [ + '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + ]; + try { + await service.getEntryPrices(1666276501, tokens); + } catch (e: any) { + expect(e.message).eq( + BalancerError.getMessage(BalancerErrorCode.MISSING_PRICE_RATE) + ); + } + }); + }); + context('service.getExitPrices', () => { + it('should return exit prices for tokens', async () => { + const poolTokens = [ + { + balance: '20252425.874518101545808004', + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + weight: null, + }, + { + balance: '19238580.71904976339020527', + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + weight: null, + }, + ]; + const prices = await service.getExitPrices(poolTokens); + expect(prices['0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48']).eq(1.002); + expect(prices['0x6b175474e89094c44da98b954eedeac495271d0f']).eq(1.002); + }); + it('should throw error for missing prices', async () => { + const poolTokens = [ + { + balance: '20252425.874518101545808004', + address: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + weight: null, + }, + { + balance: '19238580.71904976339020527', + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + weight: null, + }, + ]; + try { + await service.getExitPrices(poolTokens); + } catch (e: any) { + expect(e.message).eq( + BalancerError.getMessage(BalancerErrorCode.MISSING_PRICE_RATE) + ); + } + }); + }); + context('service.getAssets', () => { + it('should returns a list of assets with deltas and weights', async () => { + const poolTokens = [ + { + balance: '20252425.874518101545808004', + address: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + weight: null, + }, + { + balance: '19238580.71904976339020527', + address: '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', + weight: null, + }, + ]; + const weights = [0.5, 0.5]; + const entryPrices = { + '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270': 10, + '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4': 15, + }; + const exitPrices = { + '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270': 15, + '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4': 10, + }; + const assets = service.getAssets( + poolTokens, + exitPrices, + entryPrices, + weights + ); + expect(assets).length(2); + expect(assets[0].priceDelta).eq(0.5); + expect(assets[1].priceDelta).closeTo(-0.3333, 3); + expect(assets[0].weight).eq(0.5); + expect(assets[1].weight).eq(0.5); + }); + }); + context('service.prepareData', () => { + it('should return a list of assets with proper deltas and weights', async () => { + const poolTokens = [ + { + balance: '20252425.874518101545808004', + address: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + weight: null, + }, + { + balance: '19238580.71904976339020527', + address: '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', + weight: null, + }, + ]; + const pool = { + tokens: poolTokens, + address: '0x8159462d255c1d24915cb51ec361f700174cd994', + } as unknown as Pool; + const assets = await service.prepareData(1666276501, pool); + expect(assets).length(2); + expect(assets[0].priceDelta).eq(0.00262310295874897); + expect(assets[1].priceDelta).eq(-0.49891922710702347); + expect(assets[0].weight).eq(0.5); + expect(assets[1].weight).eq(0.5); + }); + }); + context('service.calculateImpermanentLoss', () => { + context('for uniform distributed tokens', () => { + it('should return proper value for deltas [0.2%, -49.89%]', async () => { + const assets = [ + { + priceDelta: 0.00262310295874897, + weight: 0.5, + }, + { + priceDelta: -0.49891922710702347, + weight: 0.5, + }, + ]; + const poolValueDelta = service.getPoolValueDelta(assets); + const holdValueDelta = service.getHoldValueDelta(assets); + const IL = service.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + expect(IL).eq(5.72); + }); + it('should return proper value for deltas [0%, -49.89%]', async () => { + const assets = [ + { + priceDelta: 0, + weight: 0.5, + }, + { + priceDelta: -0.49891922710702347, + weight: 0.5, + }, + ]; + const poolValueDelta = service.getPoolValueDelta(assets); + const holdValueDelta = service.getHoldValueDelta(assets); + const IL = service.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + expect(IL).eq(5.68); + }); + it('should return proper value for deltas [0%, 50%]', async () => { + const assets = [ + { + priceDelta: 0, + weight: 0.5, + }, + { + priceDelta: 0.5, + weight: 0.5, + }, + ]; + const poolValueDelta = service.getPoolValueDelta(assets); + const holdValueDelta = service.getHoldValueDelta(assets); + const IL = service.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + expect(IL).eq(2.02); + }); + it('should return IL = 0', async () => { + const assets = [ + { + priceDelta: 0.5, + weight: 0.5, + }, + { + priceDelta: 0.5, + weight: 0.5, + }, + ]; + const poolValueDelta = service.getPoolValueDelta(assets); + const holdValueDelta = service.getHoldValueDelta(assets); + const IL = service.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + expect(IL).eq(0); + }); + }); + context('for not uniform distributed tokens', () => { + it('should return proper value for deltas [0.2%, -49.89%]', async () => { + const assets = [ + { + priceDelta: 0.00262310295874897, + weight: 0.8, + }, + { + priceDelta: -0.49891922710702347, + weight: 0.2, + }, + ]; + const poolValueDelta = service.getPoolValueDelta(assets); + const holdValueDelta = service.getHoldValueDelta(assets); + const IL = service.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + expect(IL).eq(3.27); + }); + it('should return proper value for deltas [0%, -49.89%]', async () => { + const assets = [ + { + priceDelta: 0, + weight: 0.8, + }, + { + priceDelta: -0.49891922710702347, + weight: 0.2, + }, + ]; + const poolValueDelta = service.getPoolValueDelta(assets); + const holdValueDelta = service.getHoldValueDelta(assets); + const IL = service.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + expect(IL).eq(3.25); + }); + it('should return proper value for deltas [0%, 50%]', async () => { + const assets = [ + { + priceDelta: 0, + weight: 0.8, + }, + { + priceDelta: 0.5, + weight: 0.2, + }, + ]; + const poolValueDelta = service.getPoolValueDelta(assets); + const holdValueDelta = service.getHoldValueDelta(assets); + const IL = service.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + expect(IL).eq(1.41); + }); + it('should return IL = 0', async () => { + const assets = [ + { + priceDelta: 0.5, + weight: 0.8, + }, + { + priceDelta: 0.5, + weight: 0.2, + }, + ]; + const poolValueDelta = service.getPoolValueDelta(assets); + const holdValueDelta = service.getHoldValueDelta(assets); + const IL = service.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + expect(IL).eq(0); + }); + }); + }); + context('service.calcImpLoss', () => { + it('should throw error for timestamp in the future', async () => { + const poolTokens = [ + { + balance: '20252425.874518101545808004', + address: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + weight: null, + }, + { + balance: '19238580.71904976339020527', + address: '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', + weight: null, + }, + ]; + const pool = { + tokens: poolTokens, + address: '0x8159462d255c1d24915cb51ec361f700174cd994', + } as unknown as Pool; + try { + await service.calcImpLoss(Date.now() + 3600000, pool); + } catch (e: any) { + expect(e.message).eq( + BalancerError.getMessage(BalancerErrorCode.TIMESTAMP_IN_THE_FUTURE) + ); + } + }); + it('should return impermanentLoss', async () => { + const poolTokens = [ + { + balance: '20252425.874518101545808004', + address: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + weight: null, + }, + { + balance: '19238580.71904976339020527', + address: '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', + weight: null, + }, + ]; + const pool = { + tokens: poolTokens, + address: '0x8159462d255c1d24915cb51ec361f700174cd994', + } as unknown as Pool; + const IL = await service.calcImpLoss(1666276501, pool); + expect(IL).eq(5.72); + }); + }); +}); diff --git a/balancer-js/src/modules/pools/impermanentLoss/impermanentLossService.ts b/balancer-js/src/modules/pools/impermanentLoss/impermanentLossService.ts new file mode 100644 index 000000000..aa7b23e67 --- /dev/null +++ b/balancer-js/src/modules/pools/impermanentLoss/impermanentLossService.ts @@ -0,0 +1,233 @@ +/** + * Calculate the Impermanent Loss for a given pool and user. + * + * 1. Prepare the data: + * a. get exit price for pools' tokens + * b. get entry price for pools' tokens + * 2. calculate delta values for tokens in pools + * 3. calculate and return the impermanent loss as percentage rounded to 2 decimal places. + * + */ +import { BalancerError, BalancerErrorCode } from '@/balancerErrors'; +import { Findable, Pool, PoolToken, Price } from '@/types'; + +type Asset = { + priceDelta: number; + weight: number; +}; + +type TokenPrices = { + [key: string]: number; +}; + +export class ImpermanentLossService { + constructor( + private tokenPrices: Findable, + private tokenHistoricalPrices: Findable + ) {} + + /** + * entry point to calculate impermanent loss. + * + * The function will + * - retrieve the tokens' historical value at the desired time in the future + * - calculate the relative variation between current and historical value + * - return the IL in percentage rounded to 2 decimal places + * + * @param timestamp UNIX timestamp from which the IL is desired + * @param pool the pool + * @returns the impermanent loss as percentage rounded to 2 decimal places + */ + async calcImpLoss(timestamp: number, pool: Pool): Promise { + if (timestamp * 1000 >= Date.now()) { + console.error( + `[ImpermanentLossService][calcImpLoss]Error: ${BalancerError.getMessage( + BalancerErrorCode.TIMESTAMP_IN_THE_FUTURE + )}` + ); + throw new BalancerError(BalancerErrorCode.TIMESTAMP_IN_THE_FUTURE); + } + const assets = await this.prepareData(timestamp, pool); + + const poolValueDelta = this.getPoolValueDelta(assets); + const holdValueDelta = this.getHoldValueDelta(assets); + + const impLoss = this.calculateImpermanentLoss( + poolValueDelta, + holdValueDelta + ); + return impLoss; + } + + calculateImpermanentLoss( + poolValueDelta: number, + holdValueDelta: number + ): number { + return ( + Math.floor(Math.abs(poolValueDelta / holdValueDelta - 1) * 100 * 100) / + 100 + ); + } + + getPoolValueDelta(assets: Asset[]): number { + return assets.reduce( + (result, asset) => + result * Math.pow(Math.abs(asset.priceDelta + 1), asset.weight), + 1 + ); + } + + getHoldValueDelta(assets: Asset[]): number { + return assets.reduce( + (result, asset) => result + Math.abs(asset.priceDelta + 1) * asset.weight, + 0 + ); + } + + /** + * prepare the data for calculating the impermanent loss + * + * @param entryTimestamp UNIX timestamp from which the IL is desired + * @param pool the pool + * @returns a list of pair weight/price delta for each token in the pool + * @throws BalancerError if + * 1. a token's price is unknown + * 2. a token's weight is unknown + * 3. the user has no liquidity invested in the pool + */ + async prepareData(entryTimestamp: number, pool: Pool): Promise { + const poolTokens = pool.tokens.filter( + (token) => token.address !== pool.address + ); + + const weights = this.getWeights(poolTokens); + + const tokenAddresses = poolTokens.map((t) => t.address); + + const entryPrices = await this.getEntryPrices( + entryTimestamp, + tokenAddresses + ); + const exitPrices: TokenPrices = await this.getExitPrices(poolTokens); + + return this.getAssets(poolTokens, exitPrices, entryPrices, weights); + } + + getAssets( + poolTokens: PoolToken[], + exitPrices: TokenPrices, + entryPrices: TokenPrices, + weights: number[] + ): Asset[] { + return poolTokens.map((token, i) => ({ + priceDelta: this.getDelta( + entryPrices[token.address], + exitPrices[token.address] + ), + weight: weights[i], + })); + } + + getDelta(entryPrice: number, exitPrice: number): number { + if (entryPrice === 0) { + console.error( + `[ImpermanentLossService][getDelta]Error: ${BalancerError.getMessage( + BalancerErrorCode.ILLEGAL_PARAMETER + )}: entry price is 0` + ); + throw new BalancerError(BalancerErrorCode.ILLEGAL_PARAMETER); + } + return (exitPrice - entryPrice) / entryPrice; + } + + /** + * returns the list of token's weights. + * + * @param poolTokens the pools' tokens + * @returns the list of token's weights + * @throws BalancerError if a token's weight is missing + * + */ + getWeights(poolTokens: PoolToken[]): number[] { + const noWeights = poolTokens.every((token) => !token.weight); + const uniformWeight = Math.round((1 / poolTokens.length) * 100) / 100; + const weights: number[] = noWeights + ? poolTokens.map(() => uniformWeight) // if no weight is returned we assume the tokens are balanced uniformly in the pool + : poolTokens.map((token) => Number(token.weight ?? 0)); + + if (weights.some((w) => w === 0)) { + console.error( + `[ImpermanentLossService][getWeights]Error: ${BalancerError.getMessage( + BalancerErrorCode.MISSING_WEIGHT + )}` + ); + throw new BalancerError(BalancerErrorCode.MISSING_WEIGHT); + } + return weights; + } + + /** + * get the current's tokens' prices + * @param tokens the pools' tokens + * @returns a list of tokens with prices + */ + async getExitPrices(tokens: PoolToken[]): Promise { + const prices = await Promise.all( + tokens.map((token) => this.tokenPrices.find(token.address)) + ).catch(() => []); + + if (!prices.length || prices.some((price) => price?.usd === undefined)) { + console.error( + `[ImpermanentLossService][getExitPrices]Error: ${BalancerError.getMessage( + BalancerErrorCode.MISSING_PRICE_RATE + )}` + ); + throw new BalancerError(BalancerErrorCode.MISSING_PRICE_RATE); + } + + const tokensWithPrice = tokens.map((token, i) => ({ + ...token, + price: prices[i], + })); + + const tokenPrices: TokenPrices = {}; + for (const token of tokensWithPrice) { + if (token.price?.usd) tokenPrices[token.address] = +token.price.usd; // price.usd is never undefined but JS complains + } + return tokenPrices; + } + + /** + * get the tokens' price at a given time + * + * @param timestamp the Unix timestamp + * @param tokenAddresses the tokens' addresses + * @returns a map of tokens' price + */ + async getEntryPrices( + timestamp: number, + tokenAddresses: string[] + ): Promise { + const prices: TokenPrices = {}; + for (const address of tokenAddresses) { + const price = await this.tokenHistoricalPrices + .findBy(address, timestamp) + .catch((reason) => { + console.error( + `[ImpermanentLossService][getEntryPrices]Error: ${reason.message}` + ); + return undefined; + }); + if (!price?.usd) { + console.error( + `[ImpermanentLossService][getEntryPrices]Error: ${BalancerError.getMessage( + BalancerErrorCode.MISSING_PRICE_RATE + )}` + ); + throw new BalancerError(BalancerErrorCode.MISSING_PRICE_RATE); + } + prices[address] = +price.usd; + } + return prices; + } +} diff --git a/balancer-js/src/modules/pools/index.ts b/balancer-js/src/modules/pools/index.ts index ee65a078a..24a87cf07 100644 --- a/balancer-js/src/modules/pools/index.ts +++ b/balancer-js/src/modules/pools/index.ts @@ -1,3 +1,4 @@ +import { ImpermanentLossService } from '@/modules/pools/impermanentLoss/impermanentLossService'; import type { BalancerNetworkConfig, BalancerDataRepositories, @@ -12,6 +13,8 @@ import { JoinPoolAttributes } from './pool-types/concerns/types'; import { PoolTypeConcerns } from './pool-type-concerns'; import { PoolApr } from './apr/apr'; import { Liquidity } from '../liquidity/liquidity.module'; +import { Join } from '../joins/joins.module'; +import { Exit } from '../exits/exits.module'; import { PoolVolume } from './volume/volume'; import { PoolFees } from './fees/fees'; @@ -21,8 +24,11 @@ import { PoolFees } from './fees/fees'; export class Pools implements Findable { aprService; liquidityService; + joinService; + exitService; feesService; volumeService; + impermanentLossService; constructor( private networkConfig: BalancerNetworkConfig, @@ -42,8 +48,14 @@ export class Pools implements Findable { repositories.pools, repositories.tokenPrices ); + this.joinService = new Join(this.repositories.pools, networkConfig); + this.exitService = new Exit(this.repositories.pools, networkConfig); this.feesService = new PoolFees(repositories.yesterdaysPools); this.volumeService = new PoolVolume(repositories.yesterdaysPools); + this.impermanentLossService = new ImpermanentLossService( + repositories.tokenPrices, + repositories.tokenHistoricalPrices + ); } dataSource(): Findable & Searchable { @@ -61,6 +73,17 @@ export class Pools implements Findable { return this.aprService.apr(pool); } + /** + * Calculates Impermanent Loss on any pool data + * + * @param timestamp + * @param pool + * @returns + */ + async impermanentLoss(timestamp: number, pool: Pool): Promise { + return this.impermanentLossService.calcImpLoss(timestamp, pool); + } + /** * Calculates total liquidity of the pool * @@ -71,6 +94,77 @@ export class Pools implements Findable { return this.liquidityService.getLiquidity(pool); } + /** + * Builds generalised join transaction + * + * @param poolId Pool id + * @param tokens Token addresses + * @param amounts Token amounts in EVM scale + * @param userAddress User address + * @param wrapMainTokens Indicates whether main tokens should be wrapped before being used + * @param slippage Maximum slippage tolerance in bps i.e. 50 = 0.5%. + * @param authorisation Optional auhtorisation call to be added to the chained transaction + * @returns transaction data ready to be sent to the network along with min and expected BPT amounts out. + */ + async generalisedJoin( + poolId: string, + tokens: string[], + amounts: string[], + userAddress: string, + wrapMainTokens: boolean, + slippage: string, + authorisation?: string + ): Promise<{ + to: string; + callData: string; + minOut: string; + expectedOut: string; + priceImpact: string; + }> { + return this.joinService.joinPool( + poolId, + tokens, + amounts, + userAddress, + wrapMainTokens, + slippage, + authorisation + ); + } + + /** + * Builds generalised exit transaction + * + * @param poolId Pool id + * @param amount Token amount in EVM scale + * @param userAddress User address + * @param slippage Maximum slippage tolerance in bps i.e. 50 = 0.5%. + * @param authorisation Optional auhtorisation call to be added to the chained transaction + * @returns transaction data ready to be sent to the network along with tokens, min and expected amounts out. + */ + async generalisedExit( + poolId: string, + amount: string, + userAddress: string, + slippage: string, + authorisation?: string + ): Promise<{ + to: string; + callData: string; + tokensOut: string[]; + expectedAmountsOut: string[]; + minAmountsOut: string[]; + priceImpact: string; + }> { + return this.exitService.exitPool( + poolId, + amount, + userAddress, + slippage, + authorisation + ); + } + /** * Calculates total fees for the pool in the last 24 hours * @@ -115,11 +209,16 @@ export class Pools implements Findable { wrappedNativeAsset, }); }, - calcPriceImpact: async (amountsIn: string[], minBPTOut: string) => + calcPriceImpact: async ( + amountsIn: string[], + minBPTOut: string, + isJoin: boolean + ) => methods.priceImpactCalculator.calcPriceImpact( pool, amountsIn, - minBPTOut + minBPTOut, + isJoin ), buildExitExactBPTIn: ( exiter, @@ -155,8 +254,13 @@ export class Pools implements Findable { // either we refetch or it needs a type transformation from SDK internal to SOR (subgraph) // spotPrice: async (tokenIn: string, tokenOut: string) => // methods.spotPriceCalculator.calcPoolSpotPrice(tokenIn, tokenOut, data), - calcSpotPrice: (tokenIn: string, tokenOut: string) => - methods.spotPriceCalculator.calcPoolSpotPrice(tokenIn, tokenOut, pool), + calcSpotPrice: (tokenIn: string, tokenOut: string, isDefault?: boolean) => + methods.spotPriceCalculator.calcPoolSpotPrice( + tokenIn, + tokenOut, + pool, + isDefault + ), }; } diff --git a/balancer-js/src/modules/pools/pool-types/composableStable.module.ts b/balancer-js/src/modules/pools/pool-types/composableStable.module.ts index 876eae710..70a34ea21 100644 --- a/balancer-js/src/modules/pools/pool-types/composableStable.module.ts +++ b/balancer-js/src/modules/pools/pool-types/composableStable.module.ts @@ -1,7 +1,7 @@ -import { ComposableStablePoolJoin } from './concerns/composableStable/join.concern'; import { StablePoolLiquidity } from './concerns/stable/liquidity.concern'; -import { StablePoolSpotPrice } from './concerns/stable/spotPrice.concern'; -import { StablePoolPriceImpact } from './concerns/stable/priceImpact.concern'; +import { PhantomStablePoolSpotPrice } from './concerns/stablePhantom/spotPrice.concern'; +import { StablePhantomPriceImpact } from './concerns/stablePhantom/priceImpact.concern'; +import { ComposableStablePoolJoin } from './concerns/composableStable/join.concern'; import { ComposableStablePoolExit } from './concerns/composableStable/exit.concern'; import { PoolType } from './pool-type.interface'; import { @@ -15,9 +15,9 @@ import { export class ComposableStable implements PoolType { constructor( public exit: ExitConcern = new ComposableStablePoolExit(), - public join: JoinConcern = new ComposableStablePoolJoin(), public liquidity: LiquidityConcern = new StablePoolLiquidity(), - public spotPriceCalculator: SpotPriceConcern = new StablePoolSpotPrice(), - public priceImpactCalculator: PriceImpactConcern = new StablePoolPriceImpact() + public spotPriceCalculator: SpotPriceConcern = new PhantomStablePoolSpotPrice(), + public priceImpactCalculator: PriceImpactConcern = new StablePhantomPriceImpact(), + public join: JoinConcern = new ComposableStablePoolJoin() ) {} } diff --git a/balancer-js/src/modules/pools/pool-types/concerns/linear/spotPrice.concern.ts b/balancer-js/src/modules/pools/pool-types/concerns/linear/spotPrice.concern.ts index 0848123db..8ff606a9e 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/linear/spotPrice.concern.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/linear/spotPrice.concern.ts @@ -3,11 +3,19 @@ import { SubgraphPoolBase, LinearPool, ZERO } from '@balancer-labs/sor'; import { Pool } from '@/types'; export class LinearPoolSpotPrice implements SpotPriceConcern { - calcPoolSpotPrice(tokenIn: string, tokenOut: string, pool: Pool): string { + calcPoolSpotPrice( + tokenIn: string, + tokenOut: string, + pool: Pool, + isDefault = false + ): string { const linearPool = LinearPool.fromPool(pool as SubgraphPoolBase); - const poolPairData = linearPool.parsePoolPairData(tokenIn, tokenOut); - return linearPool - ._spotPriceAfterSwapExactTokenInForTokenOut(poolPairData, ZERO) - .toString(); + if (isDefault) return '1'; + else { + const poolPairData = linearPool.parsePoolPairData(tokenIn, tokenOut); + return linearPool + ._spotPriceAfterSwapExactTokenInForTokenOut(poolPairData, ZERO) + .toString(); + } } } diff --git a/balancer-js/src/modules/pools/pool-types/concerns/metaStable/join.concern.integration.spec.ts b/balancer-js/src/modules/pools/pool-types/concerns/metaStable/join.concern.integration.spec.ts index d4a8ce8b6..8fdf7b5a8 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/metaStable/join.concern.integration.spec.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/metaStable/join.concern.integration.spec.ts @@ -117,7 +117,8 @@ describe('join execution', async () => { const minBPTOut = bptMinBalanceIncrease.toString(); const priceImpact = await controller.calcPriceImpact( amountsIn, - minBPTOut + minBPTOut, + true ); expect(priceImpact).to.eql('100000000010000'); }); diff --git a/balancer-js/src/modules/pools/pool-types/concerns/metaStable/priceImpact.concern.ts b/balancer-js/src/modules/pools/pool-types/concerns/metaStable/priceImpact.concern.ts index a5a845d78..6e23b5b26 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/metaStable/priceImpact.concern.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/metaStable/priceImpact.concern.ts @@ -76,12 +76,17 @@ export class MetaStablePoolPriceImpact implements PriceImpactConcern { calcPriceImpact( pool: Pool, tokenAmounts: string[], - bptAmount: string + bptAmount: string, + isJoin: boolean ): string { const bptZeroPriceImpact = this.bptZeroPriceImpact( pool, tokenAmounts.map((a) => BigInt(a)) ); - return calcPriceImpact(BigInt(bptAmount), bptZeroPriceImpact).toString(); + return calcPriceImpact( + BigInt(bptAmount), + bptZeroPriceImpact, + isJoin + ).toString(); } } diff --git a/balancer-js/src/modules/pools/pool-types/concerns/metaStable/priceImpact.spec.ts b/balancer-js/src/modules/pools/pool-types/concerns/metaStable/priceImpact.spec.ts index 3a98513e0..437192fdd 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/metaStable/priceImpact.spec.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/metaStable/priceImpact.spec.ts @@ -47,7 +47,8 @@ describe('metastable pool price impact', () => { const priceImpact = priceImpactCalc.calcPriceImpact( pool, tokenAmounts.map((amount) => amount.toString()), - '660816325116386208862285' + '660816325116386208862285', + true ); expect(priceImpact.toString()).to.eq('3017427187914862'); }); diff --git a/balancer-js/src/modules/pools/pool-types/concerns/stable/join.concern.integration.spec.ts b/balancer-js/src/modules/pools/pool-types/concerns/stable/join.concern.integration.spec.ts index aeabe9c48..7a15dc52a 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/stable/join.concern.integration.spec.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/stable/join.concern.integration.spec.ts @@ -121,7 +121,8 @@ describe('join execution', async () => { const minBPTOut = bptMinBalanceIncrease.toString(); const priceImpact = await controller.calcPriceImpact( amountsIn, - minBPTOut + minBPTOut, + true ); expect(priceImpact).to.eql('100000444261607'); }); diff --git a/balancer-js/src/modules/pools/pool-types/concerns/stable/priceImpact.concern.ts b/balancer-js/src/modules/pools/pool-types/concerns/stable/priceImpact.concern.ts index c0a4ac7c7..32c99e5a9 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/stable/priceImpact.concern.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/stable/priceImpact.concern.ts @@ -61,12 +61,17 @@ export class StablePoolPriceImpact implements PriceImpactConcern { calcPriceImpact( pool: Pool, tokenAmounts: string[], - bptAmount: string + bptAmount: string, + isJoin: boolean ): string { const bptZeroPriceImpact = this.bptZeroPriceImpact( pool, tokenAmounts.map((a) => BigInt(a)) ); - return calcPriceImpact(BigInt(bptAmount), bptZeroPriceImpact).toString(); + return calcPriceImpact( + BigInt(bptAmount), + bptZeroPriceImpact, + isJoin + ).toString(); } } diff --git a/balancer-js/src/modules/pools/pool-types/concerns/stable/priceImpact.spec.ts b/balancer-js/src/modules/pools/pool-types/concerns/stable/priceImpact.spec.ts index 4cb5246aa..e88f1f298 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/stable/priceImpact.spec.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/stable/priceImpact.spec.ts @@ -49,7 +49,8 @@ describe('stable pool price impact', () => { const priceImpact = priceImpactCalc.calcPriceImpact( pool, tokenAmounts, - '109598303041827170846' + '109598303041827170846', + true // this not the actual bptAmount that would result // but it is still useful for testing purposes ); diff --git a/balancer-js/src/modules/pools/pool-types/concerns/stablePhantom/priceImpact.concern.ts b/balancer-js/src/modules/pools/pool-types/concerns/stablePhantom/priceImpact.concern.ts index b65eb66b4..78eaff3d0 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/stablePhantom/priceImpact.concern.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/stablePhantom/priceImpact.concern.ts @@ -83,12 +83,17 @@ export class StablePhantomPriceImpact implements PriceImpactConcern { calcPriceImpact( pool: Pool, tokenAmounts: string[], - bptAmount: string + bptAmount: string, + isJoin: boolean ): string { const bptZeroPriceImpact = this.bptZeroPriceImpact( pool, tokenAmounts.map((a) => BigInt(a)) ); - return calcPriceImpact(BigInt(bptAmount), bptZeroPriceImpact).toString(); + return calcPriceImpact( + BigInt(bptAmount), + bptZeroPriceImpact, + isJoin + ).toString(); } } diff --git a/balancer-js/src/modules/pools/pool-types/concerns/stablePhantom/priceImpact.spec.ts b/balancer-js/src/modules/pools/pool-types/concerns/stablePhantom/priceImpact.spec.ts index 293ce673d..e7ca2c576 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/stablePhantom/priceImpact.spec.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/stablePhantom/priceImpact.spec.ts @@ -48,7 +48,8 @@ describe('phantomStable pool price impact', () => { const priceImpact = priceImpactCalc.calcPriceImpact( pool, tokenAmounts.map((amount) => amount.toString()), - '6300741387055771004078' + '6300741387055771004078', + true ); expect(priceImpact.toString()).to.eq('1584599872926409'); }); diff --git a/balancer-js/src/modules/pools/pool-types/concerns/types.ts b/balancer-js/src/modules/pools/pool-types/concerns/types.ts index d7f02e6b3..abcc52bab 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/types.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/types.ts @@ -7,7 +7,12 @@ export interface LiquidityConcern { } export interface SpotPriceConcern { - calcPoolSpotPrice: (tokenIn: string, tokenOut: string, pool: Pool) => string; + calcPoolSpotPrice: ( + tokenIn: string, + tokenOut: string, + pool: Pool, + isDefault?: boolean + ) => string; } export interface PriceImpactConcern { @@ -15,7 +20,8 @@ export interface PriceImpactConcern { calcPriceImpact: ( pool: Pool, tokenAmounts: string[], - bptAmount: string + bptAmount: string, + isJoin: boolean ) => string; } diff --git a/balancer-js/src/modules/pools/pool-types/concerns/weighted/join.concern.integration.spec.ts b/balancer-js/src/modules/pools/pool-types/concerns/weighted/join.concern.integration.spec.ts index e54748587..e3ad383a6 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/weighted/join.concern.integration.spec.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/weighted/join.concern.integration.spec.ts @@ -119,7 +119,8 @@ describe('join execution', async () => { const minBPTOut = bptMinBalanceIncrease.toString(); const priceImpact = await controller.calcPriceImpact( amountsIn, - minBPTOut + minBPTOut, + true ); expect(priceImpact).to.eq('102055375201527'); }); @@ -138,59 +139,6 @@ describe('join execution', async () => { }); }); - context('join transaction - join with params', () => { - before(async function () { - this.timeout(20000); - - amountsIn = tokensIn.map((t) => - parseFixed(t.balance, t.decimals).div(amountsInDiv).toString() - ); - - [bptBalanceBefore, ...tokensBalanceBefore] = await getBalances( - [pool.address, ...pool.tokensList], - signer, - signerAddress - ); - - const slippage = '100'; - const { functionName, attributes, value, minBPTOut } = - controller.buildJoin( - signerAddress, - tokensIn.map((t) => t.address), - amountsIn, - slippage - ); - const transactionResponse = await sdk.contracts.vault - .connect(signer) - [functionName](...Object.values(attributes), { value }); - transactionReceipt = await transactionResponse.wait(); - - bptMinBalanceIncrease = BigNumber.from(minBPTOut); - [bptBalanceAfter, ...tokensBalanceAfter] = await getBalances( - [pool.address, ...pool.tokensList], - signer, - signerAddress - ); - }); - - it('should work', async () => { - expect(transactionReceipt.status).to.eql(1); - }); - - it('should increase BPT balance', async () => { - expect(bptBalanceAfter.sub(bptBalanceBefore).gte(bptMinBalanceIncrease)) - .to.be.true; - }); - - it('should decrease tokens balance', async () => { - for (let i = 0; i < tokensIn.length; i++) { - expect( - tokensBalanceBefore[i].sub(tokensBalanceAfter[i]).toString() - ).to.equal(amountsIn[i]); - } - }); - }); - context('join transaction - join with ETH', () => { let transactionCost: BigNumber; before(async function () { diff --git a/balancer-js/src/modules/pools/pool-types/concerns/weighted/liquidity.concern.ts b/balancer-js/src/modules/pools/pool-types/concerns/weighted/liquidity.concern.ts index 466cbc6a9..ce7e9604a 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/weighted/liquidity.concern.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/weighted/liquidity.concern.ts @@ -16,7 +16,14 @@ export class WeightedPoolLiquidity implements LiquidityConcern { continue; } - const price = parseFixed(token.price.usd.toString(), SCALING_FACTOR); + let price: BigNumber; + if (parseFloat(token.price.usd) < 1) { + price = parseFixed(parseFloat(token.price.usd).toFixed(10), 10).mul( + 1e8 + ); + } else { + price = parseFixed(token.price.usd, SCALING_FACTOR); + } const balance = parseFixed(token.balance, SCALING_FACTOR); const weight = parseFixed(token.weight || '0', SCALING_FACTOR); diff --git a/balancer-js/src/modules/pools/pool-types/concerns/weighted/priceImpact.concern.ts b/balancer-js/src/modules/pools/pool-types/concerns/weighted/priceImpact.concern.ts index d73db42ef..bc9984fe5 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/weighted/priceImpact.concern.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/weighted/priceImpact.concern.ts @@ -57,12 +57,17 @@ export class WeightedPoolPriceImpact implements PriceImpactConcern { calcPriceImpact( pool: Pool, tokenAmounts: string[], - bptAmount: string + bptAmount: string, + isJoin: boolean ): string { const bptZeroPriceImpact = this.bptZeroPriceImpact( pool, tokenAmounts.map((a) => BigInt(a)) ); - return calcPriceImpact(BigInt(bptAmount), bptZeroPriceImpact).toString(); + return calcPriceImpact( + BigInt(bptAmount), + bptZeroPriceImpact, + isJoin + ).toString(); } } diff --git a/balancer-js/src/modules/pools/pool-types/concerns/weighted/spotPrice.concern.ts b/balancer-js/src/modules/pools/pool-types/concerns/weighted/spotPrice.concern.ts index 6c0580a13..27c037be4 100644 --- a/balancer-js/src/modules/pools/pool-types/concerns/weighted/spotPrice.concern.ts +++ b/balancer-js/src/modules/pools/pool-types/concerns/weighted/spotPrice.concern.ts @@ -1,13 +1,35 @@ import { SpotPriceConcern } from '../types'; -import { SubgraphPoolBase, WeightedPool, ZERO } from '@balancer-labs/sor'; +import { + SubgraphPoolBase, + WeightedPool, + ZERO, + SubgraphToken, +} from '@balancer-labs/sor'; import { Pool } from '@/types'; export class WeightedPoolSpotPrice implements SpotPriceConcern { calcPoolSpotPrice(tokenIn: string, tokenOut: string, pool: Pool): string { + const isBPTAsToken = tokenIn === pool.address || tokenOut === pool.address; + if (isBPTAsToken) { + const bptAsToken: SubgraphToken = { + address: pool.address, + balance: pool.totalShares, + decimals: 18, + priceRate: '1', + weight: '0', + }; + pool.tokens.push(bptAsToken); + pool.tokensList.push(pool.address); + } const weightedPool = WeightedPool.fromPool(pool as SubgraphPoolBase); const poolPairData = weightedPool.parsePoolPairData(tokenIn, tokenOut); - return weightedPool + const spotPrice = weightedPool ._spotPriceAfterSwapExactTokenInForTokenOut(poolPairData, ZERO) .toString(); + if (isBPTAsToken) { + pool.tokens.pop(); + pool.tokensList.pop(); + } + return spotPrice; } } diff --git a/balancer-js/src/modules/pricing/priceImpact.spec.ts b/balancer-js/src/modules/pricing/priceImpact.spec.ts index beceae4d1..fb3a02a72 100644 --- a/balancer-js/src/modules/pricing/priceImpact.spec.ts +++ b/balancer-js/src/modules/pricing/priceImpact.spec.ts @@ -6,12 +6,12 @@ dotenv.config(); describe('priceImpact', () => { it('zero price impact', async () => { - const priceImpact = calcPriceImpact(BigInt(1e18), BigInt(1e18)); + const priceImpact = calcPriceImpact(BigInt(1e18), BigInt(1e18), true); expect(priceImpact.toString()).to.eq('0'); }); it('50% price impact', async () => { - const priceImpact = calcPriceImpact(BigInt(1e18), BigInt(2e18)); + const priceImpact = calcPriceImpact(BigInt(1e18), BigInt(2e18), true); expect(priceImpact.toString()).to.eq('500000000000000000'); }); diff --git a/balancer-js/src/modules/pricing/priceImpact.ts b/balancer-js/src/modules/pricing/priceImpact.ts index 2117def03..d28c125a1 100644 --- a/balancer-js/src/modules/pricing/priceImpact.ts +++ b/balancer-js/src/modules/pricing/priceImpact.ts @@ -1,9 +1,25 @@ import { ONE, SolidityMaths } from '@/lib/utils/solidityMaths'; export function calcPriceImpact( + bptAmount: bigint, + bptZeroPriceImpact: bigint, + isJoin: boolean +): bigint { + if (isJoin) return calcPriceImpactJoin(bptAmount, bptZeroPriceImpact); + else return calcPriceImpactExit(bptAmount, bptZeroPriceImpact); +} + +function calcPriceImpactJoin( bptAmount: bigint, bptZeroPriceImpact: bigint ): bigint { // 1 - (bptAmount/bptZeroPI) return ONE - SolidityMaths.divDownFixed(bptAmount, bptZeroPriceImpact); } +function calcPriceImpactExit( + bptAmount: bigint, + bptZeroPriceImpact: bigint +): bigint { + // (bptAmount/bptZeroPI) - 1 + return SolidityMaths.divDownFixed(bptAmount, bptZeroPriceImpact) - ONE; +} diff --git a/balancer-js/src/modules/relayer/relayer.module.ts b/balancer-js/src/modules/relayer/relayer.module.ts index 172cc7062..9cd73cb88 100644 --- a/balancer-js/src/modules/relayer/relayer.module.ts +++ b/balancer-js/src/modules/relayer/relayer.module.ts @@ -1,19 +1,28 @@ +import { JsonRpcSigner } from '@ethersproject/providers'; import { BigNumberish, BigNumber } from '@ethersproject/bignumber'; import { Interface } from '@ethersproject/abi'; import { MaxUint256, WeiPerEther, Zero } from '@ethersproject/constants'; +import { Vault } from '@balancer-labs/typechain'; import { Swaps } from '@/modules/swaps/swaps.module'; import { BalancerError, BalancerErrorCode } from '@/balancerErrors'; import { EncodeBatchSwapInput, + EncodeWrapAaveDynamicTokenInput, EncodeUnwrapAaveStaticTokenInput, OutputReference, EncodeExitPoolInput, + EncodeJoinPoolInput, ExitAndBatchSwapInput, ExitPoolData, - EncodeJoinPoolInput, + JoinPoolData, } from './types'; -import { TransactionData, ExitPoolRequest, BalancerSdkConfig } from '@/types'; +import { + TransactionData, + ExitPoolRequest, + JoinPoolRequest, + BalancerSdkConfig, +} from '@/types'; import { SwapType, FundManagement, @@ -21,14 +30,14 @@ import { FetchPoolsInput, } from '../swaps/types'; import { SubgraphPoolBase } from '@balancer-labs/sor'; +import { RelayerAuthorization } from '@/lib/utils'; import relayerLibraryAbi from '@/lib/abi/BatchRelayerLibrary.json'; -import aaveWrappingAbi from '@/lib/abi/AaveWrapping.json'; - -const relayerLibrary = new Interface(relayerLibraryAbi); export * from './types'; +const relayerLibrary = new Interface(relayerLibraryAbi); + export class Relayer { private readonly swaps: Swaps; @@ -43,6 +52,20 @@ export class Relayer { } } + /** + * Returns true if `amount` is not actually an amount, but rather a chained reference. + */ + static isChainedReference(amount: string): boolean { + const amountBn = BigNumber.from(amount); + const mask = BigNumber.from( + '0xfff0000000000000000000000000000000000000000000000000000000000000' + ); + const readonly = + '0xba10000000000000000000000000000000000000000000000000000000000000'; + const check = amountBn.toBigInt() & mask.toBigInt(); + return readonly === BigNumber.from(check)._hex.toString(); + } + static encodeApproveVault(tokenAddress: string, maxAmount: string): string { return relayerLibrary.encodeFunctionData('approveVault', [ tokenAddress, @@ -126,12 +149,23 @@ export class Relayer { ]); } + static encodeWrapAaveDynamicToken( + params: EncodeWrapAaveDynamicTokenInput + ): string { + return relayerLibrary.encodeFunctionData('wrapAaveDynamicToken', [ + params.staticToken, + params.sender, + params.recipient, + params.amount, + params.fromUnderlying, + params.outputReference, + ]); + } + static encodeUnwrapAaveStaticToken( params: EncodeUnwrapAaveStaticTokenInput ): string { - const aaveWrappingLibrary = new Interface(aaveWrappingAbi); - - return aaveWrappingLibrary.encodeFunctionData('unwrapAaveStaticToken', [ + return relayerLibrary.encodeFunctionData('unwrapAaveStaticToken', [ params.staticToken, params.sender, params.recipient, @@ -141,6 +175,12 @@ export class Relayer { ]); } + static encodePeekChainedReferenceValue(reference: BigNumberish): string { + return relayerLibrary.encodeFunctionData('peekChainedReferenceValue', [ + reference, + ]); + } + static toChainedReference(key: BigNumberish, isTemporary = true): BigNumber { const prefix = isTemporary ? Relayer.CHAINED_REFERENCE_TEMP_PREFIX @@ -192,8 +232,38 @@ export class Relayer { return exitEncoded; } - static constructJoinCall(params: EncodeJoinPoolInput): string { - const joinEncoded = Relayer.encodeJoinPool(params); + static constructJoinCall(params: JoinPoolData): string { + const { + assets, + maxAmountsIn, + userData, + fromInternalBalance, + poolId, + kind, + sender, + recipient, + value, + outputReference, + } = params; + + const joinPoolRequest: JoinPoolRequest = { + assets, + maxAmountsIn, + userData, + fromInternalBalance, + }; + + const joinPoolInput: EncodeJoinPoolInput = { + poolId, + kind, + sender, + recipient, + value, + outputReference, + joinPoolRequest, + }; + + const joinEncoded = Relayer.encodeJoinPool(joinPoolInput); return joinEncoded; } @@ -558,7 +628,35 @@ export class Relayer { value: '0', outputReferences: outputReferences, }); - return [encodedBatchSwap, ...unwrapCalls]; } + + static signRelayerApproval = async ( + relayerAddress: string, + signerAddress: string, + signer: JsonRpcSigner, + vault: Vault + ): Promise => { + const approval = vault.interface.encodeFunctionData('setRelayerApproval', [ + signerAddress, + relayerAddress, + true, + ]); + + const signature = + await RelayerAuthorization.signSetRelayerApprovalAuthorization( + vault, + signer, + relayerAddress, + approval + ); + + const calldata = RelayerAuthorization.encodeCalldataAuthorization( + '0x', + MaxUint256, + signature + ); + + return calldata; + }; } diff --git a/balancer-js/src/modules/relayer/types.ts b/balancer-js/src/modules/relayer/types.ts index fd71d64fb..faa983c42 100644 --- a/balancer-js/src/modules/relayer/types.ts +++ b/balancer-js/src/modules/relayer/types.ts @@ -43,6 +43,15 @@ export interface EncodeJoinPoolInput { outputReference: string; } +export interface EncodeWrapAaveDynamicTokenInput { + staticToken: string; + sender: string; + recipient: string; + amount: BigNumberish; + fromUnderlying: boolean; + outputReference: BigNumberish; +} + export interface EncodeUnwrapAaveStaticTokenInput { staticToken: string; sender: string; @@ -65,3 +74,4 @@ export interface ExitAndBatchSwapInput { } export type ExitPoolData = ExitPoolRequest & EncodeExitPoolInput; +export type JoinPoolData = JoinPoolRequest & EncodeJoinPoolInput; diff --git a/balancer-js/src/modules/sdk.helpers.ts b/balancer-js/src/modules/sdk.helpers.ts index 842e22efb..81e55ee71 100644 --- a/balancer-js/src/modules/sdk.helpers.ts +++ b/balancer-js/src/modules/sdk.helpers.ts @@ -12,6 +12,7 @@ export function getNetworkConfig( ...networkConfig.urls, subgraph: config.customSubgraphUrl ?? networkConfig.urls.subgraph, }, + tenderly: config.tenderly, }; } @@ -21,5 +22,6 @@ export function getNetworkConfig( ...config.network.urls, subgraph: config.customSubgraphUrl ?? config.network.urls.subgraph, }, + tenderly: config.network.tenderly, }; } diff --git a/balancer-js/src/modules/subgraph/balancer-v2/Pools.graphql b/balancer-js/src/modules/subgraph/balancer-v2/Pools.graphql index f9506a243..1fa6b8b92 100644 --- a/balancer-js/src/modules/subgraph/balancer-v2/Pools.graphql +++ b/balancer-js/src/modules/subgraph/balancer-v2/Pools.graphql @@ -114,6 +114,9 @@ fragment SubgraphPool on Pool { holdersCount tokensList amp + priceRateProviders(first: 100) { + ...SubgraphPriceRateProvider + } expiryTime unitSeconds createTime @@ -167,12 +170,68 @@ fragment SubgraphPoolToken on PoolToken { priceRate isExemptFromYieldProtocolFee token { + ...TokenTree + } +} + + +fragment SubgraphSubPoolToken on PoolToken { + address + balance + weight + priceRate + symbol + decimals + isExemptFromYieldProtocolFee +} + +fragment TokenAttrs on Token { + address + symbol + decimals +} + +fragment SubgraphSubPool on Pool { + id + totalShares + address + poolType + mainIndex +} + +fragment TokenTree on Token { + latestUSDPrice + pool { + ...SubgraphSubPool + tokens { + ...SubgraphSubPoolToken + token { + latestUSDPrice pool { - poolType + ...SubgraphSubPool + tokens { + ...SubgraphSubPoolToken + token { + latestUSDPrice + pool { + ...SubgraphSubPool + } + } + } } + } + } + } +} + +fragment SubgraphPriceRateProvider on PriceRateProvider { + address, + token { + address } } + query PoolHistoricalLiquidities( $skip: Int $first: Int diff --git a/balancer-js/src/modules/subgraph/examples/pool-joinExit.ts b/balancer-js/src/modules/subgraph/examples/pool-joinExit.ts new file mode 100644 index 000000000..9b3bb12a0 --- /dev/null +++ b/balancer-js/src/modules/subgraph/examples/pool-joinExit.ts @@ -0,0 +1,24 @@ +import dotenv from "dotenv"; +import {createSubgraphClient} from "@/modules/subgraph/subgraph"; + +dotenv.config(); + +(async function() { + + const POOL_ID = '0x0297e37f1873d2dab4487aa67cd56b58e2f27875000100000000000000000002' + const subgraph_url = "https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-polygon-v2" + const client = createSubgraphClient(`${subgraph_url}`); + + const poolQuery = await client.Pool({ id: POOL_ID}); + console.log(`${poolQuery.pool?.tokens?.map((token) => `${token.symbol}\t${token.weight}`).join("\n")}`) + let result = await client.JoinExits({ where: { pool: POOL_ID } }); + + const userId = result.joinExits.sort((a, b) => a.timestamp - b.timestamp)[0].user.id; + console.log(`${userId}`) + result = await client.JoinExits({ where: { sender: userId, pool: POOL_ID } }); + result.joinExits.sort((a, b) => a.timestamp - b.timestamp).forEach((item) => console.log(`${item.id}\t${new Date(item.timestamp * 1000).toLocaleString()}\t${item.type}\t${item.amounts}`)) + + +})(); + +// npm run examples:run -- ./src/modules/subgraph/examples/pool-joinExit.ts \ No newline at end of file diff --git a/balancer-js/src/modules/subgraph/generated/balancer-subgraph-schema.graphql b/balancer-js/src/modules/subgraph/generated/balancer-subgraph-schema.graphql index a9aec0379..eb1d9bbd4 100644 --- a/balancer-js/src/modules/subgraph/generated/balancer-subgraph-schema.graphql +++ b/balancer-js/src/modules/subgraph/generated/balancer-subgraph-schema.graphql @@ -748,6 +748,50 @@ type Pool { z: BigDecimal } +type PoolContract { + id: ID! + pool: Pool! +} + +input PoolContract_filter { + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + id: ID + id_gt: ID + id_gte: ID + id_in: [ID!] + id_lt: ID + id_lte: ID + id_not: ID + id_not_in: [ID!] + pool: String + pool_: Pool_filter + pool_contains: String + pool_contains_nocase: String + pool_ends_with: String + pool_ends_with_nocase: String + pool_gt: String + pool_gte: String + pool_in: [String!] + pool_lt: String + pool_lte: String + pool_not: String + pool_not_contains: String + pool_not_contains_nocase: String + pool_not_ends_with: String + pool_not_ends_with_nocase: String + pool_not_in: [String!] + pool_not_starts_with: String + pool_not_starts_with_nocase: String + pool_starts_with: String + pool_starts_with_nocase: String +} + +enum PoolContract_orderBy { + id + pool +} + type PoolHistoricalLiquidity { block: BigInt! id: ID! @@ -2127,6 +2171,34 @@ type Query { """ subgraphError: _SubgraphErrorPolicy_! = deny ): Pool + poolContract( + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + id: ID! + + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PoolContract + poolContracts( + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + first: Int = 100 + orderBy: PoolContract_orderBy + orderDirection: OrderDirection + skip: Int = 0 + + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + where: PoolContract_filter + ): [PoolContract!]! poolHistoricalLiquidities( """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. @@ -2748,6 +2820,34 @@ type Subscription { """ subgraphError: _SubgraphErrorPolicy_! = deny ): Pool + poolContract( + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + id: ID! + + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PoolContract + poolContracts( + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + first: Int = 100 + orderBy: PoolContract_orderBy + orderDirection: OrderDirection + skip: Int = 0 + + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + where: PoolContract_filter + ): [PoolContract!]! poolHistoricalLiquidities( """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. diff --git a/balancer-js/src/modules/subgraph/generated/balancer-subgraph-types.ts b/balancer-js/src/modules/subgraph/generated/balancer-subgraph-types.ts index c9c1750e8..d99a4dd78 100644 --- a/balancer-js/src/modules/subgraph/generated/balancer-subgraph-types.ts +++ b/balancer-js/src/modules/subgraph/generated/balancer-subgraph-types.ts @@ -829,6 +829,51 @@ export type PoolWeightUpdatesArgs = { where?: InputMaybe; }; +export type PoolContract = { + __typename?: 'PoolContract'; + id: Scalars['ID']; + pool: Pool; +}; + +export type PoolContract_Filter = { + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + id?: InputMaybe; + id_gt?: InputMaybe; + id_gte?: InputMaybe; + id_in?: InputMaybe>; + id_lt?: InputMaybe; + id_lte?: InputMaybe; + id_not?: InputMaybe; + id_not_in?: InputMaybe>; + pool?: InputMaybe; + pool_?: InputMaybe; + pool_contains?: InputMaybe; + pool_contains_nocase?: InputMaybe; + pool_ends_with?: InputMaybe; + pool_ends_with_nocase?: InputMaybe; + pool_gt?: InputMaybe; + pool_gte?: InputMaybe; + pool_in?: InputMaybe>; + pool_lt?: InputMaybe; + pool_lte?: InputMaybe; + pool_not?: InputMaybe; + pool_not_contains?: InputMaybe; + pool_not_contains_nocase?: InputMaybe; + pool_not_ends_with?: InputMaybe; + pool_not_ends_with_nocase?: InputMaybe; + pool_not_in?: InputMaybe>; + pool_not_starts_with?: InputMaybe; + pool_not_starts_with_nocase?: InputMaybe; + pool_starts_with?: InputMaybe; + pool_starts_with_nocase?: InputMaybe; +}; + +export enum PoolContract_OrderBy { + Id = 'id', + Pool = 'pool' +} + export type PoolHistoricalLiquidity = { __typename?: 'PoolHistoricalLiquidity'; block: Scalars['BigInt']; @@ -2030,6 +2075,8 @@ export type Query = { managementOperation?: Maybe; managementOperations: Array; pool?: Maybe; + poolContract?: Maybe; + poolContracts: Array; poolHistoricalLiquidities: Array; poolHistoricalLiquidity?: Maybe; poolShare?: Maybe; @@ -2200,6 +2247,24 @@ export type QueryPoolArgs = { }; +export type QueryPoolContractArgs = { + block?: InputMaybe; + id: Scalars['ID']; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryPoolContractsArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + + export type QueryPoolHistoricalLiquiditiesArgs = { block?: InputMaybe; first?: InputMaybe; @@ -2481,6 +2546,8 @@ export type Subscription = { managementOperation?: Maybe; managementOperations: Array; pool?: Maybe; + poolContract?: Maybe; + poolContracts: Array; poolHistoricalLiquidities: Array; poolHistoricalLiquidity?: Maybe; poolShare?: Maybe; @@ -2651,6 +2718,24 @@ export type SubscriptionPoolArgs = { }; +export type SubscriptionPoolContractArgs = { + block?: InputMaybe; + id: Scalars['ID']; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionPoolContractsArgs = { + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; + where?: InputMaybe; +}; + + export type SubscriptionPoolHistoricalLiquiditiesArgs = { block?: InputMaybe; first?: InputMaybe; @@ -3953,7 +4038,7 @@ export type PoolsQueryVariables = Exact<{ }>; -export type PoolsQuery = { __typename?: 'Query', pools: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null }> }; +export type PoolsQuery = { __typename?: 'Query', pools: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null, priceRateProviders?: Array<{ __typename?: 'PriceRateProvider', address: string, token: { __typename?: 'PoolToken', address: string } }> | null }> }; export type AllPoolsQueryVariables = Exact<{ skip?: InputMaybe; @@ -3965,7 +4050,7 @@ export type AllPoolsQueryVariables = Exact<{ }>; -export type AllPoolsQuery = { __typename?: 'Query', pool0: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null }>, pool1000: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null }>, pool2000: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null }> }; +export type AllPoolsQuery = { __typename?: 'Query', pool0: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null, priceRateProviders?: Array<{ __typename?: 'PriceRateProvider', address: string, token: { __typename?: 'PoolToken', address: string } }> | null }>, pool1000: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null, priceRateProviders?: Array<{ __typename?: 'PriceRateProvider', address: string, token: { __typename?: 'PoolToken', address: string } }> | null }>, pool2000: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null, priceRateProviders?: Array<{ __typename?: 'PriceRateProvider', address: string, token: { __typename?: 'PoolToken', address: string } }> | null }> }; export type PoolQueryVariables = Exact<{ id: Scalars['ID']; @@ -3973,7 +4058,7 @@ export type PoolQueryVariables = Exact<{ }>; -export type PoolQuery = { __typename?: 'Query', pool?: { __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null } | null }; +export type PoolQuery = { __typename?: 'Query', pool?: { __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null, priceRateProviders?: Array<{ __typename?: 'PriceRateProvider', address: string, token: { __typename?: 'PoolToken', address: string } }> | null } | null }; export type PoolsWithoutLinearQueryVariables = Exact<{ skip?: InputMaybe; @@ -3985,7 +4070,7 @@ export type PoolsWithoutLinearQueryVariables = Exact<{ }>; -export type PoolsWithoutLinearQuery = { __typename?: 'Query', pools: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, symbol?: string | null, name?: string | null, swapFee: string, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, principalToken?: string | null, baseToken?: string | null, swapEnabled: boolean, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null }> }; +export type PoolsWithoutLinearQuery = { __typename?: 'Query', pools: Array<{ __typename?: 'Pool', id: string, address: string, poolType?: string | null, symbol?: string | null, name?: string | null, swapFee: string, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, principalToken?: string | null, baseToken?: string | null, swapEnabled: boolean, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null }> }; export type PoolWithoutLinearQueryVariables = Exact<{ id: Scalars['ID']; @@ -3993,13 +4078,23 @@ export type PoolWithoutLinearQueryVariables = Exact<{ }>; -export type PoolWithoutLinearQuery = { __typename?: 'Query', pool?: { __typename?: 'Pool', id: string, address: string, poolType?: string | null, symbol?: string | null, name?: string | null, swapFee: string, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, principalToken?: string | null, baseToken?: string | null, swapEnabled: boolean, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null } | null }; +export type PoolWithoutLinearQuery = { __typename?: 'Query', pool?: { __typename?: 'Pool', id: string, address: string, poolType?: string | null, symbol?: string | null, name?: string | null, swapFee: string, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, principalToken?: string | null, baseToken?: string | null, swapEnabled: boolean, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null } | null }; + +export type SubgraphPoolFragment = { __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null, priceRateProviders?: Array<{ __typename?: 'PriceRateProvider', address: string, token: { __typename?: 'PoolToken', address: string } }> | null }; + +export type SubgraphPoolWithoutLinearFragment = { __typename?: 'Pool', id: string, address: string, poolType?: string | null, symbol?: string | null, name?: string | null, swapFee: string, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, principalToken?: string | null, baseToken?: string | null, swapEnabled: boolean, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }> | null }; + +export type SubgraphPoolTokenFragment = { __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null } }; -export type SubgraphPoolFragment = { __typename?: 'Pool', id: string, address: string, poolType?: string | null, poolTypeVersion?: number | null, factory?: string | null, strategyType: number, symbol?: string | null, name?: string | null, swapEnabled: boolean, swapFee: string, protocolYieldFeeCache?: string | null, owner?: string | null, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, createTime: number, principalToken?: string | null, baseToken?: string | null, wrappedIndex?: number | null, mainIndex?: number | null, lowerTarget?: string | null, upperTarget?: string | null, sqrtAlpha?: string | null, sqrtBeta?: string | null, root3Alpha?: string | null, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null }; +export type SubgraphSubPoolTokenFragment = { __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null }; -export type SubgraphPoolWithoutLinearFragment = { __typename?: 'Pool', id: string, address: string, poolType?: string | null, symbol?: string | null, name?: string | null, swapFee: string, totalWeight?: string | null, totalSwapVolume: string, totalSwapFee: string, totalLiquidity: string, totalShares: string, swapsCount: string, holdersCount: string, tokensList: Array, amp?: string | null, expiryTime?: string | null, unitSeconds?: string | null, principalToken?: string | null, baseToken?: string | null, swapEnabled: boolean, tokens?: Array<{ __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }> | null }; +export type TokenAttrsFragment = { __typename?: 'Token', address: string, symbol?: string | null, decimals: number }; -export type SubgraphPoolTokenFragment = { __typename?: 'PoolToken', id: string, symbol: string, name: string, decimals: number, address: string, balance: string, managedBalance: string, weight?: string | null, priceRate: string, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', pool?: { __typename?: 'Pool', poolType?: string | null } | null } }; +export type SubgraphSubPoolFragment = { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null }; + +export type TokenTreeFragment = { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null, tokens?: Array<{ __typename?: 'PoolToken', address: string, balance: string, weight?: string | null, priceRate: string, symbol: string, decimals: number, isExemptFromYieldProtocolFee?: boolean | null, token: { __typename?: 'Token', latestUSDPrice?: string | null, pool?: { __typename?: 'Pool', id: string, totalShares: string, address: string, poolType?: string | null, mainIndex?: number | null } | null } }> | null } | null } }> | null } | null }; + +export type SubgraphPriceRateProviderFragment = { __typename?: 'PriceRateProvider', address: string, token: { __typename?: 'PoolToken', address: string } }; export type PoolHistoricalLiquiditiesQueryVariables = Exact<{ skip?: InputMaybe; @@ -4125,6 +4220,53 @@ export const SubgraphPoolShareFragmentDoc = gql` } } `; +export const SubgraphSubPoolFragmentDoc = gql` + fragment SubgraphSubPool on Pool { + id + totalShares + address + poolType + mainIndex +} + `; +export const SubgraphSubPoolTokenFragmentDoc = gql` + fragment SubgraphSubPoolToken on PoolToken { + address + balance + weight + priceRate + symbol + decimals + isExemptFromYieldProtocolFee +} + `; +export const TokenTreeFragmentDoc = gql` + fragment TokenTree on Token { + latestUSDPrice + pool { + ...SubgraphSubPool + tokens { + ...SubgraphSubPoolToken + token { + latestUSDPrice + pool { + ...SubgraphSubPool + tokens { + ...SubgraphSubPoolToken + token { + latestUSDPrice + pool { + ...SubgraphSubPool + } + } + } + } + } + } + } +} + ${SubgraphSubPoolFragmentDoc} +${SubgraphSubPoolTokenFragmentDoc}`; export const SubgraphPoolTokenFragmentDoc = gql` fragment SubgraphPoolToken on PoolToken { id @@ -4138,9 +4280,15 @@ export const SubgraphPoolTokenFragmentDoc = gql` priceRate isExemptFromYieldProtocolFee token { - pool { - poolType - } + ...TokenTree + } +} + ${TokenTreeFragmentDoc}`; +export const SubgraphPriceRateProviderFragmentDoc = gql` + fragment SubgraphPriceRateProvider on PriceRateProvider { + address + token { + address } } `; @@ -4170,6 +4318,9 @@ export const SubgraphPoolFragmentDoc = gql` holdersCount tokensList amp + priceRateProviders(first: 100) { + ...SubgraphPriceRateProvider + } expiryTime unitSeconds createTime @@ -4183,7 +4334,8 @@ export const SubgraphPoolFragmentDoc = gql` sqrtBeta root3Alpha } - ${SubgraphPoolTokenFragmentDoc}`; + ${SubgraphPoolTokenFragmentDoc} +${SubgraphPriceRateProviderFragmentDoc}`; export const SubgraphPoolWithoutLinearFragmentDoc = gql` fragment SubgraphPoolWithoutLinear on Pool { id @@ -4212,6 +4364,13 @@ export const SubgraphPoolWithoutLinearFragmentDoc = gql` swapEnabled } ${SubgraphPoolTokenFragmentDoc}`; +export const TokenAttrsFragmentDoc = gql` + fragment TokenAttrs on Token { + address + symbol + decimals +} + `; export const SubgraphPoolSnapshotFragmentDoc = gql` fragment SubgraphPoolSnapshot on PoolSnapshot { id diff --git a/balancer-js/src/modules/swaps/joinAndExit.ts b/balancer-js/src/modules/swaps/joinAndExit.ts index f9a78b5f8..78b6bfb95 100644 --- a/balancer-js/src/modules/swaps/joinAndExit.ts +++ b/balancer-js/src/modules/swaps/joinAndExit.ts @@ -887,7 +887,7 @@ function buildJoinCall( // console.log(attributes); - const callData = Relayer.constructJoinCall(attributes); + const callData = Relayer.encodeJoinPool(attributes); // These are used for final amount check const amountOut = action.hasTokenOut ? bptAmountOut : '0'; const amountIn = action.hasTokenIn ? maxAmountsIn[joinTokenIndex] : '0'; diff --git a/balancer-js/src/test/factories/data.ts b/balancer-js/src/test/factories/data.ts index ec3487970..81267b072 100644 --- a/balancer-js/src/test/factories/data.ts +++ b/balancer-js/src/test/factories/data.ts @@ -1,7 +1,9 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + import { BALANCER_NETWORK_CONFIG } from '@/lib/constants/config'; -import { PoolSharesRepository } from '@/modules/data'; +import { PoolJoinExitRepository, PoolSharesRepository } from '@/modules/data'; import { BalancerDataRepositories, Findable, @@ -13,24 +15,28 @@ import { Token, } from '@/types'; -export const findable = ( - map: Map +export const findable = ( + map: Map ): Findable & Searchable => ({ find: (id: string) => Promise.resolve(map.get(id)), - findBy: (param: P, value: string) => Promise.resolve(map.get(value)), + findBy: (param: P, value: V) => Promise.resolve(map.get(value)), all: () => Promise.resolve(Object.values(map)), where: (filters: (arg: T) => boolean) => Promise.resolve(Object.values(map)), }); -export const stubbed = ( +export const stubbed = ( value: unknown -): Findable & Searchable => ({ +): Findable & Searchable => ({ find: (id: string) => Promise.resolve(value as T), - findBy: (param: P, _: string) => Promise.resolve(value as T), + findBy: (param: P, _: V) => Promise.resolve(value as T), all: () => Promise.resolve([value as T]), where: (filters: (arg: T) => boolean) => Promise.resolve([value as T]), }); +export const aaveRates = { + getRate: (address: string) => Promise.resolve(1), +}; + interface IdentifiableArray { id: number; } @@ -47,6 +53,7 @@ export const repositores = ({ pools = stubbed(undefined), yesterdaysPools = stubbed(undefined), tokenPrices = stubbed({ usd: '1' }), + tokenHistoricalPrices = stubbed({ usd: '1' }), tokenMeta = stubbed({ decimals: 18 }), liquidityGauges = stubbed(undefined), feeDistributor = { @@ -65,14 +72,20 @@ export const repositores = ({ BALANCER_NETWORK_CONFIG[Network.MAINNET].urls.subgraph, Network.MAINNET ), + poolJoinExits = new PoolJoinExitRepository( + BALANCER_NETWORK_CONFIG[Network.MAINNET].urls.subgraph, + Network.MAINNET + ), }): BalancerDataRepositories => ({ pools, yesterdaysPools, tokenPrices, + tokenHistoricalPrices, tokenMeta, liquidityGauges, feeDistributor, feeCollector, tokenYields, poolShares, + poolJoinExits, }); diff --git a/balancer-js/src/test/factories/index.ts b/balancer-js/src/test/factories/index.ts index 8e86224dc..11f0d81aa 100644 --- a/balancer-js/src/test/factories/index.ts +++ b/balancer-js/src/test/factories/index.ts @@ -1,7 +1,8 @@ import * as sor from './sor'; +import * as pools from './pools'; import * as sdk from './sdk'; import * as data from './data'; -const factories = { ...sor, ...sdk, data }; +const factories = { ...sor, ...pools, ...sdk, data }; export { factories }; diff --git a/balancer-js/src/test/factories/named-tokens.ts b/balancer-js/src/test/factories/named-tokens.ts index 34c91dfb8..ec01e47b4 100644 --- a/balancer-js/src/test/factories/named-tokens.ts +++ b/balancer-js/src/test/factories/named-tokens.ts @@ -16,6 +16,42 @@ export const namedTokens: Record = { address: '0x3472a5a71965499acd81997a54bba8d852c6e53d', decimals: 18, }, + DAI: { + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + decimals: 18, + }, + aDAI: { + address: '0x02d60b84491589974263d922d9cc7a3152618ef6', + decimals: 18, + }, + bDAI: { + address: '0x804cdb9116a10bb78768d3252355a1b18067bf8f', + decimals: 18, + }, + USDC: { + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + decimals: 6, + }, + aUSDC: { + address: '0xd093fa4fb80d09bb30817fdcd442d4d02ed3e5de', + decimals: 18, + }, + bUSDC: { + address: '0x9210f1204b5a24742eba12f710636d76240df3d0', + decimals: 18, + }, + USDT: { + address: '0xdac17f958d2ee523a2206206994597c13d831ec7', + decimals: 6, + }, + aUSDT: { + address: '0xf8fd466f12e236f4c96f7cce6c79eadb819abf58', + decimals: 18, + }, + bUSDT: { + address: '0x2bbf681cc4eb09218bee85ea2a5d3d13fa40fc0c', + decimals: 18, + }, BAL: { address: '0xba100000625a3754423978a60c9317c58a424e3D'.toLowerCase(), decimals: 18, diff --git a/balancer-js/src/test/factories/pools.ts b/balancer-js/src/test/factories/pools.ts new file mode 100644 index 000000000..f0181c6ba --- /dev/null +++ b/balancer-js/src/test/factories/pools.ts @@ -0,0 +1,397 @@ +import { Factory } from 'fishery'; +import { SubgraphPoolBase, SubgraphToken } from '@balancer-labs/sor'; +import { BigNumber, formatFixed, parseFixed } from '@ethersproject/bignumber'; + +import { subgraphToken, subgraphPoolBase } from './sor'; +import { formatAddress, formatId } from '../lib/utils'; +import { Zero, WeiPerEther } from '@ethersproject/constants'; + +type LinearTokens = { + wrappedSymbol: string; + mainSymbol: string; +}; + +export type LinearParams = { + pools: { + tokens: LinearTokens; + balance: string; + }[]; + parentsProportion?: string; +}; + +export interface Pool extends SubgraphPoolBase { + proportionOfParent: string; +} + +export type LinearInfo = { + linearPools: Pool[]; + mainTokens: SubgraphToken[]; + wrappedTokens: SubgraphToken[]; + linearPoolTokens: SubgraphToken[]; +}; + +export interface ComposableStableParams { + id: string; + symbol: string; + address: string; + childTokens: SubgraphToken[]; + tokenbalance: string; +} + +export type ComposableStableInfo = { + pool: Pool; + poolToken: SubgraphToken; +}; + +export interface BoostedParams { + linearPoolsParams: LinearParams; + rootId: string; + rootAddress: string; + rootBalance: string; + parentsProportion?: string; +} + +export interface BoostedInfo extends LinearInfo { + rootPool: Pool; + rootPoolToken: SubgraphToken; +} + +export interface BoostedMetaParams { + childBoostedParams: BoostedParams; + childLinearParam: LinearParams; + rootId: string; + rootAddress: string; + rootBalance: string; +} + +export interface ChildBoostedInfo extends BoostedInfo { + proportion: string; +} + +export interface BoostedMetaInfo { + rootInfo: ComposableStableInfo; + childBoostedInfo: ChildBoostedInfo; + childLinearInfo: LinearInfo; +} + +export interface BoostedMetaBigParams { + rootId: string; + rootAddress: string; + rootBalance: string; + childPools: BoostedParams[]; +} + +export interface BoostedMetaBigInfo { + rootPool: Pool; + rootPoolToken: SubgraphToken; + childPoolsInfo: ChildBoostedInfo[]; + childPools: Pool[]; +} + +/* +Create a set of Linear pools and associated tokens: +LinearPools consisting of wrappedToken, mainToken, composableBpt +*/ +const linearPools = Factory.define( + ({ transientParams }) => { + const { pools, parentsProportion: proportionOfParent = '1' } = + transientParams; + if (pools === undefined) throw new Error('Need linear pool params'); + const linearPools: Pool[] = []; + const mainTokens: SubgraphToken[] = []; + const wrappedTokens: SubgraphToken[] = []; + const linearPoolTokens: SubgraphToken[] = []; + + const totalBalance = pools.reduce( + (total: BigNumber, pool) => total.add(pool.balance), + Zero + ); + pools?.forEach((pool) => { + const poolAddress = formatAddress( + `address-${pool.tokens.mainSymbol}_${pool.tokens.wrappedSymbol}` + ); + const mainToken = subgraphToken + .transient({ + symbol: pool.tokens.mainSymbol, + balance: '1000000', + }) + .build(); + const wrappedToken = subgraphToken + .transient({ + symbol: pool.tokens.wrappedSymbol, + balance: '9711834', + }) + .build(); + const composableBptToken = subgraphToken + .transient({ + symbol: `b${pool.tokens.mainSymbol}_${pool.tokens.wrappedSymbol}`, + balance: '5192296829399898', + address: poolAddress, + }) + .build(); + const linearPool = subgraphPoolBase.build({ + id: formatId( + `id-${pool.tokens.mainSymbol}_${pool.tokens.wrappedSymbol}` + ), + address: poolAddress, + poolType: 'AaveLinear', + tokens: [mainToken, wrappedToken, composableBptToken], + wrappedIndex: 1, + mainIndex: 0, + tokensList: [ + mainToken.address, + wrappedToken.address, + composableBptToken.address, + ], + lowerTarget: '1', + upperTarget: '1', + }); + // Update the pool token to have the expected balance set in input + composableBptToken.balance = pool.balance; + linearPoolTokens.push(composableBptToken); + mainTokens.push(mainToken); + wrappedTokens.push(wrappedToken); + const proportion = BigNumber.from(pool.balance) + .mul(WeiPerEther) + .div(totalBalance); + const propOfParent = proportion + .mul(parseFixed(proportionOfParent, 18)) + .div(WeiPerEther); + linearPools.push({ + ...linearPool, + proportionOfParent: formatFixed(propOfParent.toString(), 18), + }); + }); + return { + linearPools, + mainTokens, + wrappedTokens, + linearPoolTokens, + }; + } +); + +/* +Create and return a composableStable pool (with composableBpt) and token. +*/ +const composableStablePool = Factory.define< + ComposableStableInfo, + ComposableStableParams +>(({ transientParams }) => { + const { id, address, symbol, childTokens, tokenbalance } = transientParams; + // Create composableStable BPT + const composableBptToken = subgraphToken + .transient({ + symbol, + balance: '5192296829399898', // need composableBpt balance for pool + address, + }) + .build(); + + // Create composableStable pool + const pool = subgraphPoolBase.build({ + poolType: 'ComposableStable', + id, + address, + totalWeight: undefined, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + tokens: [...childTokens!, composableBptToken], + amp: '1', + }); + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + composableBptToken.balance = tokenbalance!; + + return { + pool: { ...pool, proportionOfParent: '1' }, + poolToken: composableBptToken, + }; +}); + +/* +Check a boostedPool, a composableStable with all constituents being Linear. +Also creates associated LinearPools consisting of wrappedToken, mainToken, composableBpt. +*/ +const boostedPool = Factory.define( + ({ transientParams }) => { + const { + linearPoolsParams, + rootAddress = 'address_root', + rootId = 'id_root', + rootBalance = '1000000', + parentsProportion = '1', + } = transientParams; + let linearPoolInfo; + // Create linear pools and tokens + if (linearPoolsParams) + linearPoolInfo = linearPools + .transient({ + ...linearPoolsParams, + parentsProportion, + }) + .build(); + else linearPoolInfo = linearPools.build(); + + const rootPoolParams = { + id: formatId(rootId), + symbol: 'bRootPool', + address: formatAddress(rootAddress), + childTokens: linearPoolInfo.linearPoolTokens, + tokenbalance: rootBalance, + }; + const rootInfo = composableStablePool.build( + {}, + { transient: rootPoolParams } + ); + + return { + rootPool: rootInfo.pool, + rootPoolToken: rootInfo.poolToken, + linearPools: linearPoolInfo.linearPools, + mainTokens: linearPoolInfo.mainTokens, + wrappedTokens: linearPoolInfo.wrappedTokens, + linearPoolTokens: linearPoolInfo.linearPoolTokens, + }; + } +); + +/* +Check a boostedMetaPool, a composableStable with one Linear and one boosted. +Also creates associated boosted and LinearPools consisting of wrappedToken, mainToken, composableBpt. +*/ +const boostedMetaPool = Factory.define( + ({ transientParams }) => { + const { + childBoostedParams, + childLinearParam, + rootAddress, + rootId, + rootBalance, + } = transientParams; + + if (childBoostedParams === undefined || childLinearParam === undefined) + throw Error('Missing Pool Params.'); + + const rootTokenBalanceBoosted = BigNumber.from( + childBoostedParams.rootBalance + ); + const rootTokenBalanceLiner = BigNumber.from( + childLinearParam.pools[0].balance + ); + const totalTokenBalance = rootTokenBalanceBoosted.add( + rootTokenBalanceLiner + ); + + const childBoostedProportion = formatFixed( + rootTokenBalanceBoosted + .mul(BigNumber.from(WeiPerEther)) + .div(totalTokenBalance), + 18 + ); + + // Build child boostedPool + const childBoostedInfo = boostedPool + .transient({ + ...childBoostedParams, + parentsProportion: childBoostedProportion, + }) + .build(); + const childBoostedBpt = childBoostedInfo.rootPoolToken; + + const childLinearProportion = formatFixed( + rootTokenBalanceLiner.mul(WeiPerEther).div(totalTokenBalance), + 18 + ); + + // Build child Linear pool + const childLinearInfo = linearPools + .transient({ + pools: childLinearParam.pools, + parentsProportion: childLinearProportion, + }) + .build(); + + const rootPoolParams = { + id: formatId(rootId as string), + symbol: 'rootPool', + address: formatAddress(rootAddress as string), + childTokens: [childBoostedBpt, ...childLinearInfo.linearPoolTokens], + tokenbalance: rootBalance, + }; + const rootInfo = composableStablePool.build( + {}, + { transient: rootPoolParams } + ); + + return { + rootInfo, + childBoostedInfo: { + ...childBoostedInfo, + proportion: childBoostedProportion, + }, + childLinearInfo, + }; + } +); + +/* +Check a boostedMetaBigPool, a composableStable with two boosted. +Also creates associated boosted and LinearPools consisting of wrappedToken, mainToken, composableBpt. +*/ +const boostedMetaBigPool = Factory.define< + BoostedMetaBigInfo, + BoostedMetaBigParams +>(({ transientParams }) => { + const childPoolsInfo: ChildBoostedInfo[] = []; + // These will be used in parent pool + const childPoolTokens: SubgraphToken[] = []; + // These will include composableStables and linear pools + const childPools: Pool[] = []; + + if (transientParams.childPools === undefined) + throw new Error(`Can't create boostedMetaBig without child pools.`); + + // TO DO - need proportions + let totalTokenBalance = Zero; + for (let i = 0; i < transientParams.childPools.length; i++) { + const balance = transientParams.childPools[i].rootBalance; + totalTokenBalance = totalTokenBalance.add(balance); + } + + // Create each child boostedPool + for (let i = 0; i < transientParams.childPools.length; i++) { + const childPool = transientParams.childPools[i]; + const proportion = formatFixed( + BigNumber.from(childPool.rootBalance) + .mul(WeiPerEther) + .div(totalTokenBalance), + 18 + ); + childPool.parentsProportion = proportion; + const childBoosted = boostedPool.transient(childPool).build(); + childPoolsInfo.push({ ...childBoosted, proportion }); + childPools.push(childBoosted.rootPool, ...childBoosted.linearPools); + childPoolTokens.push(childBoosted.rootPoolToken); + } + + const composableParams = { + id: formatId(transientParams.rootId as string), + symbol: 'parentComposable', + address: formatAddress(transientParams.rootAddress as string), + childTokens: childPoolTokens, + tokenbalance: transientParams.rootBalance, + }; + const rootInfo = composableStablePool.build( + {}, + { transient: composableParams } + ); + + return { + rootPool: rootInfo.pool, + rootPoolToken: rootInfo.poolToken, + childPoolsInfo, + childPools, + }; +}); + +export { linearPools, boostedPool, boostedMetaPool, boostedMetaBigPool }; diff --git a/balancer-js/src/test/factories/sdk.ts b/balancer-js/src/test/factories/sdk.ts index 7f45d86a6..528c43a58 100644 --- a/balancer-js/src/test/factories/sdk.ts +++ b/balancer-js/src/test/factories/sdk.ts @@ -39,6 +39,8 @@ const poolFactory = Factory.define(({ params, afterBuild }) => { totalWeight: '1', totalShares: '1', totalLiquidity: '0', + lowerTarget: '0', + upperTarget: '0', }; }); diff --git a/balancer-js/src/test/factories/sor.ts b/balancer-js/src/test/factories/sor.ts index b8492703f..ff6949e05 100644 --- a/balancer-js/src/test/factories/sor.ts +++ b/balancer-js/src/test/factories/sor.ts @@ -6,6 +6,7 @@ import { SwapV2, } from '@balancer-labs/sor'; import { BigNumber } from '@ethersproject/bignumber'; +import { formatAddress } from '../lib/utils'; import { namedTokens } from './named-tokens'; const swapV2 = Factory.define(() => ({ @@ -33,14 +34,19 @@ const swapInfo = Factory.define(() => ({ })); const subgraphToken = Factory.define(({ transientParams }) => { - const { symbol } = transientParams; - const namedToken = namedTokens[symbol]; - + const { symbol, balance = '1', weight = '1', address } = transientParams; + let namedToken = namedTokens[symbol]; + if (!namedToken) { + namedToken = {}; + namedToken.address = formatAddress(address ?? `address_${symbol}`); + namedToken.decimals = 18; + } return { ...namedToken, - balance: '1', + balance, priceRate: '1', - weight: '0.5', + weight, + symbol, }; }); diff --git a/balancer-js/src/test/fixtures/liquidityPools.json b/balancer-js/src/test/fixtures/liquidityPools.json index a12a2bcd2..7a4c795f1 100644 --- a/balancer-js/src/test/fixtures/liquidityPools.json +++ b/balancer-js/src/test/fixtures/liquidityPools.json @@ -720,5 +720,397 @@ "managedBalance": "0" } ] + }, + { + "id": "0xb54b2125b711cd183edd3dd09433439d5396165200000000000000000000075e", + "address": "0xb54b2125b711cd183edd3dd09433439d53961652", + "poolType": "ComposableStable", + "swapFee": "0.0004", + "tokensList": [ + "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "0xa3fa99a148fa48d14ed51d610c367c61876997f1" + ], + "totalLiquidity": "18155.03979860564175032143240229646", + "totalSwapVolume": "102671.3531868674812919326397895474", + "totalSwapFee": "41.06854127474699251677305591581902", + "totalShares": "18229.452335273313471779", + "owner": "0xba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b", + "factory": "0x136fd06fa01ecf624c7f2b3cb15742c1339dc2c4", + "amp": "60", + "createTime": 1662580832, + "swapEnabled": true, + "symbol": "Mai BSP", + "name": "Balancer MAI bb-am-usd Stable", + "protocolYieldFeeCache": "0.5", + "priceRateProviders": [ + { + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "token": { + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085" + } + } + ], + "tokens": [ + { + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "balance": "6709.966214955565090006", + "weight": null, + "priceRate": "1.001100630645200917", + "symbol": "bb-am-usd", + "decimals": 18 + }, + { + "address": "0xa3fa99a148fa48d14ed51d610c367c61876997f1", + "balance": "11562.004232310021164248", + "weight": null, + "priceRate": "1", + "symbol": "miMATIC", + "decimals": 18 + }, + { + "address": "0xb54b2125b711cd183edd3dd09433439d53961652", + "balance": "2596148429115008.984547065289098477", + "weight": null, + "priceRate": "1", + "symbol": "Mai BSP", + "decimals": 18 + } + ], + "isNew": false, + "chainId": 137, + "unwrappedTokens": [], + "feesSnapshot": "0.05569436766835841178113130600685", + "volumeSnapshot": "139.2359191708960294528282650171" + }, + { + "id": "0x48e6b98ef6329f8f0a30ebb8c7c960330d64808500000000000000000000075b", + "totalShares": "6210115.878004697935980954", + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "poolType": "ComposableStable", + "mainIndex": 0, + "tokens": [ + { + "address": "0x178e029173417b1f9c8bc16dcec6f697bc323746", + "balance": "1204360.955231972026803034", + "weight": null, + "priceRate": "1.00039076943095233", + "symbol": "bb-am-DAI", + "decimals": 18 + }, + { + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "balance": "2596148423060491.811647377029393683", + "weight": null, + "priceRate": "1", + "symbol": "bb-am-usd", + "decimals": 18 + }, + { + "address": "0xf93579002dbe8046c43fefe86ec78b1112247bb8", + "balance": "1281578.268016962309728138", + "weight": null, + "priceRate": "1.000387793129824715", + "symbol": "bb-am-USDC", + "decimals": 18 + }, + { + "address": "0xff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6", + "balance": "3727441.528992488683407726", + "weight": null, + "priceRate": "1.000903832871667996", + "symbol": "bb-am-USDT", + "decimals": 18 + } + ] + }, + { + "id": "0xb54b2125b711cd183edd3dd09433439d5396165200000000000000000000075e", + "totalShares": "18229.452335273313471779", + "address": "0xb54b2125b711cd183edd3dd09433439d53961652", + "poolType": "ComposableStable", + "mainIndex": 0, + "tokens": [ + { + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "balance": "6709.966214955565090006", + "weight": null, + "priceRate": "1.001100630645200917", + "symbol": "bb-am-usd", + "decimals": 18 + }, + { + "address": "0xa3fa99a148fa48d14ed51d610c367c61876997f1", + "balance": "11562.004232310021164248", + "weight": null, + "priceRate": "1", + "symbol": "miMATIC", + "decimals": 18 + }, + { + "address": "0xb54b2125b711cd183edd3dd09433439d53961652", + "balance": "2596148429115008.984547065289098477", + "weight": null, + "priceRate": "1", + "symbol": "Mai BSP", + "decimals": 18 + } + ] + }, + { + "id": "0x178e029173417b1f9c8bc16dcec6f697bc323746000000000000000000000758", + "totalShares": "1204361.979169081484934798", + "address": "0x178e029173417b1f9c8bc16dcec6f697bc323746", + "poolType": "AaveLinear", + "mainIndex": 1, + "tokens": [ + { + "address": "0x178e029173417b1f9c8bc16dcec6f697bc323746", + "balance": "5192296857330465.649361414844285297", + "weight": null, + "priceRate": "1", + "symbol": "bb-am-DAI", + "decimals": 18 + }, + { + "address": "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063", + "balance": "375304.734603121326369737", + "weight": null, + "priceRate": "1", + "symbol": "DAI", + "decimals": 18 + }, + { + "address": "0xee029120c72b0607344f35b17cdd90025e647b00", + "balance": "794969.292450441860119758", + "weight": null, + "priceRate": "1", + "symbol": "amDAI", + "decimals": 18 + } + ] + }, + { + "id": "0x48e6b98ef6329f8f0a30ebb8c7c960330d64808500000000000000000000075b", + "totalShares": "6210115.878004697935980954", + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "poolType": "ComposableStable", + "mainIndex": 0, + "tokens": [ + { + "address": "0x178e029173417b1f9c8bc16dcec6f697bc323746", + "balance": "1204360.955231972026803034", + "weight": null, + "priceRate": "1.00039076943095233", + "symbol": "bb-am-DAI", + "decimals": 18 + }, + { + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "balance": "2596148423060491.811647377029393683", + "weight": null, + "priceRate": "1", + "symbol": "bb-am-usd", + "decimals": 18 + }, + { + "address": "0xf93579002dbe8046c43fefe86ec78b1112247bb8", + "balance": "1281578.268016962309728138", + "weight": null, + "priceRate": "1.000387793129824715", + "symbol": "bb-am-USDC", + "decimals": 18 + }, + { + "address": "0xff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6", + "balance": "3727441.528992488683407726", + "weight": null, + "priceRate": "1.000903832871667996", + "symbol": "bb-am-USDT", + "decimals": 18 + } + ] + }, + { + "id": "0xf93579002dbe8046c43fefe86ec78b1112247bb8000000000000000000000759", + "totalShares": "1281580.284714950985286573", + "address": "0xf93579002dbe8046c43fefe86ec78b1112247bb8", + "poolType": "AaveLinear", + "mainIndex": 1, + "tokens": [ + { + "address": "0x221836a597948dce8f3568e044ff123108acc42a", + "balance": "1002299.319398", + "weight": null, + "priceRate": "1", + "symbol": "amUSDC", + "decimals": 6 + }, + { + "address": "0x2791bca1f2de4661ed88a30c99a7a9449aa84174", + "balance": "240640.547859", + "weight": null, + "priceRate": "1", + "symbol": "USDC", + "decimals": 6 + }, + { + "address": "0xf93579002dbe8046c43fefe86ec78b1112247bb8", + "balance": "5192296857253247.343815545343933522", + "weight": null, + "priceRate": "1", + "symbol": "bb-am-USDC", + "decimals": 18 + } + ] + }, + { + "id": "0x48e6b98ef6329f8f0a30ebb8c7c960330d64808500000000000000000000075b", + "totalShares": "6210115.878004697935980954", + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "poolType": "ComposableStable", + "mainIndex": 0, + "tokens": [ + { + "address": "0x178e029173417b1f9c8bc16dcec6f697bc323746", + "balance": "1204360.955231972026803034", + "weight": null, + "priceRate": "1.00039076943095233", + "symbol": "bb-am-DAI", + "decimals": 18 + }, + { + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "balance": "2596148423060491.811647377029393683", + "weight": null, + "priceRate": "1", + "symbol": "bb-am-usd", + "decimals": 18 + }, + { + "address": "0xf93579002dbe8046c43fefe86ec78b1112247bb8", + "balance": "1281578.268016962309728138", + "weight": null, + "priceRate": "1.000387793129824715", + "symbol": "bb-am-USDC", + "decimals": 18 + }, + { + "address": "0xff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6", + "balance": "3727441.528992488683407726", + "weight": null, + "priceRate": "1.000903832871667996", + "symbol": "bb-am-USDT", + "decimals": 18 + } + ] + }, + { + "id": "0xff4ce5aaab5a627bf82f4a571ab1ce94aa365ea600000000000000000000075a", + "totalShares": "3727441.547287488412857699", + "address": "0xff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6", + "poolType": "AaveLinear", + "mainIndex": 1, + "tokens": [ + { + "address": "0x19c60a251e525fa88cd6f3768416a8024e98fc19", + "balance": "3329110.6963", + "weight": null, + "priceRate": "1", + "symbol": "amUSDT", + "decimals": 6 + }, + { + "address": "0xc2132d05d31c914a87c6611c10748aeb04b58e8f", + "balance": "147162.90748", + "weight": null, + "priceRate": "1", + "symbol": "USDT", + "decimals": 6 + }, + { + "address": "0xff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6", + "balance": "5192296854807386.081243007916362396", + "weight": null, + "priceRate": "1", + "symbol": "bb-am-USDT", + "decimals": 18 + } + ] + }, + { + "id": "0xb54b2125b711cd183edd3dd09433439d5396165200000000000000000000075e", + "totalShares": "18229.452335273313471779", + "address": "0xb54b2125b711cd183edd3dd09433439d53961652", + "poolType": "ComposableStable", + "mainIndex": 0, + "tokens": [ + { + "address": "0x48e6b98ef6329f8f0a30ebb8c7c960330d648085", + "balance": "6709.966214955565090006", + "weight": null, + "priceRate": "1.001100630645200917", + "symbol": "bb-am-usd", + "decimals": 18 + }, + { + "address": "0xa3fa99a148fa48d14ed51d610c367c61876997f1", + "balance": "11562.004232310021164248", + "weight": null, + "priceRate": "1", + "symbol": "miMATIC", + "decimals": 18 + }, + { + "address": "0xb54b2125b711cd183edd3dd09433439d53961652", + "balance": "2596148429115008.984547065289098477", + "weight": null, + "priceRate": "1", + "symbol": "Mai BSP", + "decimals": 18 + } + ] + }, + { + "id": "0xc065798f227b49c150bcdc6cdc43149a12c4d75700020000000000000000010b", + "address": "0xc065798f227b49c150bcdc6cdc43149a12c4d757", + "poolType": "LiquidityBootstrapping", + "swapFee": "0.005", + "tokensList": [ + "0x3301ee63fb29f863f2333bd4466acb46cd8323e6", + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2" + ], + "totalLiquidity": "5133797.634654893764109217143567092", + "totalSwapVolume": "22318765.89221163343284493798122458", + "totalSwapFee": "111593.8294610581671642246899061264", + "totalShares": "36815633080869.823028415262249208", + "owner": "0x116f4d31e8dbfe9eb8c8656bc65dff1198cde30e", + "factory": "0x0f3e0c4218b7b0108a3643cfe9d3ec0d4f57c54e", + "amp": null, + "createTime": 1639690020, + "swapEnabled": true, + "symbol": "AKITA_TLA", + "name": "AKITA Copper Launch", + "tokens": [ + { + "address": "0x3301ee63fb29f863f2333bd4466acb46cd8323e6", + "balance": "2721529192541.281946501751871327", + "weight": "0.048481409814721326", + "priceRate": "1", + "symbol": "AKITA", + "decimals": 18, + "token": { "pool": null } + }, + { + "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "balance": "3763.691355377977499777", + "weight": "0.951533849216315698", + "priceRate": "1", + "symbol": "WETH", + "decimals": 18, + "token": { "pool": null } + } + ], + "protocolYieldFeeCache": null, + "priceRateProviders": [] } ] diff --git a/balancer-js/src/test/fixtures/liquidityTokens.json b/balancer-js/src/test/fixtures/liquidityTokens.json index 8c7916bd4..9b567e206 100644 --- a/balancer-js/src/test/fixtures/liquidityTokens.json +++ b/balancer-js/src/test/fixtures/liquidityTokens.json @@ -93,5 +93,60 @@ "eth": "1" }, "lastUpdate": 1648702384835 + }, + { + "chainId": 137, + "symbol": "USDC", + "decimals": 6, + "address": "0x2791bca1f2de4661ed88a30c99a7a9449aa84174", + "price": { + "usd": "1.01", + "eth": "0.000505" + }, + "lastUpdate": 1648702623513 + }, + { + "chainId": 137, + "symbol": "DAI", + "decimals": 18, + "address": "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063", + "price": { + "usd": "1", + "eth": "0.0005" + }, + "lastUpdate": 1648702385646 + }, + { + "chainId": 137, + "symbol": "USDT", + "decimals": 6, + "address": "0xc2132d05d31c914a87c6611c10748aeb04b58e8f", + "price": { + "usd": "0.99", + "eth": "0.000495" + }, + "lastUpdate": 1648702503883 + }, + { + "chainId": 137, + "symbol": "MAI", + "decimals": 18, + "address": "0xa3fa99a148fa48d14ed51d610c367c61876997f1", + "price": { + "usd": "1", + "eth": "0.0005" + }, + "lastUpdate": 1648702503883 + }, + { + "chainId": 1, + "symbol": "AKITA", + "decimals": 18, + "address": "0x3301ee63fb29f863f2333bd4466acb46cd8323e6", + "price": { + "usd": "9.3312e-08", + "eth": "7.2066e-11" + }, + "lastUpdate": 1648702503883 } ] \ No newline at end of file diff --git a/balancer-js/src/test/lib/ImpermanentLossData.ts b/balancer-js/src/test/lib/ImpermanentLossData.ts new file mode 100644 index 000000000..359eea727 --- /dev/null +++ b/balancer-js/src/test/lib/ImpermanentLossData.ts @@ -0,0 +1,178 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { HistoricalPriceProvider, TokenPriceProvider } from '@/modules/data'; +import { Pool, PoolType, Price } from '@/types'; + +export const MOCK_POOLS: { [key: string]: Pool } = { + WeightedPool_1: { + chainId: 1, + name: 'WeightedPool', + id: '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014', + address: '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56', + swapFee: '0.002', + swapEnabled: true, + tokens: [ + { + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + balance: '10000000000000', + decimals: 18, + weight: '0.5', + priceRate: '1', + symbol: 'DAI', + }, + { + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + balance: '20000000000000', + decimals: 6, + weight: '0.5', + priceRate: '1', + symbol: 'USDC', + }, + ], + tokensList: [ + '0x6b175474e89094c44da98b954eedeac495271d0f', + '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + ], + totalWeight: '10', + totalShares: '10000000000000', + totalLiquidity: '10000000000000', + poolType: PoolType.Weighted, + poolTypeVersion: 1, + protocolYieldFeeCache: '0', + lowerTarget: '0', + upperTarget: '0', + }, + WeightedPool_2: { + chainId: 1, + name: 'WeightedPool', + id: '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014', + address: '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56', + swapFee: '0.002', + swapEnabled: true, + tokens: [ + { + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + balance: '10000000000000', + decimals: 18, + weight: '0.5', + priceRate: '1', + symbol: 'DAI', + }, + { + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + balance: '20000000000000', + decimals: 6, + weight: '0.5', + priceRate: '1', + symbol: 'USDC', + }, + ], + tokensList: [ + '0x6b175474e89094c44da98b954eedeac495271d0f', + '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + ], + totalWeight: '10', + totalShares: '10000000000000', + totalLiquidity: '10000000000000', + poolType: PoolType.Weighted, + poolTypeVersion: 1, + protocolYieldFeeCache: '0', + lowerTarget: '0', + upperTarget: '0', + }, + StablePool: { + chainId: 1, + name: 'StablePool', + id: '0xc45d42f801105e861e86658648e3678ad7aa70f900010000000000000000011e', + address: '0xc45d42f801105e861e86658648e3678ad7aa70f9', + swapFee: '0.0004', + swapEnabled: true, + amp: '10', + tokens: [ + { + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + balance: '10000000', + decimals: 18, + weight: '0.3', + priceRate: '1', + symbol: 'DAI', + }, + { + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + balance: '10000000', + decimals: 6, + weight: '0.3', + priceRate: '1', + symbol: 'USDC', + }, + { + address: '0xdac17f958d2ee523a2206206994597c13d831ec7', + balance: '10000000', + decimals: 6, + weight: '0.4', + priceRate: '1', + symbol: 'USDT', + }, + ], + tokensList: [ + '0x6b175474e89094c44da98b954eedeac495271d0f', + '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + '0xdac17f958d2ee523a2206206994597c13d831ec7', + ], + totalWeight: '10', + totalShares: '100000', + totalLiquidity: '10000000000000', + poolType: PoolType.Stable, + poolTypeVersion: 1, + protocolYieldFeeCache: '0', + lowerTarget: '0', + upperTarget: '0', + }, +}; + +export const MOCK_PRICES = new Map([ + ['0x6b175474e89094c44da98b954eedeac495271d0f', { usd: '1.002' }], + ['0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', { usd: '1.002' }], + ['0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', { usd: '1.002' }], + ['0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', { usd: '1.002' }], +]); + +export const MOCK_HISTORICAL_PRICES = new Map< + string, + { [timestamp: number]: Price } +>([ + [ + '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + { 1666276501: { usd: '0.9993785272283172' } }, + ], + [ + '0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4', + { 1666276501: { usd: '1.9996776052990013' } }, + ], +]); + +export class MockPriceProvider extends TokenPriceProvider { + async find(address: string): Promise { + return MOCK_PRICES.get(address); + } + + async findBy(address: string): Promise { + return MOCK_PRICES.get(address as unknown as string); + } +} + +export class MockHistoricalPriceProvider extends HistoricalPriceProvider { + async find(address: string): Promise { + const historicalPrice = MOCK_HISTORICAL_PRICES.has(address) + ? MOCK_HISTORICAL_PRICES.get(address) + : undefined; + return historicalPrice ? historicalPrice[1666276501] : undefined; + } + + async findBy(address: string, timestamp: number): Promise { + const historicalPrice = MOCK_HISTORICAL_PRICES.has(address) + ? MOCK_HISTORICAL_PRICES.get(address) + : undefined; + return historicalPrice ? historicalPrice[timestamp] : undefined; + } +} diff --git a/balancer-js/src/test/lib/constants.ts b/balancer-js/src/test/lib/constants.ts index 014206c77..8c4269ced 100644 --- a/balancer-js/src/test/lib/constants.ts +++ b/balancer-js/src/test/lib/constants.ts @@ -72,6 +72,12 @@ export const ADDRESSES = { decimals: 18, symbol: 'bbausd', }, + bbausd2: { + id: '0xa13a9247ea42d743238089903570127dda72fe4400000000000000000000035d', + address: '0xA13a9247ea42D743238089903570127DdA72fE44'.toLowerCase(), + decimals: 18, + symbol: 'bbausd2', + }, bbausdc: { address: '0x9210F1204b5a24742Eba12f710636D76240dF3d0', decimals: 18, @@ -81,11 +87,26 @@ export const ADDRESSES = { address: '0x02d60b84491589974263d922d9cc7a3152618ef6', decimals: 18, symbol: 'waDAI', + slot: 52, }, waUSDC: { address: '0xd093fa4fb80d09bb30817fdcd442d4d02ed3e5de', decimals: 6, symbol: 'waUSDC', + slot: 52, + }, + waUSDT: { + address: '0xf8Fd466F12e236f4c96F7Cce6c79EAdB819abF58', + decimals: 6, + symbol: 'waUSDT', + slot: 52, + }, + WBTCWETH: { + id: '0xa6f548df93de924d73be7d25dc02554c6bd66db500020000000000000000000e', + address: '0xa6f548df93de924d73be7d25dc02554c6bd66db5', + decimals: 18, + symbol: 'B-50WBTC-50WETH', + slot: 0, }, auraBal: { address: '0x616e8bfa43f920657b3497dbf40d6b1a02d4608d', @@ -99,6 +120,13 @@ export const ADDRESSES = { symbol: 'BAL8020BPT', slot: 0, }, + wstETH_bbaUSD: { + id: '0x25accb7943fd73dda5e23ba6329085a3c24bfb6a000200000000000000000387', + address: '0x25accb7943fd73dda5e23ba6329085a3c24bfb6a', + decimals: 18, + symbol: 'wstETH_bbaUSD', + slot: 0, + }, }, [Network.KOVAN]: { // Visit https://balancer-faucet.on.fleek.co/#/faucet for test tokens @@ -195,6 +223,24 @@ export const ADDRESSES = { decimals: 18, symbol: 'bbausd', }, + waDAI: { + address: '', + decimals: 18, + symbol: 'waDAI', + slot: 52, + }, + waUSDC: { + address: '', + decimals: 6, + symbol: 'waUSDC', + slot: 52, + }, + waUSDT: { + address: '', + decimals: 6, + symbol: 'waUSDT', + slot: 52, + }, }, [Network.POLYGON]: { MATIC: { @@ -272,6 +318,24 @@ export const ADDRESSES = { decimals: 18, symbol: 'bbausd', }, + waDAI: { + address: '', + decimals: 18, + symbol: 'waDAI', + slot: 52, + }, + waUSDC: { + address: '', + decimals: 6, + symbol: 'waUSDC', + slot: 52, + }, + waUSDT: { + address: '', + decimals: 6, + symbol: 'waUSDT', + slot: 52, + }, bbamUSD: { address: '0x48e6B98ef6329f8f0A30eBB8c7C960330d648085', decimals: 18, @@ -315,5 +379,223 @@ export const ADDRESSES = { decimals: 18, symbol: 'bbausd', }, + waDAI: { + address: '', + decimals: 18, + symbol: 'waDAI', + slot: 52, + }, + waUSDC: { + address: '', + decimals: 6, + symbol: 'waUSDC', + slot: 52, + }, + waUSDT: { + address: '', + decimals: 6, + symbol: 'waUSDT', + slot: 52, + }, + }, + [Network.GOERLI]: { + USDC_old: { + address: '0xe0c9275e44ea80ef17579d33c55136b7da269aeb', + decimals: 6, + symbol: 'USDC_old', + slot: 0, + }, + USDC: { + address: '0xdabd33683bafdd448968ab6d6f47c3535c64bf0c', + decimals: 6, + symbol: 'USDC', + slot: 0, + }, + USDT: { + address: '0x14468fd5e1de5a5a4882fa5f4e2217c5a8ddcadb', + decimals: 6, + symbol: 'USDT', + slot: 0, + }, + DAI: { + address: '0xb8096bc53c3ce4c11ebb0069da0341d75264b104', + decimals: 18, + symbol: 'DAI', + slot: 0, + }, + BAL: { + address: '0xfa8449189744799ad2ace7e0ebac8bb7575eff47', + decimals: 18, + symbol: 'BAL', + slot: 1, + }, + bbausd: { + address: '0x13acd41c585d7ebb4a9460f7c8f50be60dc080cd', + decimals: 18, + symbol: 'bbausd', + }, + waDAI: { + address: '0x0b61329839d2ebea96e21f45d4b065dbf38a7af6', + decimals: 18, + symbol: 'waDAI', + slot: 52, + }, + waUSDC: { + address: '0xb8b3c69687ac048f607d75d89145bc82232098ca', + decimals: 6, + symbol: 'waUSDC', + slot: 52, + }, + waUSDT: { + address: '0x014c0b2b8c4ed33231f9b33aca21735c8f71bbfb', + decimals: 6, + symbol: 'waUSDT', + slot: 52, + }, + MAI: { + address: '0x398106564948fEeb1fEdeA0709AE7D969D62a391', + decimals: 18, + symbol: 'MAI', + slot: 0, + }, + waMAI: { + address: '0x6B53E04299124217ebb46c2830e00DFafd0d86d6', + decimals: 18, + symbol: 'waMAI', + slot: 0, + }, + WETH: { + address: '0xdfcea9088c8a88a76ff74892c1457c17dfeef9c1', + decimals: 18, + symbol: 'WETH', + slot: 4, + }, + waWETH: { + address: '0xAB1Ec6011332A431d3fFA597681C29E28FeFe065', + decimals: 18, + symbol: 'waWETH', + slot: 0, + }, + WBTC: { + address: '0x37f03a12241E9FD3658ad6777d289c3fb8512Bc9', + decimals: 18, + symbol: 'WBTC', + slot: 0, + }, + waWBTC: { + address: '0xB846B79562Bc238b1919c665AB49F6217c072D11', + decimals: 18, + symbol: 'waWBTC', + slot: 0, + }, + bbadai: { + address: '0x594920068382f64e4bc06879679bd474118b97b1', + decimals: 18, + symbol: 'bbadai', + slot: 0, + }, + bbausdc: { + address: '0x4d983081b9b9f3393409a4cdf5504d0aea9cd94c', + decimals: 18, + symbol: 'bbausdc', + slot: 0, + }, + bbausdt: { + address: '0xd03d4d8b4669d135569215dd6c4e790307c8e14b', + decimals: 18, + symbol: 'bbausdt', + slot: 0, + }, + bbamai: { + id: '0x24c52fee349194f68a998ac4e2ce170d780d010c0000000000000000000001a1', + address: '0x24C52feE349194f68A998aC4E2ce170D780D010c', + decimals: 18, + symbol: 'bb-a-mai', + slot: 0, + }, + bbaweth: { + id: '0xd8143b8e7a6e452e5e1bc42a3cef43590a2300310000000000000000000001a2', + address: '0xD8143B8E7a6e452E5E1BC42A3ceF43590A230031', + decimals: 18, + symbol: 'bb-a-weth', + slot: 0, + }, + bbamaiweth: { + id: '0x45631a4b3cab78e6dfdd21a7025a61fac76839190000000000000000000001a8', + address: '0x45631A4b3CaB78E6DFDd21a7025A61fAC7683919', + decimals: 18, + symbol: 'bb-a-mai-weth', + slot: 0, + }, + boostedMeta1: { + id: '0x48e984db5f9ba1bf2ee21d0a207a96c944d807e30000000000000000000001a9', + address: '0x48e984DB5F9BA1Bf2Ee21d0A207a96C944D807E3', + decimals: 18, + symbol: 'boostedMeta1', + slot: 0, + }, + boostedMetaAlt1: { + id: '0x98f3b300d7d0607ed69be014ec0d99567b00be6d00000000000000000000020a', + address: '0x98f3b300d7d0607ed69be014ec0d99567b00be6d', + decimals: 18, + symbol: 'boostedMetaAlt1', + slot: 0, + }, + boostedMetaBig1: { + id: '0xae5bfce463ab4689e9353d13b537e9896f13c7420000000000000000000001aa', + address: '0xae5bfce463ab4689e9353d13b537e9896f13c742', + decimals: 18, + symbol: 'boostedMetaBig1', + slot: 0, + }, + bbausd2: { + id: '0x3d5981bdd8d3e49eb7bbdc1d2b156a3ee019c18e0000000000000000000001a7', + address: '0x3d5981BDD8D3E49EB7BBDC1d2B156a3eE019c18e', + decimals: 18, + symbol: 'bbausd2', + slot: 0, + }, + WBTCWETH: { + id: '0x16faf9f73748013155b7bc116a3008b57332d1e600020000000000000000005b', + address: '0x16faf9f73748013155b7bc116a3008b57332d1e6', + decimals: 18, + symbol: 'B-50WBTC-50WETH', + slot: 0, + }, + boostedWeightedSimple1: { + id: '0xd625c90154084cf1417227bbdea4ef151f746995000200000000000000000272', + address: '0xd625c90154084cf1417227bbdea4ef151f746995', + decimals: 18, + symbol: 'BWS1', + slot: 0, + }, + boostedWeightedGeneral1: { + id: '0x42827c5452a8f4f13f4d5a1048dbfc58c77e98f5000100000000000000000273', + address: '0x42827c5452a8f4f13f4d5a1048dbfc58c77e98f5', + decimals: 18, + symbol: 'BWG1', + slot: 0, + }, + boostedWeightedMeta1: { + id: '0x3b01654804b0cea899d5edf8fd7000fe1c0911bd000200000000000000000274', + address: '0x3b01654804b0cea899d5edf8fd7000fe1c0911bd', + decimals: 18, + symbol: 'BWM1', + slot: 0, + }, + boostedWeightedMetaAlt1: { + id: '0x5f037eadf5cd0bc5fc198e6020f33f21a9361fc8000200000000000000000275', + address: '0x5f037eadf5cd0bc5fc198e6020f33f21a9361fc8', + decimals: 18, + symbol: 'BWMA1', + slot: 0, + }, + boostedWeightedMetaGeneral1: { + id: '0xe0baf79433d233c26b41cac99ddcd73830f257e5000100000000000000000276', + address: '0xe0baf79433d233c26b41cac99ddcd73830f257e5', + decimals: 18, + symbol: 'BWMG1', + slot: 0, + }, }, }; diff --git a/balancer-js/src/test/lib/utils.ts b/balancer-js/src/test/lib/utils.ts index dc5199798..9ee14ffea 100644 --- a/balancer-js/src/test/lib/utils.ts +++ b/balancer-js/src/test/lib/utils.ts @@ -1,9 +1,12 @@ -import { JsonRpcProvider, JsonRpcSigner } from '@ethersproject/providers'; import { BigNumber } from '@ethersproject/bignumber'; -import { AddressZero, MaxUint256 } from '@ethersproject/constants'; -import { balancerVault } from '@/lib/constants/config'; import { hexlify, zeroPad } from '@ethersproject/bytes'; +import { AddressZero, MaxUint256 } from '@ethersproject/constants'; +import { JsonRpcProvider, JsonRpcSigner } from '@ethersproject/providers'; import { keccak256 } from '@ethersproject/solidity'; +import { formatBytes32String } from '@ethersproject/strings'; + +import { PoolWithMethods, BalancerError, BalancerErrorCode } from '@/.'; +import { balancerVault } from '@/lib/constants/config'; import { parseEther } from '@ethersproject/units'; import { ERC20 } from '@/modules/contracts/implementations/ERC20'; import { setBalance } from '@nomicfoundation/hardhat-network-helpers'; @@ -12,7 +15,6 @@ import { Interface } from '@ethersproject/abi'; const liquidityGaugeAbi = ['function deposit(uint value) payable']; const liquidityGauge = new Interface(liquidityGaugeAbi); import { Pools as PoolsProvider } from '@/modules/pools'; -import { PoolWithMethods, BalancerError, BalancerErrorCode } from '@/.'; /** * Setup local fork with approved token balance for a given account @@ -53,7 +55,7 @@ export const forkSetup = async ( ); // Approve appropriate allowances so that vault contract can move tokens - await approveToken(tokens[i], balances[i], signer); + await approveToken(tokens[i], MaxUint256.toString(), signer); } }; @@ -152,6 +154,16 @@ export const getBalances = async ( return Promise.all(balances); }; +export const formatAddress = (text: string): string => { + if (text.match(/^(0x)?[0-9a-fA-F]{40}$/)) return text; // Return text if it's already a valid address + return formatBytes32String(text).slice(0, 42); +}; + +export const formatId = (text: string): string => { + if (text.match(/^(0x)?[0-9a-fA-F]{64}$/)) return text; // Return text if it's already a valid id + return formatBytes32String(text); +}; + export const move = async ( token: string, from: string, diff --git a/balancer-js/src/types.ts b/balancer-js/src/types.ts index 9b34952e1..4b4eaf6ef 100644 --- a/balancer-js/src/types.ts +++ b/balancer-js/src/types.ts @@ -19,6 +19,7 @@ import type { PoolGaugesRepository, PoolSharesRepository, ProtocolFeesProvider, + PoolJoinExitRepository, } from './modules/data'; import type { GraphQLArgs } from './lib/graphql'; import type { AprBreakdown } from '@/modules/pools/apr/apr'; @@ -35,6 +36,14 @@ export interface BalancerSdkConfig { customSubgraphUrl?: string; //optionally overwrite parts of the standard SOR config sor?: Partial; + tenderly?: BalancerTenderlyConfig; +} + +export interface BalancerTenderlyConfig { + accessKey?: string; + user?: string; + project?: string; + blockNumber?: number; } export interface BalancerSdkSorConfig { @@ -53,9 +62,10 @@ export interface ContractAddresses { vault: string; multicall: string; lidoRelayer?: string; + relayerV3?: string; + relayerV4?: string; gaugeController?: string; feeDistributor?: string; - relayerV4?: string; veBal?: string; veBalProxy?: string; protocolFeePercentagesProvider?: string; @@ -75,6 +85,7 @@ export interface BalancerNetworkConfig { bbaUsd?: string; }; }; + tenderly?: BalancerTenderlyConfig; urls: { subgraph: string; gaugesSubgraph?: string; @@ -89,6 +100,7 @@ export interface BalancerDataRepositories { pools: Findable & Searchable; yesterdaysPools?: Findable & Searchable; tokenPrices: Findable; + tokenHistoricalPrices: Findable; tokenMeta: Findable; liquidityGauges?: Findable; feeDistributor?: BaseFeeDistributor; @@ -97,6 +109,7 @@ export interface BalancerDataRepositories { tokenYields: Findable; poolShares: PoolSharesRepository; poolGauges?: PoolGaugesRepository; + poolJoinExits: PoolJoinExitRepository; gaugeShares?: GaugeSharesRepository; } @@ -173,6 +186,11 @@ export type Currency = 'eth' | 'usd'; export type Price = { [currency in Currency]?: string }; export type TokenPrices = { [address: string]: Price }; +export type HistoricalPrices = { + prices: [[number, number]]; + market_caps: [[number, number]]; + total_volumes: [[number, number]]; +}; export interface Token { address: string; @@ -186,7 +204,21 @@ export interface PoolToken extends Token { priceRate?: string; weight?: string | null; isExemptFromYieldProtocolFee?: boolean; - token?: { pool: { poolType: null | PoolType } | null }; + token?: SubPoolMeta; +} + +export interface SubPoolMeta { + pool: SubPool | null; + latestUSDPrice?: string; +} + +export interface SubPool { + id: string; + address: string; + poolType: PoolType; + totalShares: string; + mainIndex: number; + tokens?: PoolToken[]; } export interface OnchainTokenData { @@ -218,10 +250,12 @@ export enum PoolType { StablePhantom = 'StablePhantom', LiquidityBootstrapping = 'LiquidityBootstrapping', AaveLinear = 'AaveLinear', + Linear = 'Linear', ERC4626Linear = 'ERC4626Linear', Element = 'Element', Gyro2 = 'Gyro2', Gyro3 = 'Gyro3', + Managed = 'Managed', } export interface Pool { @@ -254,11 +288,21 @@ export interface Pool { symbol?: string; swapEnabled: boolean; amp?: string; + wrappedIndex?: number; + mainIndex?: number; apr?: AprBreakdown; liquidity?: string; totalWeight: string; - mainIndex?: number; - wrappedIndex?: number; + lowerTarget: string; + upperTarget: string; + priceRateProviders?: PriceRateProvider[]; +} + +export interface PriceRateProvider { + address: string; + token: { + address: string; + }; } /** @@ -271,7 +315,11 @@ export interface PoolWithMethods extends Pool { amountsIn: string[], slippage: string ) => JoinPoolAttributes; - calcPriceImpact: (amountsIn: string[], minBPTOut: string) => Promise; + calcPriceImpact: ( + amountsIn: string[], + minBPTOut: string, + isJoin: boolean + ) => Promise; buildExitExactBPTIn: ( exiter: string, bptIn: string, @@ -285,7 +333,11 @@ export interface PoolWithMethods extends Pool { amountsOut: string[], slippage: string ) => ExitPoolAttributes; - calcSpotPrice: (tokenIn: string, tokenOut: string) => string; + calcSpotPrice: ( + tokenIn: string, + tokenOut: string, + isDefault?: boolean + ) => string; } export interface GraphQLQuery { diff --git a/balancer-js/yarn.lock b/balancer-js/yarn.lock index 480b592e4..b5760cda8 100644 --- a/balancer-js/yarn.lock +++ b/balancer-js/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.1.0": version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: "@jridgewell/gen-mapping" "^0.1.0" @@ -12,7 +12,7 @@ "@ardatan/relay-compiler@12.0.0": version "12.0.0" - resolved "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz" + resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== dependencies: "@babel/core" "^7.14.0" @@ -33,324 +33,344 @@ signedsource "^1.0.0" yargs "^15.3.1" +"@ardatan/sync-fetch@0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz#3385d3feedceb60a896518a1db857ec1e945348f" + integrity sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA== + dependencies: + node-fetch "^2.6.1" + "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== +"@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== "@babel/core@^7.14.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/generator" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.14.0", "@babel/generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz" - integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== +"@babel/generator@^7.14.0", "@babel/generator@^7.18.13", "@babel/generator@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.5" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== +"@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.18.8" + "@babel/compat-data" "^7.20.0" "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" + browserslist "^4.21.3" semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.18.6": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz" - integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" + integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" "@babel/helper-member-expression-to-functions@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== dependencies: "@babel/types" "^7.18.9" "@babel/helper-module-imports@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== +"@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== +"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz" - integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" + integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/traverse" "^7.19.1" + "@babel/types" "^7.19.0" -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== +"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-option@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== +"@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz" - integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== +"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== "@babel/plugin-proposal-class-properties@^7.0.0": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz" - integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" + integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.1" "@babel/plugin-syntax-class-properties@^7.0.0": version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-syntax-import-assertions@7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-transform-arrow-functions@^7.0.0": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoped-functions@^7.0.0": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.0.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz" - integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" + integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.0.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz" - integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" + integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.0" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.0.0": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-destructuring@^7.0.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz" - integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" + integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz" - integrity sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-flow" "^7.18.6" "@babel/plugin-transform-for-of@^7.0.0": version "7.18.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-function-name@^7.0.0": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: "@babel/helper-compilation-targets" "^7.18.9" @@ -359,162 +379,152 @@ "@babel/plugin-transform-literals@^7.0.0": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-member-expression-literals@^7.0.0": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz" - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" + integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-simple-access" "^7.19.4" "@babel/plugin-transform-object-super@^7.0.0": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz" - integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" + integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.0.0": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-display-name@^7.0.0": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.0.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz" - integrity sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/types" "^7.19.0" "@babel/plugin-transform-shorthand-properties@^7.0.0": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.0.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz" - integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" + integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-transform-template-literals@^7.0.0": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/runtime@^7.0.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" -"@babel/template@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" -"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz" - integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" + "@babel/generator" "^7.20.5" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz" - integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== +"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.18.10", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@balancer-labs/sor@^4.0.1-beta.12": - version "4.0.1-beta.12" - resolved "https://registry.yarnpkg.com/@balancer-labs/sor/-/sor-4.0.1-beta.12.tgz#d00e9ed7b5a45b5e5141936df9460d0d23eb21b1" - integrity sha512-RTb3cf/iPr/4HTMDvnArnwSp6p0Mx7B9J9O5h1+DPaC0VrFJani4T9x39J4v7RdAxtF39vnFpZ5uoVL8Sc28TQ== +"@balancer-labs/sor@^4.0.1-beta.15": + version "4.0.1-beta.15" + resolved "https://registry.yarnpkg.com/@balancer-labs/sor/-/sor-4.0.1-beta.15.tgz#4fc6ae8df195a20abf597babb5453a5d303bdcda" + integrity sha512-8BlaQqmV56gs4b2YFs6xjBFGIxthg7SEjuxDcb7Q45AUUdFutGKsX8glC2hI4ZDM5+7W0FmNwGnKF2OrzFsuiQ== dependencies: isomorphic-fetch "^2.2.1" "@balancer-labs/typechain@^1.0.0": version "1.0.0" - resolved "https://registry.npmjs.org/@balancer-labs/typechain/-/typechain-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/@balancer-labs/typechain/-/typechain-1.0.0.tgz#823eb13b9e166f7b50334c9d70d9ade81344f5c9" integrity sha512-/fWxh4UgmHxtRt5e1anVeF8COo6FBNF28X8bd0/55SIdRDyaW7TMC7K4Jbuy58IcaERmEqi089lABlEgoeiWTQ== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2": - version "3.0.2" - resolved "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz" - integrity sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA== - dependencies: - lodash.get "^4" - make-error "^1" - ts-node "^9" - tslib "^2" - "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -527,78 +537,9 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.2", "@ethereumjs/block@^3.6.3": - version "3.6.3" - resolved "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz" - integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== - dependencies: - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - ethereumjs-util "^7.1.5" - merkle-patricia-tree "^4.2.4" - -"@ethereumjs/blockchain@^5.5.2", "@ethereumjs/blockchain@^5.5.3": - version "5.5.3" - resolved "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz" - integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.4" - "@ethereumjs/ethash" "^1.1.0" - debug "^4.3.3" - ethereumjs-util "^7.1.5" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": - version "2.6.5" - resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" - -"@ethereumjs/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== - dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@^3.5.1", "@ethereumjs/tx@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz" - integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== - dependencies: - "@ethereumjs/common" "^2.6.4" - ethereumjs-util "^7.1.5" - -"@ethereumjs/vm@^5.9.0": - version "5.9.3" - resolved "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.9.3.tgz" - integrity sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg== - dependencies: - "@ethereumjs/block" "^3.6.3" - "@ethereumjs/blockchain" "^5.5.3" - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^4.3.3" - ethereumjs-util "^7.1.5" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.4" - rustbn.js "~0.2.0" - "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" @@ -613,7 +554,7 @@ "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -626,7 +567,7 @@ "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.4.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -637,7 +578,7 @@ "@ethersproject/address@5.7.0", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -648,14 +589,14 @@ "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -663,7 +604,7 @@ "@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.4.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -672,21 +613,21 @@ "@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.4.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -702,7 +643,7 @@ "@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -717,7 +658,7 @@ "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -735,7 +676,7 @@ "@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -754,7 +695,7 @@ "@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -762,19 +703,19 @@ "@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.0", "@ethersproject/networks@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz" - integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -782,15 +723,15 @@ "@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.0", "@ethersproject/providers@^5.4.5": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz" - integrity sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA== +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.4.5": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" @@ -815,7 +756,7 @@ "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -823,7 +764,7 @@ "@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -831,7 +772,7 @@ "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -840,7 +781,7 @@ "@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -852,7 +793,7 @@ "@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.6.1": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -864,7 +805,7 @@ "@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -873,7 +814,7 @@ "@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" @@ -888,7 +829,7 @@ "@ethersproject/units@5.7.0", "@ethersproject/units@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -897,7 +838,7 @@ "@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.5.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -916,10 +857,10 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.0", "@ethersproject/web@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz" - integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -929,7 +870,7 @@ "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -939,73 +880,77 @@ "@ethersproject/strings" "^5.7.0" "@graphql-codegen/add@^3.1.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.2.0.tgz" - integrity sha512-8hyr5XvTDGnpiT4nH2yH8PP4SWtUEIUdkFaZbkpkFkU0Ud9dplvSviOCdxdArffZ1FHy0XYLTMa2it+UJOtszg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-3.2.1.tgz#f1109f36f194f88a6abcc51703abee43ebbb50a2" + integrity sha512-w82H/evh8SSGoD3K6K/Oh3kqSdbuU+TgHqMYmmHFxtH692v2xhN/cu1s/TotBQ7r4mO7OQutze7dde2tZEXGEQ== dependencies: - "@graphql-codegen/plugin-helpers" "^2.5.0" + "@graphql-codegen/plugin-helpers" "^2.6.2" tslib "~2.4.0" "@graphql-codegen/cli@^2.3.0": - version "2.10.0" - resolved "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.10.0.tgz" - integrity sha512-v87yzrQ4Q/PpGPC59O0xusQknWWKtUdITqahpUBDddT8ZWHNhadx2BjvPkinFoPZmCkG8yVoAHx7FJ2uLzqjww== - dependencies: - "@graphql-codegen/core" "2.6.0" - "@graphql-codegen/plugin-helpers" "^2.6.0" - "@graphql-tools/apollo-engine-loader" "^7.3.1" - "@graphql-tools/code-file-loader" "^7.3.0" - "@graphql-tools/git-loader" "^7.2.0" - "@graphql-tools/github-loader" "^7.3.1" - "@graphql-tools/graphql-file-loader" "^7.4.0" - "@graphql-tools/json-file-loader" "^7.4.0" - "@graphql-tools/load" "^7.7.0" - "@graphql-tools/prisma-loader" "^7.2.2" - "@graphql-tools/url-loader" "^7.12.1" - "@graphql-tools/utils" "^8.8.0" - "@whatwg-node/fetch" "^0.0.2" + version "2.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-2.15.0.tgz#e36dd8cdb32ce58aeeebd546266cd435732e796f" + integrity sha512-o4Wh99VJDX/z0fG3pkdOf0t0fu7SlYn6qlLnqzNhVpZByGPe548gu11GKiOPKVaQ76kkB3dzqzfINRl+v7EA4A== + dependencies: + "@babel/generator" "^7.18.13" + "@babel/template" "^7.18.10" + "@babel/types" "^7.18.13" + "@graphql-codegen/core" "2.6.6" + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-tools/apollo-engine-loader" "^7.3.6" + "@graphql-tools/code-file-loader" "^7.3.13" + "@graphql-tools/git-loader" "^7.2.13" + "@graphql-tools/github-loader" "^7.3.20" + "@graphql-tools/graphql-file-loader" "^7.5.0" + "@graphql-tools/json-file-loader" "^7.4.1" + "@graphql-tools/load" "7.8.0" + "@graphql-tools/prisma-loader" "^7.2.7" + "@graphql-tools/url-loader" "^7.13.2" + "@graphql-tools/utils" "^8.9.0" + "@whatwg-node/fetch" "^0.3.0" ansi-escapes "^4.3.1" chalk "^4.1.0" chokidar "^3.5.2" cosmiconfig "^7.0.0" + cosmiconfig-typescript-loader "4.1.1" debounce "^1.2.0" detect-indent "^6.0.0" - graphql-config "^4.3.1" + graphql-config "4.3.6" inquirer "^8.0.0" is-glob "^4.0.1" json-to-pretty-yaml "^1.2.2" listr2 "^4.0.5" log-symbols "^4.0.0" - mkdirp "^1.0.4" + shell-quote "^1.7.3" string-env-interpolation "^1.0.1" ts-log "^2.2.3" tslib "^2.4.0" yaml "^1.10.0" yargs "^17.0.0" -"@graphql-codegen/core@2.6.0": - version "2.6.0" - resolved "https://registry.npmjs.org/@graphql-codegen/core/-/core-2.6.0.tgz" - integrity sha512-7uZGnLCMR/pnh/5CsyI4y5bBvRndNHFs+AWpMUUjDBcjMRrMaavu37VyyYDz4/ob0BnQJt8RTBN9eArS9PLYAQ== +"@graphql-codegen/core@2.6.6": + version "2.6.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-2.6.6.tgz#e6ea99682230c5bbcf28cb247672da7f17e78578" + integrity sha512-gU2FUxoLGw2GfcPWfBVXuiN3aDODbZ6Z9I+IGxa2u1Rzxlacw4TMmcwr4/IjC6mkiYJEKTvdVspHaby+brhuAg== dependencies: - "@graphql-codegen/plugin-helpers" "^2.5.0" - "@graphql-tools/schema" "^8.5.0" - "@graphql-tools/utils" "^8.8.0" + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-tools/schema" "^9.0.0" + "@graphql-tools/utils" "^9.1.1" tslib "~2.4.0" "@graphql-codegen/introspection@^2.1.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@graphql-codegen/introspection/-/introspection-2.2.0.tgz" - integrity sha512-duIRd/o3SHEEwnxc+lx6v5y/DZEeesxCOusY+u8Bjh8ZBssh3wXcWsGSGhH1amfNMRTby+xsz7HiLW6Q4x7Qwg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/introspection/-/introspection-2.2.1.tgz#2fb52f7989142d0dde15858c40b543652d9e7b4e" + integrity sha512-083tu9rSLL0k9LrAyGt1AjGQI/O9gX3w1UliaufLc3mofDSt7iV04tT9VJRuk4IoBvyPZ/8YCs5zIpmt/GexPA== dependencies: - "@graphql-codegen/plugin-helpers" "^2.5.0" - "@graphql-codegen/visitor-plugin-common" "^2.11.0" + "@graphql-codegen/plugin-helpers" "^2.6.2" + "@graphql-codegen/visitor-plugin-common" "^2.12.1" tslib "~2.4.0" -"@graphql-codegen/plugin-helpers@^2.3.0", "@graphql-codegen/plugin-helpers@^2.5.0", "@graphql-codegen/plugin-helpers@^2.6.0": - version "2.6.0" - resolved "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.6.0.tgz" - integrity sha512-z8uw6GdUvtKyt5YSijtj1yRqI0A2lBWdGIgTjgXaAKqSC+InlVBy+89859LlKNMrO7somdt44cbMys8r4Hbqeg== +"@graphql-codegen/plugin-helpers@^2.3.0", "@graphql-codegen/plugin-helpers@^2.6.2", "@graphql-codegen/plugin-helpers@^2.7.2": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz#6544f739d725441c826a8af6a49519f588ff9bed" + integrity sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg== dependencies: "@graphql-tools/utils" "^8.8.0" change-case-all "1.0.14" @@ -1014,49 +959,49 @@ lodash "~4.17.0" tslib "~2.4.0" -"@graphql-codegen/schema-ast@^2.4.0", "@graphql-codegen/schema-ast@^2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-2.5.0.tgz" - integrity sha512-nlF4Yc7h90nmogG2E11TeFJ3/hCkb4SDMSdbJX68b1mhvVEji/kq3zWYKAQ+lAzjZ7HF94Eylm3MrZAjjpCKIA== +"@graphql-codegen/schema-ast@^2.4.0", "@graphql-codegen/schema-ast@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-2.5.1.tgz#ce030ae6de5dacd745848009ba0ca18c9c30910c" + integrity sha512-tewa5DEKbglWn7kYyVBkh3J8YQ5ALqAMVmZwiVFIGOao5u66nd+e4HuFqp0u+Jpz4SJGGi0ap/oFrEvlqLjd2A== dependencies: - "@graphql-codegen/plugin-helpers" "^2.5.0" + "@graphql-codegen/plugin-helpers" "^2.6.2" "@graphql-tools/utils" "^8.8.0" tslib "~2.4.0" "@graphql-codegen/typescript-document-nodes@^2.2.0": - version "2.3.2" - resolved "https://registry.npmjs.org/@graphql-codegen/typescript-document-nodes/-/typescript-document-nodes-2.3.2.tgz" - integrity sha512-8ITmuDc33woCrDzPwi2pcvgF+mR80GN0w0DOTFw8HdLMLACe3ZGyq9ajLSWh2sh7ZWdOBNZfCLwefg2ZLWsX7g== + version "2.3.8" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-document-nodes/-/typescript-document-nodes-2.3.8.tgz#360451999eba36f1a6b5302c1d557caef6543dcb" + integrity sha512-WDa/BmUZHeTgkU0u89ugyHgXObhUlY0rD9o5L3pMkUrUX76031mtBqhIBF0McPVjuSXeO7wyp+tI+/N44YADhQ== dependencies: - "@graphql-codegen/plugin-helpers" "^2.6.0" - "@graphql-codegen/visitor-plugin-common" "2.12.0" + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-codegen/visitor-plugin-common" "2.13.3" auto-bind "~4.0.0" tslib "~2.4.0" "@graphql-codegen/typescript-graphql-request@^4.3.0": - version "4.5.2" - resolved "https://registry.npmjs.org/@graphql-codegen/typescript-graphql-request/-/typescript-graphql-request-4.5.2.tgz" - integrity sha512-C3fAg88VsQtoAx14s3+tOrWI2noS0UBj37mXj8qVpH46XdNOJpQ9IdC3I1UWFXGDVXQceKxL5ztFtsN+Uh5tmg== + version "4.5.8" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-graphql-request/-/typescript-graphql-request-4.5.8.tgz#55a609de168f4bf7b66f353b7ba4b1a21113c921" + integrity sha512-XsuAA35Ou03LsklNgnIWXZ5HOHsJ5w1dBuDKtvqM9rD0cAI8x0f4TY0n6O1EraSBSvyHLP3npb1lOTPZzG2TjA== dependencies: - "@graphql-codegen/plugin-helpers" "^2.6.0" - "@graphql-codegen/visitor-plugin-common" "2.12.0" + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-codegen/visitor-plugin-common" "2.13.1" auto-bind "~4.0.0" tslib "~2.4.0" "@graphql-codegen/typescript-operations@^2.2.0": - version "2.5.2" - resolved "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.2.tgz" - integrity sha512-iFZsdsF4380WrN2UQHfgLjrjyo9VFIsZuCaHe1OoC4fQQ+P3t/GfJ0aj0hc5hNwTNJZ3BzBLHSRgE6wqO4591A== + version "2.5.8" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.8.tgz#e9e2022de9f67b0d855d370f20c48c7b2ed24f21" + integrity sha512-Zp27jZjOLkoH0qy5INqrTsut5PI40OEVcKmcQ+TDHr9wDYa3M06/k907z6CuW3PjOgJBtrSTcgAEnrye8jhkJw== dependencies: - "@graphql-codegen/plugin-helpers" "^2.6.0" - "@graphql-codegen/typescript" "^2.7.2" - "@graphql-codegen/visitor-plugin-common" "2.12.0" + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-codegen/typescript" "^2.8.3" + "@graphql-codegen/visitor-plugin-common" "2.13.3" auto-bind "~4.0.0" tslib "~2.4.0" "@graphql-codegen/typescript-resolvers@2.4.1": version "2.4.1" - resolved "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-2.4.1.tgz" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-2.4.1.tgz#2d5bd359c682ede84fade3f7d0e0686408da0263" integrity sha512-6RXfZd8dIWT1C01pHI3rO49H9ynxC9f5zAxIOC2oKr/EwoHQWOqG+7TPWPvG0WT9RtceXi8jazjdTR8iD291+Q== dependencies: "@graphql-codegen/plugin-helpers" "^2.3.0" @@ -1066,9 +1011,9 @@ auto-bind "~4.0.0" tslib "~2.3.0" -"@graphql-codegen/typescript@2.4.0", "@graphql-codegen/typescript@^2.3.0": +"@graphql-codegen/typescript@2.4.0": version "2.4.0" - resolved "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-2.4.0.tgz#8e22939977152cec27cc5bbf0e134adeef1c4405" integrity sha512-zsqwajqC1WduPVfg1+yfHDUnag+S6s1bs6IPZoY5AaScbfLuJe8p3G7qyBEstaZGzLGNxvZs7jeujCBwj2B2yw== dependencies: "@graphql-codegen/plugin-helpers" "^2.3.0" @@ -1077,23 +1022,39 @@ auto-bind "~4.0.0" tslib "~2.3.0" -"@graphql-codegen/typescript@^2.7.2": - version "2.7.2" - resolved "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.7.2.tgz" - integrity sha512-lFqvLgw4oAChA9+ifC2K7Ie+mE+XvHcZqwXsm45bpF7jbmqfgjS0gvQNfu2egi6u4hdg+xL+olNxwnyhayrikw== +"@graphql-codegen/typescript@^2.3.0", "@graphql-codegen/typescript@^2.8.3": + version "2.8.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-2.8.3.tgz#83a87586b550b7c5b543d11b8a2da706cca67bda" + integrity sha512-ch8Lzjp8XnN8P70uYBmsjv7FWJQ47qletlShPHk7n4RRsnLkah3J9iSEUIALqM25Wl6EjEmHlxoAgSBILz+sjg== dependencies: - "@graphql-codegen/plugin-helpers" "^2.6.0" - "@graphql-codegen/schema-ast" "^2.5.0" - "@graphql-codegen/visitor-plugin-common" "2.12.0" + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-codegen/schema-ast" "^2.5.1" + "@graphql-codegen/visitor-plugin-common" "2.13.3" + auto-bind "~4.0.0" + tslib "~2.4.0" + +"@graphql-codegen/visitor-plugin-common@2.13.1": + version "2.13.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.1.tgz#2228660f6692bcdb96b1f6d91a0661624266b76b" + integrity sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^8.8.0" auto-bind "~4.0.0" + change-case-all "1.0.14" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" tslib "~2.4.0" -"@graphql-codegen/visitor-plugin-common@2.12.0", "@graphql-codegen/visitor-plugin-common@^2.11.0": - version "2.12.0" - resolved "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.12.0.tgz" - integrity sha512-ULhFgOY05U+dlPsXkPT2wSBaAZMtEuHPL5Q1u8xwBdHWHi/uT4L5zEcBx+If/f6UWrOw7ufjEM0L7XSupe1iCA== +"@graphql-codegen/visitor-plugin-common@2.13.3", "@graphql-codegen/visitor-plugin-common@^2.12.1": + version "2.13.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.3.tgz#4a2eceee00b4cfdf1eff31a006710a30417ec497" + integrity sha512-5gFDQGuCE5tIBo9KtDPZ8kL6cf1VJwDGj6nO9ERa0HJNk5osT50NhSf6H61LEnM3Gclbo96Ib1GCp3KdLwHoGg== dependencies: - "@graphql-codegen/plugin-helpers" "^2.6.0" + "@graphql-codegen/plugin-helpers" "^2.7.2" "@graphql-tools/optimize" "^1.3.0" "@graphql-tools/relay-operation-optimizer" "^6.5.0" "@graphql-tools/utils" "^8.8.0" @@ -1106,7 +1067,7 @@ "@graphql-codegen/visitor-plugin-common@2.5.0": version "2.5.0" - resolved "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.5.0.tgz" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.5.0.tgz#e412fade4ca3178a19e7ea122a4cb3463f2bf585" integrity sha512-a1kJ/5YBivCj9X20YuhNU2mPY9xjUVmJO0VjHBu06PyvC27GsR1PmvgRALIXrb6QwV+9DDUda3ewKzgne2Qc+A== dependencies: "@graphql-codegen/plugin-helpers" "^2.3.0" @@ -1120,152 +1081,221 @@ parse-filepath "^1.0.2" tslib "~2.3.0" -"@graphql-tools/apollo-engine-loader@^7.3.1": - version "7.3.4" - resolved "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.3.4.tgz" - integrity sha512-loTKywGHajEeZ6xDzSxP6v1soBvdhoJXqSQ9SzC7zD1rAnJ+ZkJ9btECwPJOAqMHIWfc7qnyFOpHtb/NHegPqw== +"@graphql-tools/apollo-engine-loader@^7.3.6": + version "7.3.19" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.3.19.tgz#f18e73ba0e2efc9d9b9f30b96f6ce3a842837695" + integrity sha512-at5VaqSVGZDc3Fjr63vWhrKXTb5YdopCuvpRGeC9PALIWAMOLXNdkdPYiFe8crLAz60qhcpADqFoNFR+G2+NIg== dependencies: - "@graphql-tools/utils" "8.8.0" - "@whatwg-node/fetch" "^0.0.2" - sync-fetch "0.4.1" + "@ardatan/sync-fetch" "0.0.1" + "@graphql-tools/utils" "9.1.1" + "@whatwg-node/fetch" "^0.5.0" tslib "^2.4.0" -"@graphql-tools/batch-execute@8.5.0": - version "8.5.0" - resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.0.tgz" - integrity sha512-S9/76X4uYIbVlJyRzXhCBbTJvVD0VvaWNqGiKgkITxlq4aBsTOHVuE84OSi3E1QKP3PTiJYrgMIn220iFOkyQw== +"@graphql-tools/batch-execute@8.5.12": + version "8.5.12" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-8.5.12.tgz#3059646b87e4ea3a196a6c8cbc3faf9b7c410d52" + integrity sha512-eNdN5CirW3ILoBaVyy4GI6JpLoJELeH0A7+uLRjwZuMFxpe4cljSrY8P+id28m43+uvBzB3rvNTv0+mnRjrMRw== dependencies: - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/utils" "9.1.1" dataloader "2.1.0" tslib "^2.4.0" value-or-promise "1.0.11" -"@graphql-tools/code-file-loader@^7.3.0": - version "7.3.0" - resolved "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.0.tgz" - integrity sha512-mzevVv5JYyyRIbE6R0mxIniCAZWUGdoNYX97HdVgqChLOl2XRf9I8MarVPewHLmjLTZuWrdQx4ta4sPTLk4tUQ== +"@graphql-tools/code-file-loader@^7.3.13": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-7.3.13.tgz#439c21c80aed1018f9457d3742b1d51ce60cd3f0" + integrity sha512-6anNQJ/VqseqBGcrZexGsiW40cBWF8Uko9AgvGSuZx2uJl1O8H9a3XMZnkmuI17yoGRCzXkwf52AS0+O5UYFUA== dependencies: - "@graphql-tools/graphql-tag-pluck" "7.3.0" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/graphql-tag-pluck" "7.4.0" + "@graphql-tools/utils" "9.1.1" globby "^11.0.3" tslib "^2.4.0" unixify "^1.0.0" -"@graphql-tools/delegate@8.8.0": - version "8.8.0" - resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-8.8.0.tgz" - integrity sha512-dbhfOI8rQXPcowXrbwHLOBY9oGi7qxtlrXF4RuRXmjqGTs2AgogdOE3Ep1+6wFD7qYTuFmHXZ8Cl0PmhoZUgrg== +"@graphql-tools/delegate@9.0.17": + version "9.0.17" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-9.0.17.tgz#8f509a046cee7b37c0cae33a526e4aea903539ab" + integrity sha512-y7h5H+hOhQWEkG67A4wurlphHMYJuMlQIEY7wZPVpmViuV6TuSPB7qkLITsM99XiNQhX+v1VayN2cuaP/8nIhw== dependencies: - "@graphql-tools/batch-execute" "8.5.0" - "@graphql-tools/schema" "8.5.0" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/batch-execute" "8.5.12" + "@graphql-tools/executor" "0.0.9" + "@graphql-tools/schema" "9.0.10" + "@graphql-tools/utils" "9.1.1" dataloader "2.1.0" tslib "~2.4.0" value-or-promise "1.0.11" -"@graphql-tools/git-loader@^7.2.0": - version "7.2.0" - resolved "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-7.2.0.tgz" - integrity sha512-aFJ5Py9sCIhiSyE+EK4zC+mQ4zRUNGGNwosqlCYNcmhtGFwlXArB13/rdj2b4p3RsmTe31Mso9VfsEZXQ6CGCw== +"@graphql-tools/executor-graphql-ws@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.3.tgz#5cbc6adca46cf46a3b5e208976a978b26221678b" + integrity sha512-8VATDf82lTaYRE4/BrFm8v6Cz6UHoNTlSkQjPcGtDX4nxbBUYLDfN+Z8ZXl0eZc3tCwsIHkYQunJO0OjmcrP5Q== + dependencies: + "@graphql-tools/utils" "9.1.1" + "@repeaterjs/repeater" "3.0.4" + "@types/ws" "^8.0.0" + graphql-ws "5.11.2" + isomorphic-ws "5.0.0" + tslib "^2.4.0" + ws "8.11.0" + +"@graphql-tools/executor-http@0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-0.0.4.tgz#b0ba436bd37a538ee31f30c9ee6266143a956062" + integrity sha512-m7UwOhzIXLXXisxOD8x+niN3ae38A8bte47eBBfzr8eTrjsSEEQRbwsc6ciUmoys/5iQabnbtJN10rNIaZaU8w== + dependencies: + "@graphql-tools/utils" "9.1.1" + "@repeaterjs/repeater" "3.0.4" + "@whatwg-node/fetch" "0.5.3" + dset "3.1.2" + extract-files "^11.0.0" + meros "1.2.1" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/executor-legacy-ws@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.3.tgz#6d01d319989b2013c90cb548677272b985fd37c9" + integrity sha512-ulQ3IsxQ9VRA2S+afJefFpMZHedoUDRd8ylz+9DjqAoykYz6CDD2s3pi6Fud52VCq3DP79dRM7a6hjWgt+YPWw== + dependencies: + "@graphql-tools/utils" "9.1.1" + "@types/ws" "^8.0.0" + isomorphic-ws "5.0.0" + tslib "^2.4.0" + ws "8.11.0" + +"@graphql-tools/executor@0.0.9": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-0.0.9.tgz#f55f8cbe12d7989b0ff58cca9a041fbdde3dbd40" + integrity sha512-qLhQWXTxTS6gbL9INAQa4FJIqTd2tccnbs4HswOx35KnyLaLtREuQ8uTfU+5qMrRIBhuzpGdkP2ssqxLyOJ5rA== dependencies: - "@graphql-tools/graphql-tag-pluck" "7.3.0" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/utils" "9.1.1" + "@graphql-typed-document-node/core" "3.1.1" + "@repeaterjs/repeater" "3.0.4" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/git-loader@^7.2.13": + version "7.2.13" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-7.2.13.tgz#76af2a8e56f66c28562496c48baaafe7d812db43" + integrity sha512-PBAzZWXzKUL+VvlUQOjF++246G1O6TTMzvIlxaecgxvTSlnljEXJcDQlxqXhfFPITc5MP7He0N1UcZPBU/DE7Q== + dependencies: + "@graphql-tools/graphql-tag-pluck" "7.4.0" + "@graphql-tools/utils" "9.1.1" is-glob "4.0.3" micromatch "^4.0.4" tslib "^2.4.0" unixify "^1.0.0" -"@graphql-tools/github-loader@^7.3.1": - version "7.3.4" - resolved "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-7.3.4.tgz" - integrity sha512-jpo4ebPHM5EWsWRYHchaok0iZGuCG0Db5o3CdeRU6rhJnLFGv1gb2EgTHZwmZXBrHwZgFjlsDN/LGXgNmchDgQ== +"@graphql-tools/github-loader@^7.3.20": + version "7.3.20" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-7.3.20.tgz#3b06aedc21607240530084b8f8364c1968d0c132" + integrity sha512-kIgloHb+yJJYR6K47HNBv7vI7IF73eoGsQy77H+2WDA+zwE5PuRXGUTAlJXRQdwiY71/Nvbw44P3l4WWbMRv0Q== dependencies: - "@graphql-tools/graphql-tag-pluck" "7.3.0" - "@graphql-tools/utils" "8.8.0" - "@whatwg-node/fetch" "^0.0.2" - sync-fetch "0.4.1" + "@ardatan/sync-fetch" "0.0.1" + "@graphql-tools/graphql-tag-pluck" "7.4.0" + "@graphql-tools/utils" "9.1.1" + "@whatwg-node/fetch" "^0.5.0" tslib "^2.4.0" -"@graphql-tools/graphql-file-loader@^7.3.7", "@graphql-tools/graphql-file-loader@^7.4.0": - version "7.4.0" - resolved "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.4.0.tgz" - integrity sha512-r1lslE5GlWO/nbDX82enHjvva7qQiZEIPm+LC9JSgKaYuVoYHuIuIAVYkpBHeaRK1Kbh/86pEhL7PuBZ/cIWSA== +"@graphql-tools/graphql-file-loader@^7.3.7", "@graphql-tools/graphql-file-loader@^7.5.0": + version "7.5.11" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.11.tgz#19c44ea9021d3220c7ed1cef6cfa0afbb40fd9a4" + integrity sha512-E4/YYLlM/T/VDYJ3MfQzJSkCpnHck+xMv2R6QTjO3khUeTCWJY4qsLDPFjAWE0+Mbe9NanXi/yL8Bz0yS/usDw== dependencies: - "@graphql-tools/import" "6.7.0" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/import" "6.7.12" + "@graphql-tools/utils" "9.1.1" globby "^11.0.3" tslib "^2.4.0" unixify "^1.0.0" -"@graphql-tools/graphql-tag-pluck@7.3.0": - version "7.3.0" - resolved "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.3.0.tgz" - integrity sha512-GxtgGTSOiQuFc/yNWXsPJ5QEgGlH+4qBf1paqUJtjFpm89dZA+VkdjoIDiFg8fyXGivjZ37+XAUbuu6UlsT+6Q== +"@graphql-tools/graphql-tag-pluck@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.4.0.tgz#b8082801164aad0b9b03bc61fb92388d076cc66a" + integrity sha512-f966Z8cMDiPxWuN3ksuHpNgGE8euZtrL/Gcwz9rRarAb13al4CGHKmw2Cb/ZNdt7GbyhdiLT4wbaddrF0xCpdw== dependencies: "@babel/parser" "^7.16.8" + "@babel/plugin-syntax-import-assertions" "7.20.0" "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/utils" "9.1.1" tslib "^2.4.0" -"@graphql-tools/import@6.7.0": - version "6.7.0" - resolved "https://registry.npmjs.org/@graphql-tools/import/-/import-6.7.0.tgz" - integrity sha512-u9JL4fClKKyBTQpgb4QFacYUwgBCs4lW1NaHX0hD2zBdahIYidokBY0QkOqOCEAnWeFqpEmAjB62ulLiAJWc2g== +"@graphql-tools/import@6.7.12": + version "6.7.12" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.7.12.tgz#173d2ce94304d1930e8674857d4ffe3cd52cfdd5" + integrity sha512-3+IV3RHqnpQz0o+0Liw3jkr0HL8LppvsFROKdfXihbnCGO7cIq4S9QYdczZ2DAJ7AosyzSu8m36X5dEmOYY6WA== dependencies: - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/utils" "9.1.1" resolve-from "5.0.0" tslib "^2.4.0" -"@graphql-tools/json-file-loader@^7.3.7", "@graphql-tools/json-file-loader@^7.4.0": - version "7.4.0" - resolved "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-7.4.0.tgz" - integrity sha512-6oR7Ulc5iZc5SM3g1Yj91DqSu3TNbfGK/0baE8KyUlvq6KiIuWFWDy13RGnNesftt4RSWvZqGzu/kzXcBHtt+A== +"@graphql-tools/json-file-loader@^7.3.7", "@graphql-tools/json-file-loader@^7.4.1": + version "7.4.12" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-7.4.12.tgz#ac1d98e90926e0ac0a8530ff464f5a1c9041c16c" + integrity sha512-KuOBJg9ZVrgDsYUaolSXJI90HpwkNiPJviWSc5aqNYSkE+C9DwelBOaKBVQNk1ecEnktqx6Nd+KVsF3m+dupRQ== dependencies: - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/utils" "9.1.1" globby "^11.0.3" tslib "^2.4.0" unixify "^1.0.0" -"@graphql-tools/load@^7.5.5", "@graphql-tools/load@^7.7.0": - version "7.7.0" - resolved "https://registry.npmjs.org/@graphql-tools/load/-/load-7.7.0.tgz" - integrity sha512-6KX7Z8BtlFScDr0pIac92QZWlPGbHcpNMesX/6Y3Vsp3FeFnAYfzZldXZQcJoW7Yl+gHdFwYVq683wSH64kNrw== +"@graphql-tools/load@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-7.8.0.tgz#bd4d2e2a5117de9a60f9691a218217e96afc2ea7" + integrity sha512-l4FGgqMW0VOqo+NMYizwV8Zh+KtvVqOf93uaLo9wJ3sS3y/egPCgxPMDJJ/ufQZG3oZ/0oWeKt68qop3jY0yZg== + dependencies: + "@graphql-tools/schema" "9.0.4" + "@graphql-tools/utils" "8.12.0" + p-limit "3.1.0" + tslib "^2.4.0" + +"@graphql-tools/load@^7.5.5": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-7.8.6.tgz#f0c5d7852337f8c7e4b88a9a7d63255d29d98395" + integrity sha512-yFDM5hVhV0eOom3SGyc+mjL8FvEb+0PZTZ/OSc4zrs3m/ABiQFHm2ilhzNS+OsMCpOsfGl2kXguEdt86QPp60Q== dependencies: - "@graphql-tools/schema" "8.5.0" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/schema" "9.0.10" + "@graphql-tools/utils" "9.1.1" p-limit "3.1.0" tslib "^2.4.0" -"@graphql-tools/merge@8.3.0", "@graphql-tools/merge@^8.2.6": - version "8.3.0" - resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.0.tgz" - integrity sha512-xRa7RAQok/0DD2YnjuqikMrr7dUAxTpdGtZ7BkvUUGhYs3B3p7reCAfvOVr1DJAqVToP7hdlMk+S5+Ylk+AaqA== +"@graphql-tools/merge@8.3.12", "@graphql-tools/merge@^8.2.6": + version "8.3.12" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.12.tgz#e3f2e5d8a7b34fb689cda66799d845cbc919e464" + integrity sha512-BFL8r4+FrqecPnIW0H8UJCBRQ4Y8Ep60aujw9c/sQuFmQTiqgWgpphswMGfaosP2zUinDE3ojU5wwcS2IJnumA== + dependencies: + "@graphql-tools/utils" "9.1.1" + tslib "^2.4.0" + +"@graphql-tools/merge@8.3.6": + version "8.3.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.6.tgz#97a936d4c8e8f935e58a514bb516c476437b5b2c" + integrity sha512-uUBokxXi89bj08P+iCvQk3Vew4vcfL5ZM6NTylWi8PIpoq4r5nJ625bRuN8h2uubEdRiH8ntN9M4xkd/j7AybQ== dependencies: - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/utils" "8.12.0" tslib "^2.4.0" "@graphql-tools/optimize@^1.0.1", "@graphql-tools/optimize@^1.3.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.3.0.tgz" - integrity sha512-30QOWJoMJEt1De7tAFtWJ6VPrP6SLq+tSQrA3x+WMvCW3q2exq5wPDpvAXOakVKu0y8L2E+YkipC0hcQPBQdLg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.3.1.tgz#29407991478dbbedc3e7deb8c44f46acb4e9278b" + integrity sha512-5j5CZSRGWVobt4bgRRg7zhjPiSimk+/zIuColih8E8DxuFOaJ+t0qu7eZS5KXWBkjcd4BPNuhUPpNlEmHPqVRQ== dependencies: tslib "^2.4.0" -"@graphql-tools/prisma-loader@^7.2.2": - version "7.2.5" - resolved "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-7.2.5.tgz" - integrity sha512-K1CboYXIuOy07WvchXkcAHzbj5nKqlfSSudmxpSfWNwqbOaw3GPuyfNBoYxD6zt7ZunZZsTzleDAr5RqPTQOWA== +"@graphql-tools/prisma-loader@^7.2.7": + version "7.2.42" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-7.2.42.tgz#56fc731f8315bb6ee5d59abfb26fb016278fe396" + integrity sha512-sdfoj8oM67okez4JAfJxrRXraCU62YXcCWr2DKQNcZDcVKVqUXfEESd7p5C/2l2ThC1+RtG3bOnvo0FWw3+U+g== dependencies: - "@graphql-tools/url-loader" "7.13.0" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/url-loader" "7.16.22" + "@graphql-tools/utils" "9.1.1" "@types/js-yaml" "^4.0.0" "@types/json-stable-stringify" "^1.0.32" "@types/jsonwebtoken" "^8.5.0" chalk "^4.1.0" debug "^4.3.1" dotenv "^16.0.0" - graphql-request "^4.0.0" + graphql-request "^5.0.0" http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" isomorphic-fetch "^3.0.0" @@ -1273,72 +1303,98 @@ json-stable-stringify "^1.0.1" jsonwebtoken "^8.5.1" lodash "^4.17.20" - replaceall "^0.1.6" scuid "^1.1.0" tslib "^2.4.0" yaml-ast-parser "^0.0.43" "@graphql-tools/relay-operation-optimizer@^6.3.7", "@graphql-tools/relay-operation-optimizer@^6.5.0": - version "6.5.0" - resolved "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.0.tgz" - integrity sha512-snqmdPiM2eBex6pijRFx4H9MPumVd8ZWM3y+aaRwzc73VUNnjHE4NyVZEEIdlbmJ2HoQ9Zrm9aFlHVMK7B59zg== + version "6.5.12" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.12.tgz#659af3aff0e70bfed0f45d02776c8c0dd7f5fb03" + integrity sha512-jwcgNK1S8fqDI612uhbZSZTmQ0aJrLjtOSEcelwZ6Ec7o29I3NlOMBGnjvnBr4Y2tUFWZhBKfx0aEn6EJlhiGA== dependencies: "@ardatan/relay-compiler" "12.0.0" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/utils" "9.1.1" tslib "^2.4.0" -"@graphql-tools/schema@8.5.0", "@graphql-tools/schema@^8.5.0": - version "8.5.0" - resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.5.0.tgz" - integrity sha512-VeFtKjM3SA9/hCJJfr95aEdC3G0xIKM9z0Qdz4i+eC1g2fdZYnfWFt2ucW4IME+2TDd0enHlKzaV0qk2SLVUww== +"@graphql-tools/schema@9.0.10", "@graphql-tools/schema@^9.0.0": + version "9.0.10" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.10.tgz#77ba3dfab241f0232dc0d3ba03201663b63714e2" + integrity sha512-lV0o4df9SpPiaeeDAzgdCJ2o2N9Wvsp0SMHlF2qDbh9aFCFQRsXuksgiDm2yTgT3TG5OtUes/t0D6uPjPZFUbQ== dependencies: - "@graphql-tools/merge" "8.3.0" - "@graphql-tools/utils" "8.8.0" + "@graphql-tools/merge" "8.3.12" + "@graphql-tools/utils" "9.1.1" tslib "^2.4.0" value-or-promise "1.0.11" -"@graphql-tools/url-loader@7.13.0", "@graphql-tools/url-loader@^7.12.1", "@graphql-tools/url-loader@^7.9.7": - version "7.13.0" - resolved "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.13.0.tgz" - integrity sha512-hM3yIDij0EqrHrLKNRpFRhQD0tmzt7E5OevOL9O3CLKCcv2Ho4wXQD7gscwVJJdg2Qyr22Pqr/IdtR8QiMScRA== +"@graphql-tools/schema@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.4.tgz#1a74608b57abf90fae6fd929d25e5482c57bc05d" + integrity sha512-B/b8ukjs18fq+/s7p97P8L1VMrwapYc3N2KvdG/uNThSazRRn8GsBK0Nr+FH+mVKiUfb4Dno79e3SumZVoHuOQ== dependencies: - "@graphql-tools/delegate" "8.8.0" - "@graphql-tools/utils" "8.8.0" - "@graphql-tools/wrap" "8.5.0" - "@n1ru4l/graphql-live-query" "^0.9.0" + "@graphql-tools/merge" "8.3.6" + "@graphql-tools/utils" "8.12.0" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/url-loader@7.16.22", "@graphql-tools/url-loader@^7.13.2", "@graphql-tools/url-loader@^7.9.7": + version "7.16.22" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.16.22.tgz#3c210d8755082f2686cbdb1024fa5f7fb0e49a5f" + integrity sha512-JA0+7w2eidPmsVFRFgzZQ+RQKiS9WE0T5R/wKudxLdC8NnCKdEw0hdA7wKmhhIXNhOs5UtWGfwQ1O2CrvStxWw== + dependencies: + "@ardatan/sync-fetch" "0.0.1" + "@graphql-tools/delegate" "9.0.17" + "@graphql-tools/executor-graphql-ws" "0.0.3" + "@graphql-tools/executor-http" "0.0.4" + "@graphql-tools/executor-legacy-ws" "0.0.3" + "@graphql-tools/utils" "9.1.1" + "@graphql-tools/wrap" "9.2.18" "@types/ws" "^8.0.0" - "@whatwg-node/fetch" "^0.0.2" - dset "^3.1.2" - extract-files "^11.0.0" - graphql-ws "^5.4.1" - isomorphic-ws "^5.0.0" - meros "^1.1.4" - sync-fetch "^0.4.0" + "@whatwg-node/fetch" "^0.5.0" + isomorphic-ws "5.0.0" tslib "^2.4.0" value-or-promise "^1.0.11" - ws "^8.3.0" + ws "8.11.0" -"@graphql-tools/utils@8.8.0", "@graphql-tools/utils@^8.1.1", "@graphql-tools/utils@^8.3.0", "@graphql-tools/utils@^8.6.5", "@graphql-tools/utils@^8.8.0": - version "8.8.0" - resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.8.0.tgz" - integrity sha512-KJrtx05uSM/cPYFdTnGAS1doL5bftJLAiFCDMZ8Vkifztz3BFn3gpFiy/o4wDtM8s39G46mxmt2Km/RmeltfGw== +"@graphql-tools/utils@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.12.0.tgz#243bc4f5fc2edbc9e8fd1038189e57d837cbe31f" + integrity sha512-TeO+MJWGXjUTS52qfK4R8HiPoF/R7X+qmgtOYd8DTH0l6b+5Y/tlg5aGeUJefqImRq7nvi93Ms40k/Uz4D5CWw== dependencies: tslib "^2.4.0" -"@graphql-tools/wrap@8.5.0": - version "8.5.0" - resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-8.5.0.tgz" - integrity sha512-I+x9dBNzC135WWPi04ejqurR/zDmhfeGbCftCaYKF4CvgWd+ZaJx4Uc74n1SBegQtrj+KDrOS4HgKwf9vAVR7A== +"@graphql-tools/utils@9.1.1", "@graphql-tools/utils@^9.1.1": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.1.1.tgz#b47ea8f0d18c038c5c1c429e72caa5c25039fbab" + integrity sha512-DXKLIEDbihK24fktR2hwp/BNIVwULIHaSTNTNhXS+19vgT50eX9wndx1bPxGwHnVBOONcwjXy0roQac49vdt/w== dependencies: - "@graphql-tools/delegate" "8.8.0" - "@graphql-tools/schema" "8.5.0" - "@graphql-tools/utils" "8.8.0" + tslib "^2.4.0" + +"@graphql-tools/utils@^8.1.1", "@graphql-tools/utils@^8.3.0", "@graphql-tools/utils@^8.6.5", "@graphql-tools/utils@^8.8.0", "@graphql-tools/utils@^8.9.0": + version "8.13.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.13.1.tgz#b247607e400365c2cd87ff54654d4ad25a7ac491" + integrity sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/wrap@9.2.18": + version "9.2.18" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-9.2.18.tgz#be19f164dad8c855081b190db9953e6e15b0343c" + integrity sha512-ocdwRM2lDjqXiu/1tpvegmxumYuwHZVLLnzLFuch5i5S10y+EmTqcfgalG/2CbMrPV6BS9t4R7/w6p6+ZbppVg== + dependencies: + "@graphql-tools/delegate" "9.0.17" + "@graphql-tools/schema" "9.0.10" + "@graphql-tools/utils" "9.1.1" tslib "^2.4.0" value-or-promise "1.0.11" +"@graphql-typed-document-node/core@3.1.1", "@graphql-typed-document-node/core@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" + integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -1347,17 +1403,17 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@iarna/toml@^2.2.5": version "2.2.5" - resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" @@ -1365,55 +1421,55 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" "@metamask/eth-sig-util@^4.0.0": version "4.0.1" - resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: ethereumjs-abi "^0.6.8" @@ -1422,24 +1478,24 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@n1ru4l/graphql-live-query@^0.9.0": - version "0.9.0" - resolved "https://registry.npmjs.org/@n1ru4l/graphql-live-query/-/graphql-live-query-0.9.0.tgz" - integrity sha512-BTpWy1e+FxN82RnLz4x1+JcEewVdfmUhV1C6/XYD5AjS7PQp9QFF7K8bCD6gzPTr2l+prvqOyVueQhFJxB1vfg== - -"@noble/hashes@1.1.2", "@noble/hashes@~1.1.1": +"@noble/hashes@1.1.2": version "1.1.2" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== +"@noble/hashes@~1.1.1": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.4.tgz#2611ebf5764c1bf754da7c7794de4fb30512336d" + integrity sha512-+PYsVPrTSqtVjatKt2A/Proukn2Yrz61OBThOCKErc5w2/r1Fh37vbDv0Eah7pyNltrmacjwTvdw3JoR+WE4TA== + "@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": version "1.6.3" - resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -1447,32 +1503,262 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/ethereumjs-block@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz#fdd5c045e7baa5169abeed0e1202bf94e4481c49" + integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-blockchain@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz#1a8c243a46d4d3691631f139bfb3a4a157187b0c" + integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-ethash" "^2.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz#f6bcc7753994555e49ab3aa517fc8bcf89c280b9" + integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== + dependencies: + "@nomicfoundation/ethereumjs-util" "^8.0.0" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz#11539c32fe0990e1122ff987d1b84cfa34774e81" + integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz#99cd173c03b59107c156a69c5e215409098a370b" + integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz#d9a9c5f0f10310c8849b6525101de455a53e771d" + integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== + +"@nomicfoundation/ethereumjs-statemanager@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz#14a9d4e1c828230368f7ab520c144c34d8721e4b" + integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + +"@nomicfoundation/ethereumjs-trie@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz#dcfbe3be53a94bc061c9767a396c16702bc2f5b7" + integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz#59dc7452b0862b30342966f7052ab9a1f7802f52" + integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz#deb2b15d2c308a731e82977aefc4e61ca0ece6c5" + integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz#2bb50d332bf41790b01a3767ffec3987585d1de6" + integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + "@nomicfoundation/hardhat-network-helpers@^1.0.4": - version "1.0.6" - resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz" - integrity sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ== + version "1.0.7" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz#9103be2b359899a8b7996f54df12a1b7977367e3" + integrity sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw== dependencies: ethereumjs-util "^7.1.4" +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz#83a7367342bd053a76d04bbcf4f373fef07cf760" + integrity sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz#1225f7da647ae1ad25a87125664704ecc0af6ccc" + integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz#dbc052dcdfd50ae50fd5ae1788b69b4e0fa40040" + integrity sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz#e6b2eea633995b557e74e881d2a43eab4760903d" + integrity sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz#af81107f5afa794f19988a368647727806e18dc4" + integrity sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" + integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" + integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz#9d4bca1cc9a1333fde985675083b0b7d165f6076" + integrity sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz#0db5bfc6aa952bea4098d8d2c8947b4e5c4337ee" + integrity sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz#2e0f39a2924dcd77db6b419828595e984fabcb33" + integrity sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz#e5ddc43ad5c0aab96e5054520d8e16212e125f50" + integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" + "@nomiclabs/hardhat-ethers@^2.0.5": - version "2.1.1" - resolved "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz" - integrity sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" + integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== + +"@peculiar/asn1-schema@^2.1.6", "@peculiar/asn1-schema@^2.3.0": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz#21418e1f3819e0b353ceff0c2dad8ccb61acd777" + integrity sha512-6GptMYDMyWBHTUKndHaDsRZUO/XMSgIns2krxcm2L7SEExRHwawFvSwNBhqNPR9HJwv3MruAiF1bhN0we6j6GQ== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz#821493bd5ad0f05939bd5f53b28536f68158360a" + integrity sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw== + dependencies: + "@peculiar/asn1-schema" "^2.3.0" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.2" + tslib "^2.4.1" + webcrypto-core "^1.7.4" + +"@repeaterjs/repeater@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" + integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== "@rollup/plugin-commonjs@^21.0.1": version "21.1.0" - resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz#45576d7b47609af2db87f55a6d4b46e44fc3a553" integrity sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -1485,14 +1771,14 @@ "@rollup/plugin-json@^4.1.0": version "4.1.0" - resolved "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== dependencies: "@rollup/pluginutils" "^3.0.8" "@rollup/plugin-node-resolve@^13.0.0": version "13.3.0" - resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -1503,16 +1789,16 @@ resolve "^1.19.0" "@rollup/plugin-typescript@^8.2.1": - version "8.3.3" - resolved "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.3.tgz" - integrity sha512-55L9SyiYu3r/JtqdjhwcwaECXP7JeJ9h1Sg1VWRJKIutla2MdZQodTgcCNybXLMCnqpNLEhS2vGENww98L1npg== + version "8.5.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz#7ea11599a15b0a30fa7ea69ce3b791d41b862515" + integrity sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ== dependencies: "@rollup/pluginutils" "^3.1.0" resolve "^1.17.0" "@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": version "3.1.0" - resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: "@types/estree" "0.0.39" @@ -1521,12 +1807,12 @@ "@scure/base@~1.1.0": version "1.1.1" - resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== "@scure/bip32@1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== dependencies: "@noble/hashes" "~1.1.1" @@ -1535,7 +1821,7 @@ "@scure/bip39@1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== dependencies: "@noble/hashes" "~1.1.1" @@ -1543,7 +1829,7 @@ "@sentry/core@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -1554,7 +1840,7 @@ "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -1563,7 +1849,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -1572,7 +1858,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -1587,7 +1873,7 @@ "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -1598,188 +1884,177 @@ "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/utils@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" tslib "^1.9.3" -"@solidity-parser/parser@^0.14.2": - version "0.14.3" - resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.3.tgz" - integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== - dependencies: - antlr4ts "^0.5.0-alpha.4" - "@tootallnate/once@2": version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@tsconfig/node10@^1.0.7": version "1.0.9" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== "@typechain/ethers-v5@^7.0.1": version "7.2.0" - resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-7.2.0.tgz#d559cffe0efe6bdbc20e644b817f6fa8add5e8f8" integrity sha512-jfcmlTvaaJjng63QsT49MT6R1HFhtO/TBMWbyzPFSzMmVIqb2tL6prnKBs4ZJrSvmgIXWy+ttSjpaxCTq8D/Tw== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" -"@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== +"@types/async-eventemitter@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" + integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== "@types/bn.js@^4.11.3": version "4.11.6" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== dependencies: "@types/node" "*" "@types/chai@^4.2.12": - version "4.3.1" - resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.1.tgz" - integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== -"@types/estree@*", "@types/estree@0.0.39": +"@types/estree@0.0.39": version "0.0.39" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/js-yaml@^4.0.0": version "4.0.5" - resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== "@types/json-schema@^7.0.7": version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json-stable-stringify@^1.0.32": version "1.0.34" - resolved "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" integrity sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/jsonwebtoken@^8.5.0": - version "8.5.8" - resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz" - integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== - dependencies: - "@types/node" "*" - -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== + version "8.5.9" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz#2c064ecb0b3128d837d2764aa0b117b0ff6e4586" + integrity sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg== dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" "@types/node" "*" "@types/lodash@^4.14.177": - version "4.14.182" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz" - integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + version "4.14.191" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== "@types/lru-cache@^5.1.0": version "5.1.1" - resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/mocha@^8.0.3": version "8.2.3" - resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== -"@types/node@*", "@types/node@^15.12.4": +"@types/node@*": + version "18.11.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" + integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ== + +"@types/node@^15.12.4": version "15.14.9" - resolved "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/pbkdf2@^3.0.0": version "3.1.0" - resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== dependencies: "@types/node" "*" "@types/prettier@^2.1.1": - version "2.6.3" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== + version "2.7.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" + integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== "@types/resolve@1.17.1": version "1.17.1" - resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== dependencies: "@types/node" "*" "@types/secp256k1@^4.0.1": version "4.0.3" - resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" "@types/ws@^8.0.0": version "8.5.3" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== dependencies: "@types/node" "*" "@typescript-eslint/eslint-plugin@^4.1.1": version "4.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== dependencies: "@typescript-eslint/experimental-utils" "4.33.0" @@ -1793,7 +2068,7 @@ "@typescript-eslint/experimental-utils@4.33.0": version "4.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== dependencies: "@types/json-schema" "^7.0.7" @@ -1805,7 +2080,7 @@ "@typescript-eslint/parser@^4.1.1": version "4.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== dependencies: "@typescript-eslint/scope-manager" "4.33.0" @@ -1815,7 +2090,7 @@ "@typescript-eslint/scope-manager@4.33.0": version "4.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== dependencies: "@typescript-eslint/types" "4.33.0" @@ -1823,12 +2098,12 @@ "@typescript-eslint/types@4.33.0": version "4.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== "@typescript-eslint/typescript-estree@4.33.0": version "4.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== dependencies: "@typescript-eslint/types" "4.33.0" @@ -1841,7 +2116,7 @@ "@typescript-eslint/visitor-keys@4.33.0": version "4.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== dependencies: "@typescript-eslint/types" "4.33.0" @@ -1849,91 +2124,98 @@ "@ungap/promise-all-settled@1.1.2": version "1.1.2" - resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -"@whatwg-node/fetch@^0.0.2": - version "0.0.2" - resolved "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.0.2.tgz" - integrity sha512-qiZn8dYRg0POzUvmHBs7blLxl6DPL+b+Z0JUsGaj7/8PFe2BJG9onrUVX6OWh6Z9YhcYw8yu+wtCAme5ZMiCKQ== +"@whatwg-node/fetch@0.5.3", "@whatwg-node/fetch@^0.5.0": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.5.3.tgz#afbd38a2e5392d91318845b967529076ca654b9e" + integrity sha512-cuAKL3Z7lrJJuUrfF1wxkQTb24Qd1QO/lsjJpM5ZSZZzUMms5TPnbGeGUKWA3hVKNHh30lVfr2MyRCT5Jfkucw== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + abort-controller "^3.0.0" + busboy "^1.6.0" + form-data-encoder "^1.7.1" + formdata-node "^4.3.1" + node-fetch "^2.6.7" + undici "^5.12.0" + web-streams-polyfill "^3.2.0" + +"@whatwg-node/fetch@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.3.2.tgz#da4323795c26c135563ba01d49dc16037bec4287" + integrity sha512-Bs5zAWQs0tXsLa4mRmLw7Psps1EN78vPtgcLpw3qPY8s6UYPUM67zFZ9cy+7tZ64PXhfwzxJn+m7RH2Lq48RNQ== dependencies: + "@peculiar/webcrypto" "^1.4.0" abort-controller "^3.0.0" busboy "^1.6.0" + event-target-polyfill "^0.0.3" form-data-encoder "^1.7.1" formdata-node "^4.3.1" node-fetch "^2.6.7" - undici "5.5.1" + undici "^5.8.0" web-streams-polyfill "^3.2.0" abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" acorn-jsx@^5.3.1: version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^7.4.0: version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.4.1, acorn@^8.5.0: - version "8.8.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== adm-zip@^0.4.16: version "0.4.16" - resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -1941,7 +2223,7 @@ aggregate-error@^3.0.0: ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1950,9 +2232,9 @@ ajv@^6.10.0, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1961,141 +2243,145 @@ ajv@^8.0.1: ansi-colors@4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -antlr4ts@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== - anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" arg@^4.1.0: version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-back@^1.0.3, array-back@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== dependencies: typical "^2.6.0" array-back@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== dependencies: typical "^2.6.1" array-union@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== arrify@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== asap@~2.0.3: version "2.0.6" - resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-eventemitter@^0.2.4: version "0.2.4" - resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== dependencies: async "^2.4.0" async@^2.4.0: version "2.6.4" - resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== auto-bind@~4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== axios-mock-adapter@^1.21.2: version "1.21.2" - resolved "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.2.tgz" + resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.21.2.tgz#87a48f80aa89bb1ab1ad630fa467975e30aa4721" integrity sha512-jzyNxU3JzB2XVhplZboUcF0YDs7xuExzoRSHXPHr+UQajaGmcTqvkkUADgkVI2WkGlpZ1zZlMVdcTMU0ejV8zQ== dependencies: fast-deep-equal "^3.1.3" @@ -2103,26 +2389,19 @@ axios-mock-adapter@^1.21.2: axios@^0.24.0: version "0.24.0" - resolved "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== dependencies: follow-redirects "^1.14.4" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: version "7.0.0-beta.0" - resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== babel-preset-fbjs@^3.4.0: version "3.4.0" - resolved "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== dependencies: "@babel/plugin-proposal-class-properties" "^7.0.0" @@ -2155,34 +2434,46 @@ babel-preset-fbjs@^3.4.0: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: version "3.0.9" - resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bech32@1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bigint-crypto-utils@^3.0.23: + version "3.1.7" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.7.tgz#c4c1b537c7c1ab7aadfaecf3edfd45416bf2c651" + integrity sha512-zpCQpIE2Oy5WIQpjC9iYZf8Uh9QqoS51ZCooAcNvzv1AQ3VWdT52D0ksr1+/faeK8HVIej1bxXcP75YcqH3KPA== + dependencies: + bigint-mod-arith "^3.1.0" + +bigint-mod-arith@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" + integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== + binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bl@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -2191,22 +2482,22 @@ bl@^4.1.0: blakejs@^1.1.0: version "1.2.1" - resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2214,31 +2505,41 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: +brorand@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + browser-stdout@1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -2248,26 +2549,26 @@ browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserslist@^4.20.2: - version "4.21.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz" - integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== +browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== dependencies: - caniuse-lite "^1.0.30001366" - electron-to-chromium "^1.4.188" + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" node-releases "^2.0.6" - update-browserslist-db "^1.0.4" + update-browserslist-db "^1.0.9" bs58@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" bs58check@^2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -2276,61 +2577,62 @@ bs58check@^2.1.2: bser@2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-equal-constant-time@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer-xor@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz" - integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== - dependencies: - safe-buffer "^5.1.1" - -buffer@^5.5.0, buffer@^5.6.0, buffer@^5.7.1: +buffer@^5.5.0: version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" ieee754 "^1.1.13" -builtin-modules@^3.0.0: +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtin-modules@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== busboy@^1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" bytes@3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -2338,12 +2640,12 @@ call-bind@^1.0.0: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" @@ -2351,36 +2653,41 @@ camel-case@^4.1.2: camelcase@^5.0.0: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001366: - version "1.0.30001370" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz" - integrity sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g== +caniuse-lite@^1.0.30001400: + version "1.0.30001436" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b" + integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg== capital-case@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== dependencies: no-case "^3.0.4" tslib "^2.0.3" upper-case-first "^2.0.2" +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + chai@^4.2.0: - version "4.3.6" - resolved "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" - deep-eql "^3.0.1" + deep-eql "^4.1.2" get-func-name "^2.0.0" loupe "^2.3.1" pathval "^1.1.1" @@ -2388,7 +2695,7 @@ chai@^4.2.0: chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2397,7 +2704,7 @@ chalk@^2.0.0, chalk@^2.4.2: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2405,7 +2712,7 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: change-case-all@1.0.14: version "1.0.14" - resolved "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" integrity sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA== dependencies: change-case "^4.1.2" @@ -2421,7 +2728,7 @@ change-case-all@1.0.14: change-case@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== dependencies: camel-case "^4.1.2" @@ -2439,17 +2746,17 @@ change-case@^4.1.2: chardet@^0.7.0: version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== check-error@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== chokidar@3.5.1: version "3.5.1" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: anymatch "~3.1.1" @@ -2464,7 +2771,7 @@ chokidar@3.5.1: chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -2479,37 +2786,48 @@ chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" +classic-level@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" + integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-spinners@^2.5.0: version "2.7.0" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -2517,12 +2835,12 @@ cli-truncate@^2.1.0: cli-width@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -2531,62 +2849,71 @@ cliui@^6.0.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone@^1.0.2: version "1.0.4" - resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.16: version "2.0.19" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== command-line-args@^4.0.7: version "4.0.7" - resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46" integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== dependencies: array-back "^2.0.0" @@ -2595,32 +2922,32 @@ command-line-args@^4.0.7: commander@3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== commander@^2.20.0: version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== common-tags@1.8.2: version "1.8.2" - resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== constant-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== dependencies: no-case "^3.0.4" @@ -2628,32 +2955,35 @@ constant-case@^3.0.4: upper-case "^2.0.2" convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== cookie@^0.4.1: version "0.4.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -core-js-pure@^3.0.1: - version "3.25.0" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz" - integrity sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A== - cosmiconfig-toml-loader@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/cosmiconfig-toml-loader/-/cosmiconfig-toml-loader-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig-toml-loader/-/cosmiconfig-toml-loader-1.0.0.tgz#0681383651cceff918177debe9084c0d3769509b" integrity sha512-H/2gurFWVi7xXvCyvsWRLCMekl4tITJcX0QEsDMpzxtuxDyM59xLatYNg4s/k9AA/HdtCYfj2su8mgA0GSDLDA== dependencies: "@iarna/toml" "^2.2.5" -cosmiconfig@7.0.1, cosmiconfig@^7.0.0: +cosmiconfig-typescript-loader@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.1.1.tgz#38dd3578344038dae40fdf09792bc2e9df529f78" + integrity sha512-9DHpa379Gp0o0Zefii35fcmuuin6q92FnLDffzdZ0l9tVd3nEobG3O+MZ06+kuBvFTSVScvNb/oHA13Nd4iipg== + +cosmiconfig-typescript-loader@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.2.0.tgz#a3cfd0dd9dac86be7dbe5f53eb46ad03abdf417b" + integrity sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g== + +cosmiconfig@7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" @@ -2662,14 +2992,25 @@ cosmiconfig@7.0.1, cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + crc-32@^1.2.0: version "1.2.2" - resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -2680,7 +3021,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -2692,19 +3033,19 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@^3.0.6, cross-fetch@^3.1.5: version "3.1.5" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" cross-spawn@^7.0.2: version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -2713,130 +3054,114 @@ cross-spawn@^7.0.2: dataloader@2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/dataloader/-/dataloader-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.1.0.tgz#c69c538235e85e7ac6c6c444bae8ecabf5de9df7" integrity sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ== debounce@^1.2.0: version "1.2.1" - resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" debug@4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz" - integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - -define-properties@^1.1.3: - version "1.1.4" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== dependency-graph@^0.11.0: version "0.11.0" - resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== detect-indent@^6.0.0: version "6.1.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== diff@5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== diff@^3.1.0: version "3.5.0" - resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diff@^4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -2844,34 +3169,34 @@ dot-case@^3.0.4: dotenv@^10.0.0: version "10.0.0" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== dotenv@^16.0.0: - version "16.0.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz" - integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -dset@^3.1.2: +dset@3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== ecdsa-sig-formatter@1.0.11: version "1.0.11" - resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== dependencies: safe-buffer "^5.0.1" -electron-to-chromium@^1.4.188: - version "1.4.201" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.201.tgz" - integrity sha512-87D0gEHbhLZgZxZl2e9/rC/I2BicPC/y9wR/cuaJSqvkgN41s5EImi89S7YExHc7F0OBXiKsABZt9mmb9bqFcQ== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -2884,19 +3209,9 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - encoding@^0.1.11: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -2906,62 +3221,55 @@ encoding@^0.1.11: enquirer@^2.3.0, enquirer@^2.3.5: version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -errno@~0.1.1: - version "0.1.8" - resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" escalade@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== eslint-plugin-mocha-no-only@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/eslint-plugin-mocha-no-only/-/eslint-plugin-mocha-no-only-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha-no-only/-/eslint-plugin-mocha-no-only-1.1.1.tgz#2da56949776e8c5455cfeb67f2747d2d8cf522fc" integrity sha512-b+vgjJQ3SjRQCygBhomtjzvRQRpIP8Yd9cqwNSbcoVJREuNajao7M1Kl1aObAUc4wx98qsZyQyUSUxiAbMS9yA== dependencies: requireindex "~1.1.0" eslint-plugin-prettier@^3.1.4: version "3.4.1" - resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== dependencies: prettier-linter-helpers "^1.0.0" eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -2969,31 +3277,31 @@ eslint-scope@^5.1.1: eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@^7.9.0: version "7.32.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -3039,7 +3347,7 @@ eslint@^7.9.0: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -3048,51 +3356,51 @@ espree@^7.3.0, espree@^7.3.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== estree-walker@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -ethereum-cryptography@^0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" - resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -3113,7 +3421,7 @@ ethereum-cryptography@^0.1.3: ethereum-cryptography@^1.0.3: version "1.1.2" - resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== dependencies: "@noble/hashes" "1.1.2" @@ -3123,7 +3431,7 @@ ethereum-cryptography@^1.0.3: ethereumjs-abi@^0.6.8: version "0.6.8" - resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: bn.js "^4.11.8" @@ -3131,7 +3439,7 @@ ethereumjs-abi@^0.6.8: ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -3142,9 +3450,9 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: +ethereumjs-util@^7.1.4: version "7.1.5" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" @@ -3154,9 +3462,9 @@ ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: rlp "^2.2.4" ethers@^5.0.0: - version "5.7.0" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz" - integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" "@ethersproject/abstract-provider" "5.7.0" @@ -3173,10 +3481,10 @@ ethers@^5.0.0: "@ethersproject/json-wallets" "5.7.0" "@ethersproject/keccak256" "5.7.0" "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.0" + "@ethersproject/networks" "5.7.1" "@ethersproject/pbkdf2" "5.7.0" "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.0" + "@ethersproject/providers" "5.7.2" "@ethersproject/random" "5.7.0" "@ethersproject/rlp" "5.7.0" "@ethersproject/sha2" "5.7.0" @@ -3186,25 +3494,30 @@ ethers@^5.0.0: "@ethersproject/transactions" "5.7.0" "@ethersproject/units" "5.7.0" "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.0" + "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" - resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +event-target-polyfill@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/event-target-polyfill/-/event-target-polyfill-0.0.3.tgz#ed373295f3b257774b5d75afb2599331d9f3406c" + integrity sha512-ZMc6UuvmbinrCk4RzGyVmRyIsAyxMRlp4CqSrcQRO8Dy0A9ldbiRy5kdtBj4OtP7EClGdqGfIqo9JmOClMsGLQ== + event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -3212,7 +3525,7 @@ evp_bytestokey@^1.0.3: external-editor@^3.0.3: version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -3221,28 +3534,28 @@ external-editor@^3.0.3: extract-files@^11.0.0: version "11.0.0" - resolved "https://registry.npmjs.org/extract-files/-/extract-files-11.0.0.tgz" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== extract-files@^9.0.0: version "9.0.0" - resolved "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3252,36 +3565,36 @@ fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.14.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" + integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== dependencies: reusify "^1.0.4" fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" fbjs-css-vars@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== fbjs@^3.0.0: version "3.0.4" - resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== dependencies: cross-fetch "^3.1.5" @@ -3294,28 +3607,28 @@ fbjs@^3.0.0: figures@^3.0.0: version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-replace@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== dependencies: array-back "^1.0.4" @@ -3323,7 +3636,7 @@ find-replace@^1.0.3: find-up@5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -3331,14 +3644,14 @@ find-up@5.0.0: find-up@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -3346,14 +3659,14 @@ find-up@^4.1.0: fishery@^2.2.2: version "2.2.2" - resolved "https://registry.npmjs.org/fishery/-/fishery-2.2.2.tgz" + resolved "https://registry.yarnpkg.com/fishery/-/fishery-2.2.2.tgz#94d3d9380295dd3ce555021e9353c5348b8beb77" integrity sha512-jeU0nDhPHJkupmjX+r9niKgVMTBDB8X+U/pktoGHAiWOSyNlMd0HhmqnjrpjUOCDPJYaSSu4Ze16h6dZOKSp2w== dependencies: lodash.mergewith "^4.6.2" flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -3361,27 +3674,27 @@ flat-cache@^3.0.4: flat@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.12.1, follow-redirects@^1.14.4: - version "1.15.1" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== form-data-encoder@^1.7.1: version "1.7.2" - resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== form-data@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" @@ -3389,21 +3702,26 @@ form-data@^3.0.0: mime-types "^2.1.12" formdata-node@^4.3.1: - version "4.3.3" - resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.3.3.tgz" - integrity sha512-coTew7WODO2vF+XhpUdmYz4UBvlsiTMSNaFYZlrXIqYbFd4W7bMwnoALNLE6uvNgzTg2j1JDF0ZImEfF06VPAA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" + integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== dependencies: node-domexception "1.0.0" - web-streams-polyfill "4.0.0-beta.1" + web-streams-polyfill "4.0.0-beta.3" -fp-ts@1.19.3, fp-ts@^1.0.0: +fp-ts@1.19.3: version "1.19.3" - resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + fs-extra@^0.30.0: version "0.30.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" @@ -3414,7 +3732,7 @@ fs-extra@^0.30.0: fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -3423,7 +3741,7 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.1, fsevents@~2.3.2: @@ -3433,33 +3751,33 @@ fsevents@~2.3.1, fsevents@~2.3.2: function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: +functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== +get-intrinsic@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -3467,14 +3785,14 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@7.1.6: version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" @@ -3486,7 +3804,7 @@ glob@7.1.6: glob@7.2.0: version "7.2.0" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -3498,7 +3816,7 @@ glob@7.2.0: glob@^7.1.1, glob@^7.1.3, glob@^7.1.6: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -3510,19 +3828,19 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.6: globals@^11.1.0: version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.17.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + version "13.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" + integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" globby@^11.0.3: version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -3534,15 +3852,14 @@ globby@^11.0.3: graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graphql-config@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/graphql-config/-/graphql-config-4.3.1.tgz" - integrity sha512-czBWzJSGaLJfOHBLuUTZVRTjfgohPfvlaeN1B5nXBVptFARpiFuS7iI4FnRhCGwm6qt1h2j1g05nkg0OIGA6bg== +graphql-config@4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-4.3.6.tgz#908ef03d6670c3068e51fe2e84e10e3e0af220b6" + integrity sha512-i7mAPwc0LAZPnYu2bI8B6yXU5820Wy/ArvmOseDLZIu0OU1UTULEuexHo6ZcHXeT9NvGGaUPQZm8NV3z79YydA== dependencies: - "@endemolshinegroup/cosmiconfig-typescript-loader" "3.0.2" "@graphql-tools/graphql-file-loader" "^7.3.7" "@graphql-tools/json-file-loader" "^7.3.7" "@graphql-tools/load" "^7.5.5" @@ -3551,63 +3868,72 @@ graphql-config@^4.3.1: "@graphql-tools/utils" "^8.6.5" cosmiconfig "7.0.1" cosmiconfig-toml-loader "1.0.0" + cosmiconfig-typescript-loader "^4.0.0" minimatch "4.2.1" string-env-interpolation "1.0.1" + ts-node "^10.8.1" + tslib "^2.4.0" graphql-request@^3.5.0: version "3.7.0" - resolved "https://registry.npmjs.org/graphql-request/-/graphql-request-3.7.0.tgz" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-3.7.0.tgz#c7406e537084f8b9788541e3e6704340ca13055b" integrity sha512-dw5PxHCgBneN2DDNqpWu8QkbbJ07oOziy8z+bK/TAXufsOLaETuVO4GkXrbs0WjhdKhBMN3BkpN/RIvUHkmNUQ== dependencies: cross-fetch "^3.0.6" extract-files "^9.0.0" form-data "^3.0.0" -graphql-request@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/graphql-request/-/graphql-request-4.3.0.tgz" - integrity sha512-2v6hQViJvSsifK606AliqiNiijb1uwWp6Re7o0RTyH+uRTv/u7Uqm2g4Fjq/LgZIzARB38RZEvVBFOQOVdlBow== +graphql-request@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-5.0.0.tgz#7504a807d0e11be11a3c448e900f0cc316aa18ef" + integrity sha512-SpVEnIo2J5k2+Zf76cUkdvIRaq5FMZvGQYnA4lUWYbc99m+fHh4CZYRRO/Ff4tCLQ613fzCm3SiDT64ubW5Gyw== dependencies: + "@graphql-typed-document-node/core" "^3.1.1" cross-fetch "^3.1.5" extract-files "^9.0.0" form-data "^3.0.0" graphql-tag@^2.11.0: version "2.12.6" - resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== dependencies: tslib "^2.1.0" -graphql-ws@^5.4.1: - version "5.9.1" - resolved "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.9.1.tgz" - integrity sha512-mL/SWGBwIT9Meq0NlfS55yXXTOeWPMbK7bZBEZhFu46bcGk1coTx2Sdtzxdk+9yHWngD+Fk1PZDWaAutQa9tpw== +graphql-ws@5.11.2: + version "5.11.2" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.11.2.tgz#d5e0acae8b4d4a4cf7be410a24135cfcefd7ddc0" + integrity sha512-4EiZ3/UXYcjm+xFGP544/yW1+DVI8ZpKASFbzrV5EDTFWJp0ZvLl4Dy2fSZAzz9imKp5pZMIcjB0x/H69Pv/6w== graphql@^15.6.1: version "15.8.0" - resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== growl@1.10.5: version "1.10.5" - resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== hardhat@^2.9.3: - version "2.10.2" - resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.10.2.tgz" - integrity sha512-L/KvDDT/MA6332uAtYTqdcHoSABljw4pPjHQe5SHdIJ+xKfaSc6vDKw03CmrQ5Xup0gHs8XnVSBpZo1AbbIW7g== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/blockchain" "^5.5.2" - "@ethereumjs/common" "^2.6.4" - "@ethereumjs/tx" "^3.5.1" - "@ethereumjs/vm" "^5.9.0" + version "2.12.3" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.3.tgz#1824c5d5e2bcc61601bee429053ccecb4dbc0adb" + integrity sha512-qxOvRNgQnLqRFssn5f8VP5KN3caytShU0HNeKxmPVK1Ix/0xDVhIC7JOLxG69DjOihUfmxmjqspsHbZvFj6EhQ== + dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@nomicfoundation/ethereumjs-vm" "^6.0.0" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.2" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" @@ -3622,15 +3948,14 @@ hardhat@^2.9.3: env-paths "^2.2.0" ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.4" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.4" mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" @@ -3638,11 +3963,9 @@ hardhat@^2.9.3: raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" undici "^5.4.0" uuid "^8.3.2" @@ -3650,36 +3973,29 @@ hardhat@^2.9.3: has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.1, has-symbols@^1.0.3: +has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" @@ -3688,7 +4004,7 @@ hash-base@^3.0.0: hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -3696,12 +4012,12 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: he@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== header-case@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== dependencies: capital-case "^1.0.4" @@ -3709,7 +4025,7 @@ header-case@^2.0.4: hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -3718,7 +4034,7 @@ hmac-drbg@^1.0.1: http-errors@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -3729,7 +4045,7 @@ http-errors@2.0.0: http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: "@tootallnate/once" "2" @@ -3738,7 +4054,7 @@ http-proxy-agent@^5.0.0: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -3746,7 +4062,7 @@ https-proxy-agent@^5.0.0: iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -3758,44 +4074,34 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^4.0.6: version "4.0.6" - resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== + version "5.2.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" + integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== immutable@^4.0.0-rc.12: version "4.1.0" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== immutable@~3.7.6: version "3.7.6" - resolved "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" integrity sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -3803,36 +4109,36 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: import-from@4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inquirer@^8.0.0: - version "8.2.4" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz" - integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -3852,21 +4158,21 @@ inquirer@^8.0.0: invariant@^2.2.4: version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" io-ts@1.10.4: version "1.10.4" - resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: fp-ts "^1.0.0" is-absolute@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== dependencies: is-relative "^1.0.0" @@ -3874,99 +4180,99 @@ is-absolute@^1.0.0: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-buffer@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-builtin-module@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz" - integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" + integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw== dependencies: - builtin-modules "^3.0.0" + builtin-modules "^3.3.0" is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== is-interactive@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== is-lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== dependencies: tslib "^2.0.3" is-module@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-reference@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== dependencies: "@types/estree" "*" is-relative@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== dependencies: is-unc-path "^1.0.0" @@ -3978,31 +4284,31 @@ is-stream@^1.0.1: is-unc-path@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== dependencies: unc-path-regex "^0.1.2" is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-upper-case@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== dependencies: tslib "^2.0.3" is-windows@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isomorphic-fetch@^2.2.1: @@ -4015,20 +4321,20 @@ isomorphic-fetch@^2.2.1: isomorphic-fetch@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== dependencies: node-fetch "^2.6.1" whatwg-fetch "^3.4.1" -isomorphic-ws@^5.0.0: +isomorphic-ws@5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== jest-worker@^26.2.1: version "26.6.2" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: "@types/node" "*" @@ -4037,31 +4343,31 @@ jest-worker@^26.2.1: js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== dependencies: argparse "^2.0.1" js-yaml@4.1.0, js-yaml@^4.0.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -4069,44 +4375,44 @@ js-yaml@^3.13.1: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - integrity sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== dependencies: - jsonify "~0.0.0" + jsonify "^0.0.1" json-to-graphql-query@^2.2.4: version "2.2.4" - resolved "https://registry.npmjs.org/json-to-graphql-query/-/json-to-graphql-query-2.2.4.tgz" + resolved "https://registry.yarnpkg.com/json-to-graphql-query/-/json-to-graphql-query-2.2.4.tgz#ada9cfdbb9bf38589fd2661e1588d1edd0a882cc" integrity sha512-vNvsOKDSlEqYCzejI1xHS9Hm738dSnG4Upy09LUGqyybZXSIIb7NydDphB/6WxW2EEVpPU4JeU/Yo63Nw9dEJg== json-to-pretty-yaml@^1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" integrity sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A== dependencies: remedial "^1.0.7" @@ -4114,38 +4420,38 @@ json-to-pretty-yaml@^1.2.2: json5@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: minimist "^1.2.0" json5@^2.2.1: version "2.2.1" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - integrity sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA== +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== jsonwebtoken@^8.5.1: version "8.5.1" - resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== dependencies: jws "^3.2.2" @@ -4161,7 +4467,7 @@ jsonwebtoken@^8.5.1: jwa@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== dependencies: buffer-equal-constant-time "1.0.1" @@ -4170,15 +4476,15 @@ jwa@^1.4.1: jws@^3.2.2: version "3.2.2" - resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== dependencies: jwa "^1.4.1" safe-buffer "^5.0.1" -keccak@^3.0.0: +keccak@^3.0.0, keccak@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" @@ -4187,85 +4493,35 @@ keccak@^3.0.0: klaw@^1.0.0: version "1.3.1" - resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== -level-supports@~1.0.0: +level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: - xtend "^4.0.2" - -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== - dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" + buffer "^6.0.3" + module-error "^1.0.1" -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + browser-level "^1.0.1" + classic-level "^1.2.0" levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -4273,12 +4529,12 @@ levn@^0.4.1: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== listr2@^4.0.5: version "4.0.5" - resolved "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== dependencies: cli-truncate "^2.1.0" @@ -4292,7 +4548,7 @@ listr2@^4.0.5: locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" @@ -4300,88 +4556,83 @@ locate-path@^2.0.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" -lodash.get@^4: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - lodash.includes@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== lodash.isboolean@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== lodash.isinteger@^4.0.4: version "4.0.4" - resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== lodash.isnumber@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.isstring@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.mergewith@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== lodash.once@^4.0.0: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.0: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: chalk "^4.0.0" log-symbols@4.1.0, log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -4389,7 +4640,7 @@ log-symbols@4.1.0, log-symbols@^4.0.0, log-symbols@^4.1.0: log-update@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -4399,232 +4650,203 @@ log-update@^4.0.0: loose-envify@^1.0.0: version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" lower-case-first@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== dependencies: tslib "^2.0.3" lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lru_map@^0.3.3: version "0.3.3" - resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== -ltgt@~2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - magic-string@^0.25.7: version "0.25.9" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: sourcemap-codec "^1.4.8" -make-error@^1, make-error@^1.1.1: +make-error@^1.1.1: version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== map-cache@^0.2.0: version "0.2.2" - resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== mcl-wasm@^0.7.1: version "0.7.9" - resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" safe-buffer "^5.1.2" -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + 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, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - -meros@^1.1.4: - version "1.2.0" - resolved "https://registry.npmjs.org/meros/-/meros-1.2.0.tgz" - integrity sha512-3QRZIS707pZQnijHdhbttXRWwrHhZJ/gzolneoxKVz9N/xmsvY/7Ls8lpnI9gxbgxjcHsAVEW3mgwiZCo6kkJQ== +meros@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.2.1.tgz#056f7a76e8571d0aaf3c7afcbe7eb6407ff7329e" + integrity sha512-R2f/jxYqCAGI19KhAvaxSOxALBMkaXWH2a7rOyqQw+ZmizX5bKkEYWLzdhC+U82ZVVPVp6MCXe3EkVligh+12g== micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + 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.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimatch@4.2.1: version "4.2.1" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== dependencies: brace-expansion "^1.1.7" minimatch@5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: brace-expansion "^2.0.1" minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== mkdirp@^0.5.1: version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mnemonist@^0.38.0: version "0.38.5" - resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + version "10.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" + integrity sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.3" @@ -4649,7 +4871,7 @@ mocha@^10.0.0: mocha@^8.2.1: version "8.4.0" - resolved "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== dependencies: "@ungap/promise-all-settled" "1.1.2" @@ -4680,42 +4902,52 @@ mocha@^8.2.1: mockdate@^3.0.5: version "3.0.5" - resolved "https://registry.npmjs.org/mockdate/-/mockdate-3.0.5.tgz" + resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb" integrity sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ== -ms@2.1.2, ms@^2.1.1: +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + +ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mute-stream@0.0.8: version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nanoid@3.1.20: version "3.1.20" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== nanoid@3.3.3: version "3.3.3" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -4723,17 +4955,17 @@ no-case@^3.0.4: node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-domexception@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" @@ -4746,85 +4978,70 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-gyp-build@^4.2.0: +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.5.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== normalize-path@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== nullthrows@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== object-assign@^4.1.0: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.9.0: version "1.12.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - obliterator@^2.0.0: version "2.0.4" - resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== once@^1.3.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optionator@^0.9.1: version "0.9.1" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -4836,7 +5053,7 @@ optionator@^0.9.1: ora@^5.4.1: version "5.4.1" - resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: bl "^4.1.0" @@ -4851,71 +5068,71 @@ ora@^5.4.1: os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-limit@3.1.0, p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== param-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -4923,14 +5140,14 @@ param-case@^3.0.4: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-filepath@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== dependencies: is-absolute "^1.0.0" @@ -4939,7 +5156,7 @@ parse-filepath@^1.0.2: parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -4949,7 +5166,7 @@ parse-json@^5.0.0: pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -4957,7 +5174,7 @@ pascal-case@^3.1.2: path-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== dependencies: dot-case "^3.0.4" @@ -4965,54 +5182,54 @@ path-case@^3.0.4: path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-root-regex@^0.1.0: version "0.1.2" - resolved "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== path-root@^0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== dependencies: path-root-regex "^0.1.0" path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17: version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -5023,75 +5240,82 @@ pbkdf2@^3.0.17: picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" prettier@^2.1.2: - version "2.7.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + version "2.8.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== progress@^2.0.0: version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== promise@^7.1.1: version "7.3.1" - resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - punycode@^2.1.0: version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pvtsutils@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" + integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== + dependencies: + tslib "^2.4.0" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + qs@^6.7.0: version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -queue-microtask@^1.2.2: +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" raw-body@^2.4.1: version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" @@ -5099,9 +5323,9 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -5110,31 +5334,31 @@ readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: readdirp@~3.5.0: version "3.5.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regexpp@^3.1.0: version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== relay-runtime@12.0.0: version "12.0.0" - resolved "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== dependencies: "@babel/runtime" "^7.0.0" @@ -5143,64 +5367,59 @@ relay-runtime@12.0.0: remedial@^1.0.7: version "1.0.8" - resolved "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== remove-trailing-separator@^1.0.1: version "1.1.0" - resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== remove-trailing-spaces@^1.0.6: version "1.0.8" - resolved "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== -replaceall@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz" - integrity sha512-sL26E4+8Kec7bwpRjHlQvbNZcpnGroT3PA7ywsgH6GjzxAg4IGNlNalLoRC/JmTed7cMhyDbi44pWw1kMhDxlw== - require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== requireindex@~1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" integrity sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg== resolve-from@5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@1.17.0: version "1.17.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" resolve@^1.17.0, resolve@^1.19.0: version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -5209,7 +5428,7 @@ resolve@^1.17.0, resolve@^1.19.0: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -5217,31 +5436,31 @@ restore-cursor@^3.1.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== rimraf@^2.2.8: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -5249,14 +5468,14 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" - resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: bn.js "^5.2.0" rollup-plugin-dts@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz#2b628d88f864d271d6eaec2e4c2a60ae4e944c5c" integrity sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw== dependencies: magic-string "^0.25.7" @@ -5265,7 +5484,7 @@ rollup-plugin-dts@^3.0.2: rollup-plugin-terser@^7.0.2: version "7.0.2" - resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== dependencies: "@babel/code-frame" "^7.10.4" @@ -5274,95 +5493,92 @@ rollup-plugin-terser@^7.0.2: terser "^5.0.0" rollup@^2.52.8: - version "2.77.1" - resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.1.tgz" - integrity sha512-GhutNJrvTYD6s1moo+kyq7lD9DeR5HDyXo4bDFlDSkepC9kVKY+KK/NSZFzCmeXeia3kEzVuToQmHRdugyZHxw== + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== optionalDependencies: fsevents "~2.3.2" run-async@^2.4.0: version "2.4.1" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rustbn.js@~0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== rxjs@^7.5.5: - version "7.5.6" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz" - integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== + version "7.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.6.0.tgz#361da5362b6ddaa691a2de0b4f2d32028f1eb5a2" + integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ== dependencies: tslib "^2.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== scuid@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/scuid/-/scuid-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== secp256k1@^4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz" - integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== - semver@^5.5.0, semver@^5.6.0: version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.3.0: version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.2.1, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" sentence-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== dependencies: no-case "^3.0.4" @@ -5371,43 +5587,43 @@ sentence-case@^3.0.4: serialize-javascript@5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" serialize-javascript@6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" serialize-javascript@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: randombytes "^2.1.0" set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -5415,19 +5631,24 @@ sha.js@^2.4.0, sha.js@^2.4.8: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.7.3: + version "1.7.4" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" + integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -5436,22 +5657,22 @@ side-channel@^1.0.4: signal-exit@^3.0.2: version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signedsource@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" integrity sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww== slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -5460,7 +5681,7 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -5469,7 +5690,7 @@ slice-ansi@^4.0.0: snake-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== dependencies: dot-case "^3.0.4" @@ -5477,7 +5698,7 @@ snake-case@^3.0.4: solc@0.7.3: version "0.7.3" - resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" @@ -5490,9 +5711,9 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.13, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -5500,51 +5721,51 @@ source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5. source-map@^0.6.0: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== sponge-case@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== dependencies: tslib "^2.0.3" sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stacktrace-parser@^0.1.10: version "0.1.10" - resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" statuses@2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== string-env-interpolation@1.0.1, string-env-interpolation@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== "string-width@^1.0.2 || 2": version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -5552,7 +5773,7 @@ string-env-interpolation@1.0.1, string-env-interpolation@^1.0.1: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -5561,87 +5782,79 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-hex-prefix@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" 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.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@8.1.1: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swap-case@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== dependencies: tslib "^2.0.3" -sync-fetch@0.4.1, sync-fetch@^0.4.0: - version "0.4.1" - resolved "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.4.1.tgz" - integrity sha512-JDtyFEvnKUzt1CxRtzzsGgkBanEv8XRmLyJo0F0nGkpCR8EjYmpOJJXz8GA/SWtlPU0nAYh0+CNMNnFworGyOA== - dependencies: - buffer "^5.7.1" - node-fetch "^2.6.1" - table@^6.0.9: - version "6.8.0" - resolved "https://registry.npmjs.org/table/-/table-6.8.0.tgz" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -5650,9 +5863,9 @@ table@^6.0.9: strip-ansi "^6.0.1" terser@^5.0.0: - version "5.15.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz" - integrity sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA== + version "5.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -5661,7 +5874,7 @@ terser@^5.0.0: test-value@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== dependencies: array-back "^1.0.3" @@ -5669,73 +5882,68 @@ test-value@^2.1.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== through@^2.3.6, through@^2.3.8: version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tiny-invariant@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== title-case@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== dependencies: tslib "^2.0.3" tmp@0.0.33, tmp@^0.0.33: version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tr46@~0.0.3: version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== - ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== ts-log@^2.2.3: - version "2.2.4" - resolved "https://registry.npmjs.org/ts-log/-/ts-log-2.2.4.tgz" - integrity sha512-DEQrfv6l7IvN2jlzc/VTdZJYsWUnQNCsueYjMkC/iXoEoi5fNan6MjeDqkvhfzbmHgdz9UxDUluX3V5HdjTydQ== + version "2.2.5" + resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.5.tgz#aef3252f1143d11047e2cb6f7cfaac7408d96623" + integrity sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA== ts-mocha@^9.0.2: version "9.0.2" - resolved "https://registry.npmjs.org/ts-mocha/-/ts-mocha-9.0.2.tgz" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-9.0.2.tgz#c1ef0248874d04a0f26dd9bd8d88e617a8d82ab1" integrity sha512-WyQjvnzwrrubl0JT7EC1yWmNpcsU3fOuBFfdps30zbmFBgKniSaSOyZMZx+Wq7kytUs5CY+pEbSYEbGfIKnXTw== dependencies: ts-node "7.0.1" @@ -5744,7 +5952,7 @@ ts-mocha@^9.0.2: ts-node@7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== dependencies: arrify "^1.0.0" @@ -5756,9 +5964,9 @@ ts-node@7.0.1: source-map-support "^0.5.6" yn "^2.0.0" -ts-node@^10.9.1: +ts-node@^10.8.1, ts-node@^10.9.1: version "10.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -5775,21 +5983,9 @@ ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-node@^9: - version "9.1.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" - integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== - dependencies: - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: version "3.14.1" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" @@ -5799,71 +5995,71 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@~2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.4.1, tslib@~2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tslib@~2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsort@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tweetnacl-util@^0.15.1: version "0.15.1" - resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== tweetnacl@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== typechain@^5.1.1: version "5.2.0" - resolved "https://registry.npmjs.org/typechain/-/typechain-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-5.2.0.tgz#10525a44773a34547eb2eed8978cb72c0a39a0f4" integrity sha512-0INirvQ+P+MwJOeMct+WLkUE4zov06QxC96D+i3uGFEHoiSkZN70MKDQsaj8zkL86wQwByJReI2e7fOUwECFuw== dependencies: "@types/prettier" "^2.1.1" @@ -5878,131 +6074,144 @@ typechain@^5.1.1: ts-essentials "^7.0.1" typescript@^4.0.2: - version "4.7.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + version "4.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== typical@^2.6.0, typical@^2.6.1: version "2.6.1" - resolved "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz" + resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + version "0.7.32" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.32.tgz#cd8c639cdca949e30fa68c44b7813ef13e36d211" + integrity sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw== unc-path-regex@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== -undici@5.5.1, undici@^5.4.0: - version "5.5.1" - resolved "https://registry.npmjs.org/undici/-/undici-5.5.1.tgz" - integrity sha512-MEvryPLf18HvlCbLSzCW0U00IMftKGI5udnjrQbC5D4P0Hodwffhv+iGfWuJwg16Y/TK11ZFK8i+BPVW2z/eAw== +undici@^5.12.0, undici@^5.4.0, undici@^5.8.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.13.0.tgz#56772fba89d8b25e39bddc8c26a438bd73ea69bb" + integrity sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q== + dependencies: + busboy "^1.6.0" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unixify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== dependencies: normalize-path "^2.1.1" unpipe@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" picocolors "^1.0.0" upper-case-first@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== dependencies: tslib "^2.0.3" upper-case@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== dependencies: tslib "^2.0.3" uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@^2.0.3: version "2.3.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== value-or-promise@1.0.11, value-or-promise@^1.0.11: version "1.0.11" - resolved "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" -web-streams-polyfill@4.0.0-beta.1: - version "4.0.0-beta.1" - resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz" - integrity sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ== +web-streams-polyfill@4.0.0-beta.3: + version "4.0.0-beta.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" + integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== web-streams-polyfill@^3.2.0: version "3.2.1" - resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== +webcrypto-core@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.5.tgz#c02104c953ca7107557f9c165d194c6316587ca4" + integrity sha512-gaExY2/3EHQlRNNNVSrbG2Cg94Rutl7fAaKILS1w8ZDhGxdFOaw6EbCfHIxPy9vt/xwp5o0VQAx9aySPF6hU1A== + dependencies: + "@peculiar/asn1-schema" "^2.1.6" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.2" + tslib "^2.4.0" + webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-fetch@>=0.10.0, whatwg-fetch@^3.4.1: version "3.6.2" - resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -6010,41 +6219,41 @@ whatwg-url@^5.0.0: which-module@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which@2.0.2, which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" word-wrap@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== workerpool@6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== workerpool@6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -6053,7 +6262,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -6062,75 +6271,80 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@7.4.6, ws@^7.4.6: +ws@7.4.6: version "7.4.6" - resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^8.3.0: - version "8.8.1" - resolved "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz" - integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== +ws@8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== -xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml-ast-parser@^0.0.43: version "0.0.43" - resolved "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@20.2.4, yargs-parser@^20.2.2: +yargs-parser@20.2.4: version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^21.0.0: - version "21.0.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-unparser@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -6140,7 +6354,7 @@ yargs-unparser@2.0.0: yargs@16.2.0: version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -6153,7 +6367,7 @@ yargs@16.2.0: yargs@^15.3.1: version "15.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -6169,29 +6383,29 @@ yargs@^15.3.1: yargs-parser "^18.1.2" yargs@^17.0.0: - version "17.5.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^21.0.0" + yargs-parser "^21.1.1" yn@3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yn@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==