From 829ab7d2a23b6d3b69c3a27e1479bd2f0950dec9 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Tue, 7 Mar 2023 10:40:07 -0500 Subject: [PATCH] chore: move uniswap wrappers --- protocol/ethereum/uniswapv2/integrations.md | 16 - .../ethereum/uniswapv2/wrapper/.eslintrc.js | 73 - .../ethereum/uniswapv2/wrapper/.gitignore | 11 - protocol/ethereum/uniswapv2/wrapper/.nvmrc | 1 - .../ethereum/uniswapv2/wrapper/.prettierrc | 12 - protocol/ethereum/uniswapv2/wrapper/README.md | 7 - .../uniswapv2/wrapper/as-pect.config.js | 73 - .../uniswapv2/wrapper/docker-compose.yaml | 7 - .../ethereum/uniswapv2/wrapper/jest.config.js | 13 - .../ethereum/uniswapv2/wrapper/package.json | 51 - .../uniswapv2/wrapper/polywrap.deploy.yaml | 7 - .../uniswapv2/wrapper/polywrap.infra.yaml | 4 - .../ethereum/uniswapv2/wrapper/polywrap.yaml | 6 - .../src/__tests__/e2e/fetch_e2e.spec.ts | 173 - .../src/__tests__/e2e/pair_e2e.spec.ts | 164 - .../src/__tests__/e2e/route_e2e.spec.ts | 165 - .../src/__tests__/e2e/router_e2e.spec.ts | 432 - .../src/__tests__/e2e/swap_e2e.spec.ts | 195 - .../src/__tests__/e2e/testData/erc20ABI.json | 224 - .../src/__tests__/e2e/testData/tokenList.json | 410 - .../src/__tests__/e2e/trade_e2e.spec.ts | 477 - .../src/__tests__/e2e/types/polywrap.app.yaml | 4 - .../src/__tests__/entities/pair.spec.ts | 265 - .../src/__tests__/entities/route.spec.ts | 92 - .../src/__tests__/entities/router.spec.ts | 569 -- .../src/__tests__/entities/token.spec.ts | 310 - .../src/__tests__/entities/trade.spec.ts | 690 -- .../wrapper/src/__tests__/infraUtils.ts | 97 - .../wrapper/src/__tests__/testUtils.ts | 210 - .../src/__tests__/utils/fraction.spec.ts | 329 - .../uniswapv2/wrapper/src/entities/fetch.ts | 152 - .../uniswapv2/wrapper/src/entities/index.ts | 7 - .../uniswapv2/wrapper/src/entities/pair.ts | 228 - .../uniswapv2/wrapper/src/entities/route.ts | 95 - .../uniswapv2/wrapper/src/entities/router.ts | 179 - .../uniswapv2/wrapper/src/entities/swap.ts | 113 - .../uniswapv2/wrapper/src/entities/token.ts | 47 - .../uniswapv2/wrapper/src/entities/trade.ts | 430 - .../ethereum/uniswapv2/wrapper/src/index.ts | 1 - .../uniswapv2/wrapper/src/schema.graphql | 286 - .../uniswapv2/wrapper/src/utils/Currency.ts | 7 - .../uniswapv2/wrapper/src/utils/Fraction.ts | 143 - .../uniswapv2/wrapper/src/utils/Price.ts | 87 - .../wrapper/src/utils/PriorityQueue.ts | 81 - .../wrapper/src/utils/ProcessedPair.ts | 170 - .../wrapper/src/utils/TradeOptions.ts | 18 - .../uniswapv2/wrapper/src/utils/abi.ts | 25 - .../wrapper/src/utils/addressUtils.ts | 61 - .../uniswapv2/wrapper/src/utils/constants.ts | 6 - .../uniswapv2/wrapper/src/utils/index.ts | 10 - .../uniswapv2/wrapper/src/utils/mathUtils.ts | 66 - .../uniswapv2/wrapper/src/utils/utils.ts | 90 - .../ethereum/uniswapv2/wrapper/tsconfig.json | 12 - .../uniswapv2/wrapper/tsconfig.ts.json | 36 - protocol/ethereum/uniswapv2/wrapper/yarn.lock | 8222 ----------------- .../ethereum/uniswapv3/wrapper/.eslintrc.js | 73 - .../ethereum/uniswapv3/wrapper/.gitignore | 11 - protocol/ethereum/uniswapv3/wrapper/.nvmrc | 1 - .../ethereum/uniswapv3/wrapper/.prettierrc | 12 - protocol/ethereum/uniswapv3/wrapper/README.md | 386 - .../uniswapv3/wrapper/as-pect.config.js | 73 - protocol/ethereum/uniswapv3/wrapper/config.ts | 15 - .../uniswapv3/wrapper/docker-compose.yaml | 7 - .../ethereum/uniswapv3/wrapper/jest.config.js | 13 - .../wrapper/meta/imgs/polywrap-horizontal.svg | 1 - .../wrapper/meta/imgs/uniswap-pink.svg | 13 - .../ethereum/uniswapv3/wrapper/package.json | 52 - .../uniswapv3/wrapper/polywrap.build.yaml | 18 - .../uniswapv3/wrapper/polywrap.deploy.yaml | 12 - .../uniswapv3/wrapper/polywrap.infra.yaml | 4 - .../uniswapv3/wrapper/polywrap.meta.yaml | 18 - .../ethereum/uniswapv3/wrapper/polywrap.yaml | 11 - .../src/__tests__/e2e/helpers/index.ts | 5 - .../src/__tests__/e2e/helpers/infraUtils.ts | 135 - .../src/__tests__/e2e/helpers/testUtils.ts | 121 - .../src/__tests__/e2e/helpers/types.ts | 443 - .../e2e/helpers/uniswapCreatePool.ts | 129 - .../e2e/helpers/wrappedInvocations.ts | 406 - .../call_mainnetFork.spec.ts | 116 - .../deployPool_mainnetFork.spec.ts | 85 - .../fetch_mainnetFork.spec.ts | 133 - .../pool_mainnetFork.spec.ts | 122 - .../route_mainnetFork.spec.ts | 104 - .../router_mainnetFork.spec.ts | 315 - .../swap_mainnetFork.spec.ts | 244 - .../trade_mainnetFork.spec.ts | 199 - .../encodeRouteToPath.spec.ts | 142 - .../sdk-test-replications/multicall.spec.ts | 36 - .../e2e/sdk-test-replications/nfpm.spec.ts | 449 - .../sdk-test-replications/payments.spec.ts | 75 - .../e2e/sdk-test-replications/quoter.spec.ts | 203 - .../e2e/sdk-test-replications/router.spec.ts | 1277 --- .../e2e/sdk-test-replications/staker.spec.ts | 169 - .../src/__tests__/e2e/testData/erc20ABI.json | 224 - .../src/__tests__/e2e/testData/poolList.json | 17 - .../wrapper/src/__tests__/unit/as-pect.d.ts | 1 - .../src/__tests__/unit/core/constants.spec.ts | 34 - .../unit/core/encodeSqrtRatioX96.spec.ts | 31 - .../__tests__/unit/core/liquidityMath.spec.ts | 24 - .../unit/core/maxLiquidityForAmounts.spec.ts | 237 - .../unit/core/mostSignificantBit.spec.ts | 32 - .../unit/core/nearestUsableTIck.spec.ts | 56 - .../src/__tests__/unit/core/pool.spec.ts | 451 - .../src/__tests__/unit/core/poolUtils.spec.ts | 76 - .../src/__tests__/unit/core/position.spec.ts | 516 -- .../unit/core/priceTickConversion.spec.ts | 172 - .../src/__tests__/unit/core/route.spec.ts | 277 - .../unit/core/tickListDataProvider.spec.ts | 70 - .../unit/core/tickListIsSorted.spec.ts | 80 - .../__tests__/unit/core/tickListUtils.spec.ts | 335 - .../src/__tests__/unit/core/tickMath.spec.ts | 52 - .../src/__tests__/unit/core/trade.spec.ts | 1351 --- .../src/__tests__/unit/utils/Fraction.spec.ts | 329 - .../src/__tests__/unit/utils/Price.spec.ts | 46 - .../unit/utils/PriorityQueue.spec.ts | 60 - .../__tests__/unit/utils/enumUtils.spec.ts | 45 - .../__tests__/unit/utils/tokenUtils.spec.ts | 151 - .../ethereum/uniswapv3/wrapper/src/index.ts | 9 - .../uniswapv3/wrapper/src/pool/index.ts | 300 - .../uniswapv3/wrapper/src/pool/utils.ts | 416 - .../uniswapv3/wrapper/src/position/index.ts | 501 - .../position/nonfungiblePositionManager.ts | 507 - .../uniswapv3/wrapper/src/position/utils.ts | 122 - .../uniswapv3/wrapper/src/route/index.ts | 143 - .../uniswapv3/wrapper/src/router/index.ts | 381 - .../uniswapv3/wrapper/src/router/utils.ts | 219 - .../uniswapv3/wrapper/src/schema.graphql | 1332 --- .../uniswapv3/wrapper/src/swap/index.ts | 147 - .../uniswapv3/wrapper/src/tickList/index.ts | 77 - .../wrapper/src/tickList/tickUtils.ts | 247 - .../uniswapv3/wrapper/src/tickList/utils.ts | 158 - .../uniswapv3/wrapper/src/token/index.ts | 49 - .../uniswapv3/wrapper/src/token/utils.ts | 157 - .../uniswapv3/wrapper/src/trade/index.ts | 696 -- .../uniswapv3/wrapper/src/utils/Fraction.ts | 143 - .../uniswapv3/wrapper/src/utils/Price.ts | 136 - .../wrapper/src/utils/PriorityQueue.ts | 81 - .../wrapper/src/utils/addressUtils.ts | 61 - .../uniswapv3/wrapper/src/utils/call.ts | 62 - .../uniswapv3/wrapper/src/utils/constants.ts | 51 - .../uniswapv3/wrapper/src/utils/deployPool.ts | 50 - .../uniswapv3/wrapper/src/utils/enumUtils.ts | 86 - .../uniswapv3/wrapper/src/utils/fetch.ts | 219 - .../uniswapv3/wrapper/src/utils/index.ts | 13 - .../wrapper/src/utils/invokableConstants.ts | 34 - .../uniswapv3/wrapper/src/utils/mathUtils.ts | 282 - .../uniswapv3/wrapper/src/utils/poolView.ts | 49 - .../uniswapv3/wrapper/src/utils/quoter.ts | 103 - .../uniswapv3/wrapper/src/utils/staker.ts | 189 - .../uniswapv3/wrapper/src/utils/subgraph.ts | 51 - .../ethereum/uniswapv3/wrapper/tsconfig.json | 12 - .../uniswapv3/wrapper/tsconfig.ts.json | 33 - protocol/ethereum/uniswapv3/wrapper/yarn.lock | 7482 --------------- 153 files changed, 40552 deletions(-) delete mode 100644 protocol/ethereum/uniswapv2/integrations.md delete mode 100644 protocol/ethereum/uniswapv2/wrapper/.eslintrc.js delete mode 100644 protocol/ethereum/uniswapv2/wrapper/.gitignore delete mode 100644 protocol/ethereum/uniswapv2/wrapper/.nvmrc delete mode 100644 protocol/ethereum/uniswapv2/wrapper/.prettierrc delete mode 100644 protocol/ethereum/uniswapv2/wrapper/README.md delete mode 100644 protocol/ethereum/uniswapv2/wrapper/as-pect.config.js delete mode 100644 protocol/ethereum/uniswapv2/wrapper/docker-compose.yaml delete mode 100644 protocol/ethereum/uniswapv2/wrapper/jest.config.js delete mode 100644 protocol/ethereum/uniswapv2/wrapper/package.json delete mode 100644 protocol/ethereum/uniswapv2/wrapper/polywrap.deploy.yaml delete mode 100644 protocol/ethereum/uniswapv2/wrapper/polywrap.infra.yaml delete mode 100644 protocol/ethereum/uniswapv2/wrapper/polywrap.yaml delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/fetch_e2e.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/pair_e2e.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/route_e2e.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/router_e2e.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/swap_e2e.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/testData/erc20ABI.json delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/testData/tokenList.json delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/trade_e2e.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/types/polywrap.app.yaml delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/pair.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/route.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/router.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/token.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/trade.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/infraUtils.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/testUtils.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/__tests__/utils/fraction.spec.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/entities/fetch.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/entities/index.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/entities/pair.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/entities/route.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/entities/router.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/entities/swap.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/entities/token.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/entities/trade.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/index.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/schema.graphql delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/Currency.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/Fraction.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/Price.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/PriorityQueue.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/ProcessedPair.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/TradeOptions.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/abi.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/addressUtils.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/constants.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/index.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/mathUtils.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/src/utils/utils.ts delete mode 100644 protocol/ethereum/uniswapv2/wrapper/tsconfig.json delete mode 100644 protocol/ethereum/uniswapv2/wrapper/tsconfig.ts.json delete mode 100644 protocol/ethereum/uniswapv2/wrapper/yarn.lock delete mode 100644 protocol/ethereum/uniswapv3/wrapper/.eslintrc.js delete mode 100644 protocol/ethereum/uniswapv3/wrapper/.gitignore delete mode 100644 protocol/ethereum/uniswapv3/wrapper/.nvmrc delete mode 100644 protocol/ethereum/uniswapv3/wrapper/.prettierrc delete mode 100644 protocol/ethereum/uniswapv3/wrapper/README.md delete mode 100644 protocol/ethereum/uniswapv3/wrapper/as-pect.config.js delete mode 100644 protocol/ethereum/uniswapv3/wrapper/config.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/docker-compose.yaml delete mode 100644 protocol/ethereum/uniswapv3/wrapper/jest.config.js delete mode 100644 protocol/ethereum/uniswapv3/wrapper/meta/imgs/polywrap-horizontal.svg delete mode 100644 protocol/ethereum/uniswapv3/wrapper/meta/imgs/uniswap-pink.svg delete mode 100644 protocol/ethereum/uniswapv3/wrapper/package.json delete mode 100644 protocol/ethereum/uniswapv3/wrapper/polywrap.build.yaml delete mode 100644 protocol/ethereum/uniswapv3/wrapper/polywrap.deploy.yaml delete mode 100644 protocol/ethereum/uniswapv3/wrapper/polywrap.infra.yaml delete mode 100644 protocol/ethereum/uniswapv3/wrapper/polywrap.meta.yaml delete mode 100644 protocol/ethereum/uniswapv3/wrapper/polywrap.yaml delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/infraUtils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/testUtils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/types.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/uniswapCreatePool.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/wrappedInvocations.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/call_mainnetFork.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/deployPool_mainnetFork.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/fetch_mainnetFork.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/pool_mainnetFork.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/route_mainnetFork.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/router_mainnetFork.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/swap_mainnetFork.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/trade_mainnetFork.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/encodeRouteToPath.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/multicall.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/nfpm.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/payments.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/quoter.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/router.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/staker.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/testData/erc20ABI.json delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/testData/poolList.json delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/as-pect.d.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/constants.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/encodeSqrtRatioX96.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/liquidityMath.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/maxLiquidityForAmounts.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/mostSignificantBit.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/nearestUsableTIck.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/pool.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/poolUtils.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/position.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/priceTickConversion.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/route.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListDataProvider.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListIsSorted.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListUtils.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickMath.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/trade.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/Fraction.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/Price.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/PriorityQueue.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/enumUtils.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/tokenUtils.spec.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/pool/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/pool/utils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/position/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/position/nonfungiblePositionManager.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/position/utils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/route/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/router/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/router/utils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/schema.graphql delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/swap/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/tickList/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/tickList/tickUtils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/tickList/utils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/token/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/token/utils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/trade/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/Fraction.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/Price.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/PriorityQueue.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/addressUtils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/call.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/constants.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/deployPool.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/enumUtils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/fetch.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/index.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/invokableConstants.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/mathUtils.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/poolView.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/quoter.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/staker.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/src/utils/subgraph.ts delete mode 100644 protocol/ethereum/uniswapv3/wrapper/tsconfig.json delete mode 100644 protocol/ethereum/uniswapv3/wrapper/tsconfig.ts.json delete mode 100644 protocol/ethereum/uniswapv3/wrapper/yarn.lock diff --git a/protocol/ethereum/uniswapv2/integrations.md b/protocol/ethereum/uniswapv2/integrations.md deleted file mode 100644 index 503b1629e..000000000 --- a/protocol/ethereum/uniswapv2/integrations.md +++ /dev/null @@ -1,16 +0,0 @@ -# Uniswap Production UI Fork -We forked the existing Uniswap web interface, removed the JS SDK, and integrated the Uniswap V2 wrapper using Polywrap. - -**Live dApp:** https://demo.uniswap.polywrap.io/ -**Code:** https://github.com/polywrap/uniswap-interface/ - -# Uniswap <> Polywrap Workshop -This workshop teaches you how to build a dApp or wrapper on-top of the Uniswap V2 wrapper: -https://github.com/polywrap/uni-workshop/ - -# Uniswap API Explorer (Uniswap Beginners Guide) -Evan Jacobs has created this beginners guide to the Uniswap protocol, using Polywrap. More information about the project can be found on the [EthGlobal hackathon submission page](https://showcase.ethglobal.com/unicode/uniswap-api-explorer). - -**Live dApp:** https://demo.uniswap-api-explorer.polywrap.io/ -**Code:** https://github.com/evanjacobs/uniswap-api-explorer -**Live dApp's Fork:** https://github.com/polywrap/uniswap-api-explorer diff --git a/protocol/ethereum/uniswapv2/wrapper/.eslintrc.js b/protocol/ethereum/uniswapv2/wrapper/.eslintrc.js deleted file mode 100644 index f7496941f..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/.eslintrc.js +++ /dev/null @@ -1,73 +0,0 @@ -module.exports = { - root: true, - env: { - es6: true, - node: true, - mocha: true - }, - ignorePatterns: ["**/w3/**/*.ts", "**/__tests__/**/*.*"], - parser: "@typescript-eslint/parser", - parserOptions: { - ecmaVersion: "es2019", - tsconfigRootDir: __dirname, - project: ['./tsconfig.json'], - }, - plugins: [ - "eslint-plugin-import", - "@typescript-eslint", - "prettier" - ], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - rules: { - "prettier/prettier": ["error"], - "@typescript-eslint/explicit-module-boundary-types": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-unused-vars": ["error", { - "varsIgnorePattern": "^_", - "argsIgnorePattern": "^_", - }], - "@typescript-eslint/no-floating-promises": "error", - "import/order": [ - "error", - { - "groups": [["index", "sibling", "parent", "internal"], ["external", "builtin"], "object"], - "newlines-between": "always" - } - ], - "import/no-extraneous-dependencies": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/member-ordering": "off", - "@typescript-eslint/naming-convention": ["error", - {selector: "default", format: ['camelCase']}, - {selector: ["objectLiteralProperty", "parameterProperty", "classMethod"], format: ['camelCase'], leadingUnderscore: "allow"}, - //variable must be in camel or upper case - {selector: ["classProperty", "variable"], format: ["camelCase", "UPPER_CASE"], leadingUnderscore: "allow"}, - //classes and types must be in PascalCase - {selector: ["typeLike", "enum"], format: ['PascalCase']}, - {selector: ["parameter"], format: ['snake_case', "camelCase"], leadingUnderscore: "allow"}, - {selector: "enumMember", format: null}, - {selector: "function", format: null, leadingUnderscore: "allowSingleOrDouble"}, - ] - }, - "overrides": [ - { - "files": ["**/__tests__/**/*.ts", "*.spec.ts"], - "rules": { - "import/no-extraneous-dependencies": "off" - } - }, - { - "files": ["*.d.ts"], - "rules": { - "@typescript-eslint/triple-slash-reference": "off" - } - } - ] -}; \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/.gitignore b/protocol/ethereum/uniswapv2/wrapper/.gitignore deleted file mode 100644 index 0d61db80a..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules -build -yarn-error.log -coverage -.vscode -*.log -wrap -.polywrap -.DS_Store -report.* -.env \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/.nvmrc b/protocol/ethereum/uniswapv2/wrapper/.nvmrc deleted file mode 100644 index 5b0ad74a8..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -16.13.0 \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/.prettierrc b/protocol/ethereum/uniswapv2/wrapper/.prettierrc deleted file mode 100644 index 91330bc78..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/.prettierrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "printWidth": 80, - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": false, - "quoteProps": "as-needed", - "trailingComma": "es5", - "bracketSpacing": true, - "arrowParens": "always", - "endOfLine": "auto" -} diff --git a/protocol/ethereum/uniswapv2/wrapper/README.md b/protocol/ethereum/uniswapv2/wrapper/README.md deleted file mode 100644 index d1b513826..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Uniswap v2 Wrapper - -The Uniswap v2 wrapper is written in AssemblyScript, and like the official Uniswap SDK, it has a robust test suite, performs arbitrary precision arithmetic, and supports rounding to significant digits or fixed decimal places. -The Uniswap business logic can be deployed on a decentralized endpoint, like IPFS. - -Documentation for the Uniswap v2 wrapper is available at [https://docs.polywrap.io/uniswapv2/uniswapv2-polywrap-intro](https://docs.polywrap.io/uniswapv2/uniswapv2-polywrap-intro). - diff --git a/protocol/ethereum/uniswapv2/wrapper/as-pect.config.js b/protocol/ethereum/uniswapv2/wrapper/as-pect.config.js deleted file mode 100644 index c8eccbebf..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/as-pect.config.js +++ /dev/null @@ -1,73 +0,0 @@ -module.exports = { - /** - * A set of globs passed to the glob package that qualify typescript files for testing. - */ - include: ["src/__tests__/**/*.spec.ts"], - /** - * A set of globs passed to the glob package that qualify files to be added to each test. - */ - add: ["src/__tests__/**/*.include.ts"], - /** - * All the compiler flags needed for this test suite. Make sure that a binary file is output. - */ - flags: { - // "--debug": [], - /** This is required. Do not change this. The filename is ignored, but required by the compiler. */ - "--binaryFile": ["output.wasm"], - /** To enable wat file output, use the following flag. The filename is ignored, but required by the compiler. */ - // "--textFile": ["output.wat"], - "--runtime": ["stub"], // Acceptable values are: full, half, stub (arena), and none, - "--baseDir": process.cwd() - }, - /** Output the binary wasm file: [testname].spec.wasm */ - outputBinary: false, - /** - * A set of regexp that will disclude source files from testing. - */ - disclude: [/node_modules|e2e/], - /** - * Add your required AssemblyScript imports here. - */ - imports: { - wrap: { - __wrap_invoke_args: () => {}, - __wrap_invoke_result: () => {}, - __wrap_invoke_error: () => {}, - __wrap_subinvoke: () => {}, - __wrap_subinvoke_result: () => {}, - __wrap_subinvoke_result_len: () => {}, - __wrap_subinvoke_error: () => {}, - __wrap_subinvoke_error_len: () => {}, - __wrap_abort: () => {}, - } - }, - /** - * All performance statistics reporting can be configured here. - */ - performance: { - /** Enable performance statistics gathering. */ - enabled: true, - /** Set the maximum number of samples to run for each test. */ - maxSamples: 10000, - /** Set the maximum test run time in milliseconds. */ - maxTestRunTime: 2000, - /** Set the number of decimal places to round to. */ - roundDecimalPlaces: 3, - /** Report the median time in the default reporter. */ - reportMedian: true, - /** Report the average time in milliseconds. */ - reportAverage: true, - /** Report the standard deviation. */ - reportStandardDeviation: false, - /** Report the maximum run time in milliseconds. */ - reportMax: false, - /** Report the minimum run time in milliseconds. */ - reportMin: false, - /** Report the variance. */ - reportVariance: false, - }, - /** - * To create your own custom reporter, please check out the Core API. - */ - // reporter: new CustomReporter(), -}; diff --git a/protocol/ethereum/uniswapv2/wrapper/docker-compose.yaml b/protocol/ethereum/uniswapv2/wrapper/docker-compose.yaml deleted file mode 100644 index f6a921835..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/docker-compose.yaml +++ /dev/null @@ -1,7 +0,0 @@ -version: '3' -services: - mainnet-fork: - image: 'trufflesuite/ganache-cli:v6.12.2' - ports: - - '8546:8545' - command: -l 8000000 --deterministic --hostname=0.0.0.0 --chainId 1 --fork https://mainnet.infura.io/v3/d119148113c047ca90f0311ed729c466 \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/jest.config.js b/protocol/ethereum/uniswapv2/wrapper/jest.config.js deleted file mode 100644 index 09c2e803e..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/jest.config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - collectCoverage: true, - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ["**/__tests__/e2e/**/?(*.)+(spec|test).[jt]s?(x)"], - modulePathIgnorePatterns: ['./src/__tests__/entities', './src/__tests__/utils'], - globals: { - 'ts-jest': { - tsconfig: "tsconfig.ts.json", - diagnostics: false - } - } -}; diff --git a/protocol/ethereum/uniswapv2/wrapper/package.json b/protocol/ethereum/uniswapv2/wrapper/package.json deleted file mode 100644 index 169091666..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "@polywrap/uniswap-v2-api", - "description": "Uniswap V2 Polywrap", - "private": true, - "version": "0.3.0", - "scripts": { - "reset": "yarn clean && yarn && yarn build", - "clean": "npx rimraf ./node_modules ./build ./coverage ./.wrap ./**/wrap", - "build": "npx polywrap build", - "deploy": "npx polywrap deploy", - "codegen:app": "npx polywrap app codegen -m src/__tests__/e2e/types/polywrap.app.yaml -g src/__tests__/e2e/types/wrap", - "test:e2e": "yarn codegen:app && jest --passWithNoTests --runInBand --verbose", - "test:unit": "asp --verbose", - "test": "yarn test:unit && yarn test:e2e", - "test:ci": "yarn test" - }, - "dependencies": { - "@polywrap/wasm-as": "0.3.x" - }, - "devDependencies": { - "@as-pect/cli": "6.2.4", - "@ethersproject/providers": "5.6.4", - "@polywrap/client-js": "0.3.x", - "@polywrap/ethereum-plugin-js": "0.3.x", - "@polywrap/test-env-js": "0.3.x", - "@types/jest": "26.0.8", - "@types/node": "12.6.9", - "@types/node-fetch": "2.5.10", - "@uniswap/sdk": "3.0.3", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v2-periphery": "1.1.0-beta.0", - "assemblyscript": "0.19.23", - "axios": "0.21.1", - "ethers": "5.6.4", - "jest": "26.6.3", - "js-yaml": "3.14.0", - "node-fetch": "2.6.1", - "rimraf": "3.0.2", - "ts-jest": "26.5.4", - "ts-node": "8.10.2", - "typescript": "4.0.7", - "@typescript-eslint/eslint-plugin": "4.11.1", - "@typescript-eslint/parser": "4.11.1", - "eslint": "7.16.0", - "eslint-config-prettier": "7.1.0", - "eslint-plugin-import": "2.22.1", - "eslint-plugin-prettier": "3.3.0", - "prettier": "2.2.1", - "polywrap": "0.3.x" - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/polywrap.deploy.yaml b/protocol/ethereum/uniswapv2/wrapper/polywrap.deploy.yaml deleted file mode 100644 index 1e6a34c61..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/polywrap.deploy.yaml +++ /dev/null @@ -1,7 +0,0 @@ -format: 0.1.0 -stages: - ipfs_deploy: - package: ipfs - uri: fs/./build - config: - gatewayUri: 'ipfs.wrappers.io' diff --git a/protocol/ethereum/uniswapv2/wrapper/polywrap.infra.yaml b/protocol/ethereum/uniswapv2/wrapper/polywrap.infra.yaml deleted file mode 100644 index d5c7d1d7e..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/polywrap.infra.yaml +++ /dev/null @@ -1,4 +0,0 @@ -format: 0.1.0 -modules: - mainnet: - path: ./docker-compose.yaml \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/polywrap.yaml b/protocol/ethereum/uniswapv2/wrapper/polywrap.yaml deleted file mode 100644 index 8c98b0691..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/polywrap.yaml +++ /dev/null @@ -1,6 +0,0 @@ -format: 0.1.0 -name: uniswap-v2 -language: wasm/assemblyscript -deploy: ./polywrap.deploy.yaml -module: ./src/index.ts -schema: ./src/schema.graphql \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/fetch_e2e.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/fetch_e2e.spec.ts deleted file mode 100644 index fae82b95c..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/fetch_e2e.spec.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { ClientConfig, PolywrapClient } from "@polywrap/client-js"; -import path from "path"; -import { getTokenList } from "../testUtils"; -import { getPlugins, initInfra, stopInfra } from "../infraUtils"; -import * as uni from "@uniswap/sdk"; -import * as ethers from "ethers"; -import { BaseProvider, getDefaultProvider} from "@ethersproject/providers" -import * as App from "./types/wrap"; - -jest.setTimeout(90000); - -describe("Fetch", () => { - - let client: PolywrapClient; - let fsUri: string; - let tokens: App.Token[]; - let uniTokens: uni.Token[]; - let pairs: App.Token[][]; - let ethersProvider: BaseProvider; - - beforeAll(async () => { - await initInfra(); - // get client - const config: Partial = getPlugins(); - client = new PolywrapClient(config); - // deploy api - const wrapperAbsPath: string = path.resolve(__dirname + "/../../.."); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data -> tokens - tokens = await getTokenList(); - uniTokens = tokens.map(token => { - return new uni.Token( - uni.ChainId.MAINNET, - token.address, - token.currency.decimals, - token.currency.symbol || "", - token.currency.name || "" - ); - }); - // set up test case data -> pairs - const aave: App.Token = tokens.filter(token => token.currency.symbol === "AAVE")[0]; - const dai: App.Token = tokens.filter(token => token.currency.symbol === "DAI")[0]; - const usdc: App.Token = tokens.filter(token => token.currency.symbol === "USDC")[0]; - const comp: App.Token = tokens.filter(token => token.currency.symbol === "COMP")[0]; - const weth: App.Token = tokens.filter(token => token.currency.symbol === "WETH")[0]; - const wbtc: App.Token = tokens.filter(token => token.currency.symbol === "WBTC")[0]; - const uniswap: App.Token = tokens.filter(token => token.currency.symbol === "UNI")[0]; - const link: App.Token = tokens.filter(token => token.currency.symbol === "LINK")[0]; - pairs = [[aave, dai], [usdc, dai], [aave, usdc], [comp, weth], [uniswap, link], [uniswap, wbtc], [wbtc, weth]]; - // set up ethers provider - ethersProvider = getDefaultProvider("http://localhost:8546"); - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("Fetches token data", async () => { - for (let i = 0; i < 10; i++) { - // actual token - const tokenData = await client.invoke({ - uri: fsUri, - method: "fetchTokenData", - args: { - chainId: tokens[i].chainId, - address: tokens[i].address, - }, - }); - // compare results - expect(tokenData.error).toBeFalsy(); - expect(tokenData.data).toBeTruthy(); - expect(tokenData.data?.currency.symbol).toStrictEqual(tokens[i].currency.symbol); - expect(tokenData.data?.currency.decimals).toStrictEqual(tokens[i].currency.decimals); - // fetched name can vary from token list, e.g. "Aave" vs "Aave Token", so not testing (can verify it works with console.log) - // expect(tokenData.data?.fetchTokenData.currency.name).toStrictEqual(tokens[i].currency.name); - } - }); - - it("Fetches pair data", async () => { - // loop over token pairs - for (let i = 0; i < pairs.length; i++) { - // prepare uni tokens - const uniTokenI: uni.Token = uniTokens.filter(token => token.address === pairs[i][0].address)[0]; - const uniTokenJ: uni.Token = uniTokens.filter(token => token.address === pairs[i][1].address)[0]; - // actual pair data - const pairData = await client.invoke({ - uri: fsUri, - method: "fetchPairData", - args: { - token0: pairs[i][0], - token1: pairs[i][1] - }, - }); - // expected pair data - const uniPair: uni.Pair = await uni.Fetcher.fetchPairData(uniTokenI, uniTokenJ, ethersProvider); - // compare results - expect(pairData.error).toBeFalsy(); - expect(pairData.data).toBeTruthy(); - expect(pairData.data?.tokenAmount0.amount).toStrictEqual(uniPair.reserve0.numerator.toString()); - expect(pairData.data?.tokenAmount1.amount).toStrictEqual(uniPair.reserve1.numerator.toString()); - } - }); - - it("Fetches total supply", async () => { - for (let i = 0; i < 10; i++) { - // prepare contract to check results - const abi = ["function totalSupply() external view returns (uint)"]; - const contract = new ethers.Contract(tokens[i].address, abi, ethersProvider); - // actual totalSupply - const totalSupply = await client.invoke({ - uri: fsUri, - method: "fetchTotalSupply", - args: { - token: tokens[i], - }, - }); - // expected totalSupply - const expectedTotalSupply: string = (await contract.totalSupply()).toString(); - // compare results - expect(totalSupply.error).toBeFalsy(); - expect(totalSupply.data).toBeTruthy(); - expect(totalSupply.data?.amount).toStrictEqual(expectedTotalSupply); - } - }); - - it("Fetches kLast", async () => { - // loop over tokens - for (let i = 0; i < pairs.length; i++) { - // prepare contract to check results - const uniTokenI: uni.Token = uniTokens.filter(token => token.address === pairs[i][0].address)[0]; - const uniTokenJ: uni.Token = uniTokens.filter(token => token.address === pairs[i][1].address)[0]; - const uniPairAddress: string = uni.Pair.getAddress(uniTokenI, uniTokenJ); - const abi = ["function kLast() external view returns (uint)"]; - const contract = new ethers.Contract(uniPairAddress, abi, ethersProvider); - // get pair address - const pairAddress = await client.invoke({ - uri: fsUri, - method: "pairAddress", - args: { - token0: pairs[i][0], - token1: pairs[i][1] - }, - }); - const actualPairAddress: string = pairAddress.data ?? ""; - // create pair token using pair address - const pairToken: App.Token = { - chainId: App.ChainIdEnum.MAINNET, - address: actualPairAddress, - currency: { - decimals: 18, - symbol: null, - name: null, - }, - }; - // get actual kLast - const kLast = await client.invoke({ - uri: fsUri, - method: "fetchKLast", - args: { - token: pairToken, - }, - }); - // expected kLast - const expectedKLast: string = (await contract.kLast()).toString(); - // compare results - expect(kLast.error).toBeFalsy(); - expect(kLast.data).toBeTruthy(); - expect(actualPairAddress).toStrictEqual(uniPairAddress); - expect(kLast.data).toStrictEqual(expectedKLast); - } - }); - -}); diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/pair_e2e.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/pair_e2e.spec.ts deleted file mode 100644 index f0ab59432..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/pair_e2e.spec.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { ClientConfig, PolywrapClient } from "@polywrap/client-js"; -import * as path from "path"; -import { getPairData, getTokenList, getUniPairs } from "../testUtils"; -import { getPlugins, initInfra, stopInfra } from "../infraUtils"; -import * as uni from "@uniswap/sdk"; -import * as App from "./types/wrap"; - -jest.setTimeout(150000); - -describe('Pair', () => { - - let client: PolywrapClient; - let fsUri: string; - let pairs: App.Pair[] = []; - let uniPairs: uni.Pair[]; - - beforeAll(async () => { - await initInfra(); - // get client - const config: Partial = getPlugins(); - client = new PolywrapClient(config); - // deploy api - const wrapperAbsPath: string = path.resolve(__dirname + "/../../.."); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // pick some test case tokens - const tokens: App.Token[] = await getTokenList(); - const aave: App.Token = tokens.filter(token => token.currency.symbol === "AAVE")[0]; - const dai: App.Token = tokens.filter(token => token.currency.symbol === "DAI")[0]; - const usdc: App.Token = tokens.filter(token => token.currency.symbol === "USDC")[0]; - const comp: App.Token = tokens.filter(token => token.currency.symbol === "COMP")[0]; - const weth: App.Token = tokens.filter(token => token.currency.symbol === "WETH")[0]; - const wbtc: App.Token = tokens.filter(token => token.currency.symbol === "WBTC")[0]; - const uniswap: App.Token = tokens.filter(token => token.currency.symbol === "UNI")[0]; - const link: App.Token = tokens.filter(token => token.currency.symbol === "LINK")[0]; - // create and push test case pairs - const aave_dai: App.Pair | undefined = await getPairData(aave, dai, client, fsUri); - const usdc_dai: App.Pair | undefined = await getPairData(usdc, dai, client, fsUri); - const aave_usdc: App.Pair | undefined = await getPairData(aave, usdc, client, fsUri); - const comp_weth: App.Pair | undefined = await getPairData(comp, weth, client, fsUri); - const uni_link: App.Pair | undefined = await getPairData(uniswap, link, client, fsUri); - const uni_wbtc: App.Pair | undefined = await getPairData(uniswap, wbtc, client, fsUri); - const wbtc_weth: App.Pair | undefined = await getPairData(wbtc, weth, client, fsUri); - [aave_dai, usdc_dai, aave_usdc, comp_weth, uni_link, uni_wbtc, wbtc_weth].forEach(pair => { - if (pair) { - pairs.push(pair) - } - }); - - // create uniswap sdk pairs to compare results - uniPairs = getUniPairs(pairs, 1); - }); - - afterAll(async () => { - await stopInfra(); - }) - - it("off-chain pairAddress", async () => { - for (let i = 0; i < pairs.length; i++) { - const pair = pairs[i]; - const actualOutput = await client.invoke({ - uri: fsUri, - method: "pairAddress", - args: { - token0: pair.tokenAmount0.token, - token1: pair.tokenAmount1.token - }, - }); - - const expectedOutput: string = uni.Pair.getAddress(uniPairs[i].token0, uniPairs[i].token1); - expect(actualOutput.data).toStrictEqual(expectedOutput); - } - }); - - it("pairOutputAmount", async () => { - for (let i = 0; i < pairs.length; i++) { - const pair = pairs[i]; - const inputAmount: App.TokenAmount = { - token: pair.tokenAmount0.token, - amount: "1000000000000000000" - } - const actualOutput = await client.invoke({ - uri: fsUri, - method: "pairOutputAmount", - args: { - pair, - inputAmount - }, - }); - const expectedOutput = uniPairs[i].getOutputAmount(new uni.TokenAmount(uniPairs[i].token0, inputAmount.amount)); - const expectedAmount = expectedOutput[0].numerator.toString(); - expect(actualOutput.data?.token).toStrictEqual(pair.tokenAmount1.token); - expect(actualOutput.data?.amount).toStrictEqual(expectedAmount); - } - }); - - it("pairOutputNextPair", async () => { - for (let i = 0; i < pairs.length; i++) { - const pair = pairs[i]; - const inputAmount: App.TokenAmount = { - token: pair.tokenAmount0.token, - amount: "1000000000000000000" - } - const actualNextPair = await client.invoke({ - uri: fsUri, - method: "pairOutputNextPair", - args: { - pair, - inputAmount - }, - }); - const expectedOutput = uniPairs[i].getOutputAmount(new uni.TokenAmount(uniPairs[i].token0, inputAmount.amount)); - const expectedNextReserve0 = expectedOutput[1].reserve0.numerator.toString(); - const expectedNextReserve1 = expectedOutput[1].reserve1.numerator.toString(); - expect(actualNextPair.data?.tokenAmount0.amount).toStrictEqual(expectedNextReserve0); - expect(actualNextPair.data?.tokenAmount1.amount).toStrictEqual(expectedNextReserve1); - } - }); - - it("pairInputAmount", async () => { - for (let i = 0; i < pairs.length; i++) { - const pair = pairs[i]; - const outputAmount: App.TokenAmount = { - token: pair.tokenAmount0.token, - amount: "100" - } - const actualInput = await client.invoke({ - uri: fsUri, - method: "pairInputAmount", - args: { - pair, - outputAmount - }, - }); - const expectedInput = uniPairs[i].getInputAmount(new uni.TokenAmount(uniPairs[i].token0, outputAmount.amount)); - const expectedAmount = expectedInput[0].numerator.toString(); - expect(actualInput.data?.token).toStrictEqual(pair.tokenAmount1.token); - expect(actualInput.data?.amount).toStrictEqual(expectedAmount); - } - }); - - it("pairInputNextPair", async () => { - for (let i = 0; i < pairs.length; i++) { - const pair = pairs[i]; - const outputAmount: App.TokenAmount = { - token: pair.tokenAmount0.token, - amount: "100" - } - const actualNextPair = await client.invoke({ - uri: fsUri, - method: "pairInputNextPair", - args: { - pair, - outputAmount - }, - }); - const expectedInput = uniPairs[i].getInputAmount(new uni.TokenAmount(uniPairs[i].token0, outputAmount.amount)); - const expectedNextReserve0 = expectedInput[1].reserve0.numerator.toString(); - const expectedNextReserve1 = expectedInput[1].reserve1.numerator.toString(); - expect(actualNextPair.data?.tokenAmount0.amount).toStrictEqual(expectedNextReserve0); - expect(actualNextPair.data?.tokenAmount1.amount).toStrictEqual(expectedNextReserve1); - } - }); - -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/route_e2e.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/route_e2e.spec.ts deleted file mode 100644 index 761dc5b46..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/route_e2e.spec.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { ClientConfig, PolywrapClient } from "@polywrap/client-js"; -import * as path from "path"; -import { getPairData, getTokenList, getUniPairs } from "../testUtils"; -import { getPlugins, initInfra, stopInfra } from "../infraUtils"; -import * as uni from "@uniswap/sdk"; -import * as App from "./types/wrap"; - -jest.setTimeout(480000); - -describe('Route', () => { - - let client: PolywrapClient; - let fsUri: string; - let pairSets: App.Pair[][] = []; - let uniPairSets: uni.Pair[][] = []; - let inputTokens: App.Token[] = []; - let outputTokens: App.Token[] = []; - - beforeAll(async () => { - await initInfra(); - // get client - const config: Partial = getPlugins(); - client = new PolywrapClient(config); - // deploy api - const wrapperAbsPath: string = path.resolve(__dirname + "/../../.."); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // pick some test case tokens - const tokens: App.Token[] = await getTokenList(); - const aave: App.Token = tokens.filter(token => token.currency.symbol === "AAVE")[0]; - const dai: App.Token = tokens.filter(token => token.currency.symbol === "DAI")[0]; - const usdc: App.Token = tokens.filter(token => token.currency.symbol === "USDC")[0]; - const comp: App.Token = tokens.filter(token => token.currency.symbol === "COMP")[0]; - const weth: App.Token = tokens.filter(token => token.currency.symbol === "WETH")[0]; - const wbtc: App.Token = tokens.filter(token => token.currency.symbol === "WBTC")[0]; - const uniswap: App.Token = tokens.filter(token => token.currency.symbol === "UNI")[0]; - const link: App.Token = tokens.filter(token => token.currency.symbol === "LINK")[0]; - // create test case pairs - const aave_dai: App.Pair | undefined = await getPairData(aave, dai, client, fsUri); - const usdc_dai: App.Pair | undefined = await getPairData(usdc, dai, client, fsUri); - const link_usdc: App.Pair | undefined = await getPairData(link, usdc, client, fsUri); - const comp_weth: App.Pair | undefined = await getPairData(comp, weth, client, fsUri); - const uni_link: App.Pair | undefined = await getPairData(uniswap, link, client, fsUri); - const uni_wbtc: App.Pair | undefined = await getPairData(uniswap, wbtc, client, fsUri); - const wbtc_weth: App.Pair | undefined = await getPairData(wbtc, weth, client, fsUri); - // create pair sets that can form routes - let pairSet: App.Pair[]; - // usdc <--> uni - pairSet = [link_usdc, uni_link].map(pair => pair!); - pairSets.push(pairSet); - uniPairSets.push(getUniPairs(pairSet, 1)); - inputTokens.push(usdc); - outputTokens.push(uniswap); - // aave <--> comp - pairSet = [aave_dai, usdc_dai, link_usdc, uni_link, uni_wbtc, wbtc_weth, comp_weth].map(pair => pair!); - pairSets.push(pairSet); - uniPairSets.push(getUniPairs(pairSet, 1)); - inputTokens.push(aave); - outputTokens.push(comp); - // comp <--> link - pairSet = [comp_weth, wbtc_weth, uni_wbtc, uni_link].map(pair => pair!); - pairSets.push(pairSet); - uniPairSets.push(getUniPairs(pairSet, 1)); - inputTokens.push(comp); - outputTokens.push(link); - }); - - afterAll(async () => { - await stopInfra(); - }) - - it('constructs a route from an array of pairs', async () => { - for (let i = 0; i < pairSets.length; i++) { - const pairs: App.Pair[] = pairSets[i]; - const uniPairs: uni.Pair[] = uniPairSets[i]; - const inputToken = inputTokens[i]; - const outputToken = outputTokens[i]; - // actual route - const actualRoute = await client.invoke({ - uri: fsUri, - method: "createRoute", - args: { - pairs, - input: inputToken, - output: outputToken, - } - }); - // expected route - const uniInputToken: uni.Token = new uni.Token( - 1, - inputToken.address, - inputToken.currency.decimals, - inputToken.currency.symbol || "", - inputToken.currency.name || "" - ) - const uniOutputToken: uni.Token = new uni.Token( - 1, - outputToken.address, - outputToken.currency.decimals, - outputToken.currency.symbol || "", - outputToken.currency.name || "" - ) - const expectedRoute = new uni.Route(uniPairs, uniInputToken, uniOutputToken); - // compare input - const actualRouteInput: string = actualRoute.data?.input.address ?? ""; - const expectedRouteInput: string = (expectedRoute.input as uni.Token).address; - expect(actualRouteInput).toStrictEqual(expectedRouteInput); - // compare output - const actualRouteOutput: string = actualRoute.data?.output.address ?? ""; - const expectedRouteOutput: string = (expectedRoute.output as uni.Token).address; - expect(actualRouteOutput).toStrictEqual(expectedRouteOutput); - // compare path - const actualRoutePath: string[] = actualRoute.data?.path?.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedRoute.path.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - }); - - it('calculates route midPrice', async () => { - for (let i = 0; i < pairSets.length; i++) { - const pairs: App.Pair[] = pairSets[i]; - const uniPairs: uni.Pair[] = uniPairSets[i]; - const inputToken = inputTokens[i]; - const outputToken = outputTokens[i]; - // actual route - const actualRoute = await client.invoke({ - uri: fsUri, - method: "createRoute", - args: { - pairs, - input: inputToken, - output: outputToken, - } - }); - // expected route - const uniInputToken: uni.Token = new uni.Token( - 1, - inputToken.address, - inputToken.currency.decimals, - inputToken.currency.symbol || "", - inputToken.currency.name || "" - ) - const uniOutputToken: uni.Token = new uni.Token( - 1, - outputToken.address, - outputToken.currency.decimals, - outputToken.currency.symbol || "", - outputToken.currency.name || "" - ) - const expectedRoute = new uni.Route(uniPairs, uniInputToken, uniOutputToken); - // actual midPrice - const actualMidPrice = await client.invoke({ - uri: fsUri, - method: "routeMidPrice", - args: { - route: actualRoute?.data, - } - }); - // make sure price is correct - const actualRouteMidPrice: string = actualMidPrice.data! - const expectedRouteMidPrice: string = expectedRoute.midPrice.toFixed(18); - expect(actualRouteMidPrice).toStrictEqual(expectedRouteMidPrice); - } - }); - -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/router_e2e.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/router_e2e.spec.ts deleted file mode 100644 index 19fb0924a..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/router_e2e.spec.ts +++ /dev/null @@ -1,432 +0,0 @@ -import { ClientConfig, PolywrapClient } from "@polywrap/client-js"; -import path from "path"; -import { - getBestTradeExactIn, - getBestTradeExactOut, - getPairData, - getTokenList, - getUniPairs, - getSwapMethodAbi, -} from "../testUtils"; -import { getPlugins, initInfra, stopInfra } from "../infraUtils"; -import { ethers } from "ethers"; -import * as uni from "@uniswap/sdk"; -jest.setTimeout(120000); -import * as App from "./types/wrap"; - -describe("Router", () => { - - let client: PolywrapClient; - let recipient: string; - let fsUri: string; - let ethersProvider: ethers.providers.JsonRpcProvider; - let tokens: App.Token[] = []; - let pairs: App.Pair[] = []; - let uniPairs: uni.Pair[]; - let ethToken: App.Token; - - beforeAll(async () => { - await initInfra(); - // get client - const config: Partial = getPlugins(); - client = new PolywrapClient(config); - // deploy api - const wrapperAbsPath: string = path.resolve(__dirname + "/../../.."); - fsUri = "fs/" + wrapperAbsPath + '/build'; - ethersProvider = ethers.providers.getDefaultProvider("http://localhost:8546") as ethers.providers.JsonRpcProvider; - recipient = await ethersProvider.getSigner().getAddress(); - - // set up test case data -> pairs - const allTokens: App.Token[] = await getTokenList(); - const aave: App.Token = allTokens.filter(token => token.currency.symbol === "AAVE")[0]; - const dai: App.Token = allTokens.filter(token => token.currency.symbol === "DAI")[0]; - const usdc: App.Token = allTokens.filter(token => token.currency.symbol === "USDC")[0]; - const comp: App.Token = allTokens.filter(token => token.currency.symbol === "COMP")[0]; - const weth: App.Token = allTokens.filter(token => token.currency.symbol === "WETH")[0]; - const wbtc: App.Token = allTokens.filter(token => token.currency.symbol === "WBTC")[0]; - const uniswap: App.Token = allTokens.filter(token => token.currency.symbol === "UNI")[0]; - const link: App.Token = allTokens.filter(token => token.currency.symbol === "LINK")[0]; - ethToken = { - chainId: App.ChainIdEnum.MAINNET, - address: "", - currency: { - decimals: 18, - name: "Ether", - symbol: "ETH", - }, - } - tokens = [aave, dai, usdc, comp, weth, wbtc, uniswap, link]; - // create test case pairs - const aave_dai: App.Pair | undefined = await getPairData(aave, dai, client, fsUri); - const usdc_dai: App.Pair | undefined = await getPairData(usdc, dai, client, fsUri); - const link_usdc: App.Pair | undefined = await getPairData(link, usdc, client, fsUri); - const comp_weth: App.Pair | undefined = await getPairData(comp, weth, client, fsUri); - const uni_link: App.Pair | undefined = await getPairData(uniswap, link, client, fsUri); - const uni_wbtc: App.Pair | undefined = await getPairData(uniswap, wbtc, client, fsUri); - const wbtc_weth: App.Pair | undefined = await getPairData(wbtc, weth, client, fsUri); - [aave_dai, usdc_dai, link_usdc, uni_link, uni_wbtc, wbtc_weth, comp_weth].forEach(pair => { - if (pair) { - pairs.push(pair) - } - }); - - // get uni pairs - uniPairs = getUniPairs(pairs, 1); - - // approve token transfers - for (let token of tokens) { - const txResponse = await client.invoke({ - uri: fsUri, - method: 'approve', - args: { - token: token, - }, - }); - const approvedHash: string = txResponse.data?.hash ?? ""; - if (!approvedHash) { - throw new Error("Failed to approve token: " + token.currency.symbol); - } - } - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("successfully constructs swap call parameters with tokens in and out", async () => { - // we3api tokens and trades - const token0 = tokens[0]; - const token1 = tokens[1]; - const tokenAmount: App.TokenAmount = { - token: token0, - amount: "100000000" - }; - const bestTradeInArray: App.Trade[] = await getBestTradeExactIn(pairs, tokenAmount, token1, null, client, fsUri); - const bestTradeIn: App.Trade = bestTradeInArray[0]; - const bestTradeOutArray: App.Trade[] = await getBestTradeExactOut(pairs, token1, tokenAmount, null, client, fsUri); - const bestTradeOut: App.Trade = bestTradeOutArray[0]; - - // uni tokens and trades - const uniAmount: uni.TokenAmount = new uni.TokenAmount(new uni.Token( - 1, - tokenAmount.token.address, - tokenAmount.token.currency.decimals, - tokenAmount.token.currency.symbol || "", - tokenAmount.token.currency.name || "" - ), tokenAmount.amount); - const uniToken: uni.Token = new uni.Token( - 1, - token1.address, - token1.currency.decimals, - token1.currency.symbol || "", - token1.currency.name || "" - ); - const uniBestTradeIn: uni.Trade = uni.Trade.bestTradeExactIn(uniPairs, uniAmount, uniToken)[0]; - const uniBestTradeOut: uni.Trade = uni.Trade.bestTradeExactOut(uniPairs, uniToken, uniAmount)[0]; - - const testCases = [ - {bestTrade: bestTradeIn, feeRule: true}, - {bestTrade: bestTradeIn, feeRule: false}, - {bestTrade: bestTradeOut, feeRule: false} - ]; - for (const {bestTrade, feeRule} of testCases) { - const tradeOptions: App.TradeOptions = { - feeOnTransfer: feeRule, - recipient, - allowedSlippage: "0.1", - unixTimestamp: parseInt((new Date().getTime() / 1000).toFixed(0)), - ttl: 1800 - } - const uniTradeOptions: uni.TradeOptionsDeadline = { - feeOnTransfer: feeRule, - recipient, - allowedSlippage: new uni.Percent(uni.JSBI.BigInt(1000), uni.JSBI.BigInt(10000)), - deadline: parseInt((new Date().getTime() / 1000).toFixed(0)) + 1800 - } - - const swapParametersInvocation = await client.invoke({ - uri: fsUri, - method: "swapCallParameters", - args: { - trade: bestTrade, - tradeOptions: tradeOptions - }, - }); - const swapParameters: App.SwapParameters = swapParametersInvocation.data!; - const parsedArgs: (string | string[])[] = swapParameters.args.map((arg: string) => - arg.startsWith("[") && arg.endsWith("]") ? JSON.parse(arg) : arg - ); - - let expectedSwapParameters: uni.SwapParameters; - if (bestTrade.tradeType === App.TradeTypeEnum.EXACT_INPUT || bestTrade.tradeType === "EXACT_INPUT") { - expectedSwapParameters = uni.Router.swapCallParameters(uniBestTradeIn, uniTradeOptions); - } else { - expectedSwapParameters = uni.Router.swapCallParameters(uniBestTradeOut, uniTradeOptions); - } - - expect(parsedArgs).toStrictEqual(expectedSwapParameters.args); - expect(swapParameters.methodName).toStrictEqual(expectedSwapParameters.methodName); - expect(swapParameters.value).toStrictEqual(expectedSwapParameters.value); - } - }); - - it("successfully constructs swap call parameters with exact eth in/out", async () => { - // we3api tokens and trades - const token0 = ethToken; - const token1 = tokens.filter(token => token.currency.symbol === "WBTC")[0]; - const tokenAmount: App.TokenAmount = { - token: token0, - amount: "1000000000000000000" - }; - const bestTradeInArray: App.Trade[] = await getBestTradeExactIn(pairs, tokenAmount, token1, null, client, fsUri); - const bestTradeIn: App.Trade = bestTradeInArray[0]; - const bestTradeOutArray: App.Trade[] = await getBestTradeExactOut(pairs, token1, tokenAmount, null, client, fsUri); - const bestTradeOut: App.Trade = bestTradeOutArray[0]; - - // uni tokens and trades - const uniAmount: uni.CurrencyAmount = uni.CurrencyAmount.ether(tokenAmount.amount) - const uniToken: uni.Token = new uni.Token( - 1, - token1.address, - token1.currency.decimals, - token1.currency.symbol || "", - token1.currency.name || "" - ); - - const uniBestTradeIn: uni.Trade = uni.Trade.bestTradeExactIn(uniPairs, uniAmount, uniToken)[0]; - const uniBestTradeOut: uni.Trade = uni.Trade.bestTradeExactOut(uniPairs, uniToken, uniAmount)[0]; - - const testCases = [ - {bestTrade: bestTradeIn, feeRule: true}, - {bestTrade: bestTradeIn, feeRule: false}, - {bestTrade: bestTradeOut, feeRule: false} - ]; - for (const {bestTrade, feeRule} of testCases) { - - const tradeOptions: App.TradeOptions = { - feeOnTransfer: feeRule, - recipient, - allowedSlippage: "0.1", - unixTimestamp: parseInt((new Date().getTime() / 1000).toFixed(0)), - ttl: 1800 - } - const uniTradeOptions: uni.TradeOptionsDeadline = { - feeOnTransfer: feeRule, - recipient, - allowedSlippage: new uni.Percent(uni.JSBI.BigInt(1000), uni.JSBI.BigInt(10000)), - deadline: parseInt((new Date().getTime() / 1000).toFixed(0)) + 1800 - } - - const swapParametersInvocation = await client.invoke({ - uri: fsUri, - method: "swapCallParameters", - args: { - trade: bestTrade, - tradeOptions: tradeOptions - }, - }); - const swapParameters: App.SwapParameters = swapParametersInvocation.data!; - const parsedArgs: (string | string[])[] = swapParameters.args.map((arg: string) => - arg.startsWith("[") && arg.endsWith("]") ? JSON.parse(arg) : arg - ); - - let expectedSwapParameters: uni.SwapParameters; - if (bestTrade.tradeType === App.TradeTypeEnum.EXACT_INPUT || bestTrade.tradeType === "EXACT_INPUT") { - expectedSwapParameters = uni.Router.swapCallParameters(uniBestTradeIn, uniTradeOptions); - } else { - expectedSwapParameters = uni.Router.swapCallParameters(uniBestTradeOut, uniTradeOptions); - } - - expect(parsedArgs).toStrictEqual(expectedSwapParameters.args); - expect(swapParameters.methodName).toStrictEqual(expectedSwapParameters.methodName); - expect(swapParameters.value).toStrictEqual(expectedSwapParameters.value); - } - }); - - it("successfully constructs swap call parameters with inexact eth in/out", async () => { - // wrapper tokens and trades - const token0 = tokens.filter(token => token.currency.symbol === "WBTC")[0]; - const token1 = ethToken; - const tokenAmount: App.TokenAmount = { - token: token0, - amount: "100000000" - }; - const bestTradeInArray: App.Trade[] = await getBestTradeExactIn(pairs, tokenAmount, token1, null, client, fsUri); - const bestTradeIn: App.Trade = bestTradeInArray[0]; - const bestTradeOutArray: App.Trade[] = await getBestTradeExactOut(pairs, token1, tokenAmount, null, client, fsUri); - const bestTradeOut: App.Trade = bestTradeOutArray[0]; - - // uni tokens and trades - const uniAmount: uni.TokenAmount = new uni.TokenAmount(new uni.Token( - 1, - tokenAmount.token.address, - tokenAmount.token.currency.decimals, - tokenAmount.token.currency.symbol || "", - tokenAmount.token.currency.name || "" - ), tokenAmount.amount); - const uniToken: uni.Currency = uni.ETHER; - const uniBestTradeIn: uni.Trade = uni.Trade.bestTradeExactIn(uniPairs, uniAmount, uniToken)[0]; - const uniBestTradeOut: uni.Trade = uni.Trade.bestTradeExactOut(uniPairs, uniToken, uniAmount)[0]; - - const testCases = [ - {bestTrade: bestTradeIn, feeRule: true}, - {bestTrade: bestTradeIn, feeRule: false}, - {bestTrade: bestTradeOut, feeRule: false} - ]; - for (const {bestTrade, feeRule} of testCases) { - - const tradeOptions: App.TradeOptions = { - feeOnTransfer: feeRule, - recipient, - allowedSlippage: "0.1", - unixTimestamp: parseInt((new Date().getTime() / 1000).toFixed(0)), - ttl: 1800 - } - const uniTradeOptions: uni.TradeOptionsDeadline = { - feeOnTransfer: feeRule, - recipient, - allowedSlippage: new uni.Percent(uni.JSBI.BigInt(1000), uni.JSBI.BigInt(10000)), - deadline: parseInt((new Date().getTime() / 1000).toFixed(0)) + 1800 - } - - const swapParametersInvocation = await client.invoke({ - uri: fsUri, - method: "swapCallParameters", - args: { - trade: bestTrade, - tradeOptions: tradeOptions - }, - }); - const swapParameters: App.SwapParameters = swapParametersInvocation.data!; - const parsedArgs: (string | string[])[] = swapParameters.args.map((arg: string) => - arg.startsWith("[") && arg.endsWith("]") ? JSON.parse(arg) : arg - ); - - let expectedSwapParameters: uni.SwapParameters; - if (bestTrade.tradeType === App.TradeTypeEnum.EXACT_INPUT || bestTrade.tradeType === "EXACT_INPUT") { - expectedSwapParameters = uni.Router.swapCallParameters(uniBestTradeIn, uniTradeOptions); - } else { - expectedSwapParameters = uni.Router.swapCallParameters(uniBestTradeOut, uniTradeOptions); - } - - expect(parsedArgs).toStrictEqual(expectedSwapParameters.args); - expect(swapParameters.methodName).toStrictEqual(expectedSwapParameters.methodName); - expect(swapParameters.value).toStrictEqual(expectedSwapParameters.value); - } - }); - - it("Should successfully estimate swap call gas", async () => { - const token0 = ethToken; - const token1 = tokens.filter(token => token.currency.symbol === "WBTC")[0]; - const tokenAmount: App.TokenAmount = { - token: token0, - amount: "1000000000000000000" - }; - const bestTradeInArray: App.Trade[] = await getBestTradeExactIn(pairs, tokenAmount, token1, null, client, fsUri); - const bestTradeIn: App.Trade = bestTradeInArray[0]; - - const tradeOptions: App.TradeOptions = { - feeOnTransfer: false, - recipient, - allowedSlippage: "0.1", - unixTimestamp: parseInt((new Date().getTime() / 1000).toFixed(0)), - ttl: 1800 - } - - const swapParametersInvocation = await client.invoke({ - uri: fsUri, - method: "swapCallParameters", - args: { - trade: bestTradeIn, - tradeOptions: tradeOptions, - }, - }); - const swapParameters: App.SwapParameters = swapParametersInvocation.data!; - - const gasEstimateQuery = await client.invoke({ - uri: fsUri, - method: "estimateGas", - args: { - parameters: swapParameters, - chainId: token0.chainId - }, - }); - const actualGasEstimate: string = gasEstimateQuery.data ?? ""; - - // parse swap parameters args - const parsedArgs: (string | string[])[] = swapParameters.args.map((arg: string) => - arg.startsWith("[") && arg.endsWith("]") ? JSON.parse(arg) : arg - ); - - // get expected gas estimate - const uniswapRouterAddress = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"; - const abi = [getSwapMethodAbi(swapParameters.methodName)]; - const contract = new ethers.Contract(uniswapRouterAddress, abi, ethersProvider.getSigner()); - const funcs = Object.keys(contract.interface.functions); - const expectedGasEstimate = await contract.estimateGas[funcs[0]](...parsedArgs, { - value: ethers.BigNumber.from(swapParameters.value), - }); - - expect(actualGasEstimate).toStrictEqual(expectedGasEstimate.toString()); - }); - - it("Should call a swap statically (i.e. does not actually execute but \"pretends\" to execute) and return revert reason", async () => { - const uniToken: App.Token = tokens.filter(token => token.currency.symbol === "UNI")[0]; - for (const tokenIn of [ethToken, uniToken]) { - const tokenOut: App.Token = tokens.filter(token => token.currency.symbol === "WBTC")[0]; - const tokenAmount: App.TokenAmount = { - token: tokenIn, - amount: "10000000000000000000000000000000000000000000000" - }; - - const bestTradeInArray: App.Trade[] = await getBestTradeExactIn(pairs, tokenAmount, tokenOut, null, client, fsUri); - const bestTrade: App.Trade = bestTradeInArray[0]; - - const swapParametersInvocation = await client.invoke({ - uri: fsUri, - method: "swapCallParameters", - args: { - trade: bestTrade, - tradeOptions: { - allowedSlippage: "0.1", - recipient: recipient, - unixTimestamp: parseInt((new Date().getTime() / 1000).toFixed(0)), - ttl: 1800 - } - }, - }); - const swapParameters: App.SwapParameters = swapParametersInvocation.data!; - - const swapStatic = await client.invoke({ - uri: fsUri, - method: "execCallStatic", - args: { - parameters: swapParameters, - chainId: tokenIn.chainId, - }, - }); - const exception: App.Ethereum_StaticTxResult | undefined = swapStatic.data; - expect(exception?.error).toStrictEqual(true) - - // parse swap parameters args - const parsedArgs: (string | string[])[] = swapParameters.args.map((arg: string) => - arg.startsWith("[") && arg.endsWith("]") ? JSON.parse(arg) : arg - ); - - // get expected exception or lack thereof - const uniswapRouterAddress = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"; - const abi = [getSwapMethodAbi(swapParameters.methodName)]; - const contract = new ethers.Contract(uniswapRouterAddress, abi, ethersProvider.getSigner(recipient)); - let ethersException = ""; - try { - await contract.callStatic[swapParameters.methodName](...parsedArgs, { - value: swapParameters.value, - }); - } catch (e) { - ethersException = e.reason; - } - - expect(exception?.result).toStrictEqual(ethersException); - } - }); -}); diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/swap_e2e.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/swap_e2e.spec.ts deleted file mode 100644 index a9a5d2083..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/swap_e2e.spec.ts +++ /dev/null @@ -1,195 +0,0 @@ -import {ClientConfig, PolywrapClient} from "@polywrap/client-js"; -import path from "path"; -import { - approveToken, execSwap, execTrade, - getBestTradeExactIn, - getBestTradeExactOut, - getPairData, - getTokenList -} from "../testUtils"; -import { getPlugins, initInfra, stopInfra } from "../infraUtils"; -import { Contract, ethers, providers } from "ethers"; -import erc20ABI from "./testData/erc20ABI.json"; -import * as App from "./types/wrap" - -jest.setTimeout(360000); -jest.retryTimes(5) - -const getTradeOptions = (recipient: string): App.TradeOptions => ({ - allowedSlippage: "0.1", - recipient: recipient, - unixTimestamp: parseInt((new Date().getTime() / 1000).toFixed(0)), - ttl: 1800 -}); - -describe("Swap", () => { - - let client: PolywrapClient; - let recipient: string; - let fsUri: string; - let tokens: App.Token[]; - let ethersProvider: providers.JsonRpcProvider; - let ethCurrency: App.Currency; - let dai: App.Token; - let weth: App.Token; - let usdc: App.Token; - let usdt: App.Token; - let wbtc: App.Token; - - beforeAll(async () => { - await initInfra(); - // get client - const config: Partial = getPlugins(); - client = new PolywrapClient(config); - // deploy api - const wrapperAbsPath: string = path.resolve(__dirname + "/../../.."); - fsUri = "fs/" + wrapperAbsPath + '/build'; - ethersProvider = ethers.providers.getDefaultProvider("http://localhost:8546") as providers.JsonRpcProvider; - recipient = await ethersProvider.getSigner().getAddress(); - - // set up test case data - tokens = await getTokenList(); - dai = tokens.filter(token => token.currency.symbol === "DAI")[0]; - usdc = tokens.filter(token => token.currency.symbol === "USDC")[0]; - usdt = tokens.filter(token => token.currency.symbol === "USDT")[0]; - wbtc = tokens.filter(token => token.currency.symbol === "WBTC")[0]; - for (const token of [dai, usdc, usdt, wbtc]) { - const txResponse: App.Ethereum_TxResponse = await approveToken(token, client, fsUri); - const approveTx = await ethersProvider.getTransaction(txResponse.hash); - await approveTx.wait(); - } - - weth = tokens.filter(token => token.currency.symbol === "WETH")[0]; - ethCurrency = { - decimals: 18, - name: "Ether", - symbol: "ETH", - }; - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("Should successfully EXEC ether -> dai -> usdc -> ether", async () => { - const weth_dai: App.Pair = await getPairData(weth, dai, client, fsUri) as App.Pair; - const dai_usdc: App.Pair = await getPairData(dai, usdc, client, fsUri) as App.Pair; - const usdc_weth: App.Pair = await getPairData(usdc, weth, client, fsUri) as App.Pair; - - const daiContract = new Contract(dai.address, erc20ABI, ethersProvider); - const usdcContract = new Contract(usdc.address, erc20ABI, ethersProvider); - - const etherDaiOut = "1000000000000000000000"; // $1,000 - const daiUsdcIn = "100000000000000000000"; // $100 - const usdcEthIn = "10000000"; // $10; - - // EXEC eth -> dai - const etherDaiAmountOut: App.TokenAmount = { - token: dai, - amount: etherDaiOut, - }; - const etherDaiBestTrades: App.Trade[] = await getBestTradeExactOut([weth_dai], weth, etherDaiAmountOut, null, client, fsUri); - const etherDaiTrade: App.Trade = etherDaiBestTrades[0]; - etherDaiTrade.route.path[0].currency = ethCurrency; - etherDaiTrade.route.pairs[0].tokenAmount1.token.currency = ethCurrency; - etherDaiTrade.route.input.currency = ethCurrency; - etherDaiTrade.inputAmount.token.currency = ethCurrency; - const etherDaiTxResponse = await execTrade(etherDaiTrade, getTradeOptions(recipient), client, fsUri); - const etherDaiTx = await ethersProvider.getTransaction(etherDaiTxResponse.hash); - await etherDaiTx.wait(); - // CHECK eth -> dai - expect((await daiContract.balanceOf(recipient)).gte(etherDaiOut)).toBeTruthy(); - - // EXEC dai -> usdc - const daiUsdcAmountIn: App.TokenAmount = { - token: dai, - amount: daiUsdcIn, - }; - const daiUsdcBestTrades: App.Trade[] = await getBestTradeExactIn([dai_usdc], daiUsdcAmountIn, usdc, null, client, fsUri); - const daiUsdcTrade: App.Trade = daiUsdcBestTrades[0]; - const daiUsdcTxResponse = await execTrade(daiUsdcTrade, getTradeOptions(recipient), client, fsUri); - const daiUsdcTx = await ethersProvider.getTransaction(daiUsdcTxResponse.hash); - await daiUsdcTx.wait(); - // CHECK dai -> usdc - const daiBalanceAfterDaiUsdc = await daiContract.balanceOf(recipient); - const expectedDaiBalanceAfterDaiUsdc = ethers.BigNumber.from(etherDaiOut).sub(daiUsdcIn); - expect(daiBalanceAfterDaiUsdc.toString()).toBe(expectedDaiBalanceAfterDaiUsdc.toString()); - const usdcBalance = await usdcContract.balanceOf(recipient); - expect(usdcBalance.gt("0")).toBeTruthy(); - - // EXEC usdc -> eth - const usdcEthAmountIn: App.TokenAmount = { - token: usdc, - amount: usdcEthIn, - }; - const usdcEthBestTrades: App.Trade[] = await getBestTradeExactIn([usdc_weth], usdcEthAmountIn, weth, null, client, fsUri); - const usdcEthTrade: App.Trade = usdcEthBestTrades[0]; - usdcEthTrade.route.path[1].currency = ethCurrency; - usdcEthTrade.route.pairs[0].tokenAmount1.token.currency = ethCurrency; - usdcEthTrade.route.output.currency = ethCurrency; - usdcEthTrade.outputAmount.token.currency = ethCurrency; - const usdcEthTxResponse = await execTrade(usdcEthTrade, getTradeOptions(recipient), client, fsUri); - const usdcEthTx = await ethersProvider.getTransaction(usdcEthTxResponse.hash); - await usdcEthTx.wait(); - // CHECK usdc -> eth - const usdcBalanceAfterUsdcEth: ethers.BigNumber = await usdcContract.balanceOf(recipient); - expect(usdcBalanceAfterUsdcEth.lt(usdcBalance)).toBeTruthy(); - }); - - it("Should successfully SWAP ether -> usdt -> wbtc -> ether", async () => { - const usdtContract = new Contract(usdt.address, erc20ABI, ethersProvider); - const wbtcContract = new Contract(wbtc.address, erc20ABI, ethersProvider); - - const ethToken: App.Token = { - chainId: App.ChainIdEnum.MAINNET, - address: "", - currency: ethCurrency, - } - - const ethUsdtIn = "1000000000000000000"; // 1 Eth - const usdtWbtcIn = "500000000"; // $500 - const wbtcEthOut = "100000000000000000"; // 0.1 Eth; - - // EXEC eth -> Usdt - const ethUsdtStart = await ethersProvider.getBalance(recipient); - const ethUsdtTxResponse = await execSwap(ethToken, usdt, ethUsdtIn, App.TradeTypeEnum.EXACT_INPUT, getTradeOptions(recipient), client, fsUri); - const ethUsdtTx = await ethersProvider.getTransaction(ethUsdtTxResponse.hash); - await ethUsdtTx.wait(); - const ethUsdtEnd = await ethersProvider.getBalance(recipient); - // CHECK eth -> usdt - // bounding tests to account for unknown gas cost - const ethUsdtUpper = ethUsdtStart.sub(ethUsdtIn); - const ethUsdtLower = ethUsdtStart.sub(ethUsdtIn).sub("10000000000000000"); - expect(ethUsdtEnd.lte(ethUsdtUpper)).toBeTruthy(); - expect(ethUsdtEnd.gte(ethUsdtLower)).toBeTruthy(); - - // EXEC Usdt -> wbtc - const usdtWbtcStart: ethers.BigNumber = await usdtContract.balanceOf(recipient); - const usdtWbtcTxResponse = await execSwap(usdt, wbtc, usdtWbtcIn, App.TradeTypeEnum.EXACT_INPUT, getTradeOptions(recipient), client, fsUri); - const usdtWbtcTx = await ethersProvider.getTransaction(usdtWbtcTxResponse.hash); - await usdtWbtcTx.wait(); - // CHECK usdt -> wbtc - const usdtWbtcEnd: ethers.BigNumber = await usdtContract.balanceOf(recipient); - const expectedUsdtAfterUsdtWbtc = usdtWbtcStart.sub(usdtWbtcIn); - expect(usdtWbtcEnd.eq(expectedUsdtAfterUsdtWbtc)).toBeTruthy(); - const wbtcBalance = await wbtcContract.balanceOf(recipient); - expect(wbtcBalance.gte(0)).toBeTruthy(); - - // EXEC wbtc -> eth - const wbtcEthStart = await ethersProvider.getBalance(recipient); - const wbtcEthTxResponse = await execSwap(wbtc, ethToken, wbtcEthOut, App.TradeTypeEnum.EXACT_OUTPUT, getTradeOptions(recipient), client, fsUri); - const wbtcEthTx = await ethersProvider.getTransaction(wbtcEthTxResponse.hash); - await wbtcEthTx.wait(); - const wbtcEthEnd = await ethersProvider.getBalance(recipient); - // CHECK wbtc -> eth - // bounding tests to account for unknown gas cost - const wbtcEthUpper = wbtcEthStart.add(wbtcEthOut); - const wbtcEthLower = wbtcEthStart.add(wbtcEthOut).sub("10000000000000000"); - expect(wbtcEthEnd.lte(wbtcEthUpper)).toBeTruthy(); - expect(wbtcEthEnd.gte(wbtcEthLower)).toBeTruthy(); - // expect to have less wbtc - const wbtcBalanceAfterWbtcEth: ethers.BigNumber = await wbtcContract.balanceOf(recipient); - expect(wbtcBalanceAfterWbtcEth.lt(wbtcBalance)).toBeTruthy(); - }); -}); - diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/testData/erc20ABI.json b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/testData/erc20ABI.json deleted file mode 100644 index adb9174b9..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/testData/erc20ABI.json +++ /dev/null @@ -1,224 +0,0 @@ -[ - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - } -] diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/testData/tokenList.json b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/testData/tokenList.json deleted file mode 100644 index d9b89a1bd..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/testData/tokenList.json +++ /dev/null @@ -1,410 +0,0 @@ -[ - { - "chainId": 1, - "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", - "name": "Aave", - "symbol": "AAVE", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/12645/thumb/AAVE.png?1601374110" - }, - { - "chainId": 1, - "address": "0xfF20817765cB7f73d4bde2e66e067E58D11095C2", - "name": "Amp", - "symbol": "AMP", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/12409/thumb/amp-200x200.png?1599625397" - }, - { - "name": "Aragon Network Token", - "address": "0x960b236A07cf122663c4303350609A66A7B288C0", - "symbol": "ANT", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x960b236A07cf122663c4303350609A66A7B288C0/logo.png" - }, - { - "name": "Balancer", - "address": "0xba100000625a3754423978a60c9317c58a424e3D", - "symbol": "BAL", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xba100000625a3754423978a60c9317c58a424e3D/logo.png" - }, - { - "chainId": 1, - "address": "0xBA11D00c5f74255f56a5E366F4F77f5A186d7f55", - "name": "Band Protocol", - "symbol": "BAND", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/9545/thumb/band-protocol.png?1568730326" - }, - { - "name": "Bancor Network Token", - "address": "0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C", - "symbol": "BNT", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C/logo.png" - }, - { - "name": "Compound", - "address": "0xc00e94Cb662C3520282E6f5717214004A7f26888", - "symbol": "COMP", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xc00e94Cb662C3520282E6f5717214004A7f26888/logo.png" - }, - { - "name": "Curve DAO Token", - "address": "0xD533a949740bb3306d119CC777fa900bA034cd52", - "symbol": "CRV", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xD533a949740bb3306d119CC777fa900bA034cd52/logo.png" - }, - { - "chainId": 1, - "address": "0x41e5560054824eA6B0732E656E3Ad64E20e94E45", - "name": "Civic", - "symbol": "CVC", - "decimals": 8, - "logoURI": "https://assets.coingecko.com/coins/images/788/thumb/civic.png?1547034556" - }, - { - "name": "Dai Stablecoin", - "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", - "symbol": "DAI", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png" - }, - { - "chainId": 1, - "address": "0x0AbdAce70D3790235af448C88547603b945604ea", - "name": "district0x", - "symbol": "DNT", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/849/thumb/district0x.png?1547223762" - }, - { - "name": "Gnosis Token", - "address": "0x6810e776880C02933D47DB1b9fc05908e5386b96", - "symbol": "GNO", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6810e776880C02933D47DB1b9fc05908e5386b96/logo.png" - }, - { - "chainId": 1, - "address": "0xc944E90C64B2c07662A292be6244BDf05Cda44a7", - "name": "The Graph", - "symbol": "GRT", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/13397/thumb/Graph_Token.png?1608145566" - }, - { - "chainId": 1, - "address": "0x85Eee30c52B0b379b046Fb0F85F4f3Dc3009aFEC", - "name": "Keep Network", - "symbol": "KEEP", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/3373/thumb/IuNzUb5b_400x400.jpg?1589526336" - }, - { - "name": "Kyber Network Crystal", - "address": "0xdd974D5C2e2928deA5F71b9825b8b646686BD200", - "symbol": "KNC", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdd974D5C2e2928deA5F71b9825b8b646686BD200/logo.png" - }, - { - "name": "ChainLink Token", - "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA", - "symbol": "LINK", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x514910771AF9Ca656af840dff83E8264EcF986CA/logo.png" - }, - { - "name": "Loom Network", - "address": "0xA4e8C3Ec456107eA67d3075bF9e3DF3A75823DB0", - "symbol": "LOOM", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA4e8C3Ec456107eA67d3075bF9e3DF3A75823DB0/logo.png" - }, - { - "name": "LoopringCoin V2", - "address": "0xBBbbCA6A901c926F240b89EacB641d8Aec7AEafD", - "symbol": "LRC", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xBBbbCA6A901c926F240b89EacB641d8Aec7AEafD/logo.png" - }, - { - "chainId": 1, - "address": "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942", - "name": "Decentraland", - "symbol": "MANA", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/878/thumb/decentraland-mana.png?1550108745" - }, - { - "name": "Maker", - "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", - "symbol": "MKR", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2/logo.png" - }, - { - "chainId": 1, - "address": "0xec67005c4E498Ec7f55E092bd1d35cbC47C91892", - "name": "Melon", - "symbol": "MLN", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/605/thumb/melon.png?1547034295" - }, - { - "name": "Numeraire", - "address": "0x1776e1F26f98b1A5dF9cD347953a26dd3Cb46671", - "symbol": "NMR", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x1776e1F26f98b1A5dF9cD347953a26dd3Cb46671/logo.png" - }, - { - "chainId": 1, - "address": "0x4fE83213D56308330EC302a8BD641f1d0113A4Cc", - "name": "NuCypher", - "symbol": "NU", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/3318/thumb/photo1198982838879365035.jpg?1547037916" - }, - { - "name": "Orchid", - "address": "0x4575f41308EC1483f3d399aa9a2826d74Da13Deb", - "symbol": "OXT", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x4575f41308EC1483f3d399aa9a2826d74Da13Deb/logo.png" - }, - { - "name": "Republic Token", - "address": "0x408e41876cCCDC0F92210600ef50372656052a38", - "symbol": "REN", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x408e41876cCCDC0F92210600ef50372656052a38/logo.png" - }, - { - "name": "Reputation Augur v1", - "address": "0x1985365e9f78359a9B6AD760e32412f4a445E862", - "symbol": "REP", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x1985365e9f78359a9B6AD760e32412f4a445E862/logo.png" - }, - { - "name": "Reputation Augur v2", - "address": "0x221657776846890989a759BA2973e427DfF5C9bB", - "symbol": "REPv2", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x221657776846890989a759BA2973e427DfF5C9bB/logo.png" - }, - { - "name": "Synthetix Network Token", - "address": "0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F", - "symbol": "SNX", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F/logo.png" - }, - { - "name": "Storj Token", - "address": "0xB64ef51C888972c908CFacf59B47C1AfBC0Ab8aC", - "symbol": "STORJ", - "decimals": 8, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xB64ef51C888972c908CFacf59B47C1AfBC0Ab8aC/logo.png" - }, - { - "chainId": 1, - "address": "0x8dAEBADE922dF735c38C80C7eBD708Af50815fAa", - "name": "tBTC", - "symbol": "TBTC", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/11224/thumb/tBTC.png?1589620754" - }, - { - "name": "UMA Voting Token v1", - "address": "0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828", - "symbol": "UMA", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828/logo.png" - }, - { - "name": "Uniswap", - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - "symbol": "UNI", - "decimals": 18, - "chainId": 1, - "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg" - }, - { - "name": "USDCoin", - "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "symbol": "USDC", - "decimals": 6, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" - }, - { - "name": "Tether USD", - "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", - "symbol": "USDT", - "decimals": 6, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png" - }, - { - "name": "Wrapped BTC", - "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", - "symbol": "WBTC", - "decimals": 8, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/logo.png" - }, - { - "name": "Wrapped Ether", - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "symbol": "WETH", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png" - }, - { - "chainId": 1, - "address": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", - "name": "yearn finance", - "symbol": "YFI", - "decimals": 18, - "logoURI": "https://assets.coingecko.com/coins/images/11849/thumb/yfi-192x192.png?1598325330" - }, - { - "name": "0x Protocol Token", - "address": "0xE41d2489571d322189246DaFA5ebDe1F4699F498", - "symbol": "ZRX", - "decimals": 18, - "chainId": 1, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xE41d2489571d322189246DaFA5ebDe1F4699F498/logo.png" - }, - { - "name": "Dai Stablecoin", - "address": "0xaD6D458402F60fD3Bd25163575031ACDce07538D", - "symbol": "DAI", - "decimals": 18, - "chainId": 3, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xaD6D458402F60fD3Bd25163575031ACDce07538D/logo.png" - }, - { - "name": "Uniswap", - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - "symbol": "UNI", - "decimals": 18, - "chainId": 3, - "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg" - }, - { - "name": "Wrapped Ether", - "address": "0xc778417E063141139Fce010982780140Aa0cD5Ab", - "symbol": "WETH", - "decimals": 18, - "chainId": 3, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xc778417E063141139Fce010982780140Aa0cD5Ab/logo.png" - }, - { - "name": "Dai Stablecoin", - "address": "0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735", - "symbol": "DAI", - "decimals": 18, - "chainId": 4, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735/logo.png" - }, - { - "name": "Maker", - "address": "0xF9bA5210F91D0474bd1e1DcDAeC4C58E359AaD85", - "symbol": "MKR", - "decimals": 18, - "chainId": 4, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xF9bA5210F91D0474bd1e1DcDAeC4C58E359AaD85/logo.png" - }, - { - "name": "Uniswap", - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - "symbol": "UNI", - "decimals": 18, - "chainId": 4, - "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg" - }, - { - "name": "Wrapped Ether", - "address": "0xc778417E063141139Fce010982780140Aa0cD5Ab", - "symbol": "WETH", - "decimals": 18, - "chainId": 4, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xc778417E063141139Fce010982780140Aa0cD5Ab/logo.png" - }, - { - "name": "Uniswap", - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - "symbol": "UNI", - "decimals": 18, - "chainId": 5, - "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg" - }, - { - "name": "Wrapped Ether", - "address": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", - "symbol": "WETH", - "decimals": 18, - "chainId": 5, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6/logo.png" - }, - { - "name": "Dai Stablecoin", - "address": "0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa", - "symbol": "DAI", - "decimals": 18, - "chainId": 42, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa/logo.png" - }, - { - "name": "Maker", - "address": "0xAaF64BFCC32d0F15873a02163e7E500671a4ffcD", - "symbol": "MKR", - "decimals": 18, - "chainId": 42, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xAaF64BFCC32d0F15873a02163e7E500671a4ffcD/logo.png" - }, - { - "name": "Uniswap", - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - "symbol": "UNI", - "decimals": 18, - "chainId": 42, - "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg" - }, - { - "name": "Wrapped Ether", - "address": "0xd0A1E359811322d97991E03f863a0C30C2cF029C", - "symbol": "WETH", - "decimals": 18, - "chainId": 42, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xd0A1E359811322d97991E03f863a0C30C2cF029C/logo.png" - } -] diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/trade_e2e.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/trade_e2e.spec.ts deleted file mode 100644 index 36df8ff47..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/trade_e2e.spec.ts +++ /dev/null @@ -1,477 +0,0 @@ -import { ClientConfig, PolywrapClient } from "@polywrap/client-js"; -import * as path from "path"; -import { getPairData, getTokenList, getUniPairs } from "../testUtils"; -import { getPlugins, initInfra, stopInfra } from "../infraUtils"; -import * as uni from "@uniswap/sdk"; -import * as App from "./types/wrap"; - -jest.setTimeout(180000); - -describe('trade e2e', () => { - - let client: PolywrapClient; - let fsUri: string; - let tokens: App.Token[] = []; - let pairs: App.Pair[] = []; - let uniPairs: uni.Pair[]; - let ethToken: App.Token; - - beforeAll(async () => { - await initInfra(); - // get client - const config: Partial = getPlugins(); - client = new PolywrapClient(config); - // deploy api - const wrapperAbsPath: string = path.resolve(__dirname + "/../../.."); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // pick some test case tokens - const allTokens: App.Token[] = await getTokenList(); - const aave: App.Token = allTokens.filter(token => token.currency.symbol === "AAVE")[0]; - const dai: App.Token = allTokens.filter(token => token.currency.symbol === "DAI")[0]; - const usdc: App.Token = allTokens.filter(token => token.currency.symbol === "USDC")[0]; - const comp: App.Token = allTokens.filter(token => token.currency.symbol === "COMP")[0]; - const weth: App.Token = allTokens.filter(token => token.currency.symbol === "WETH")[0]; - const wbtc: App.Token = allTokens.filter(token => token.currency.symbol === "WBTC")[0]; - const uniswap: App.Token = allTokens.filter(token => token.currency.symbol === "UNI")[0]; - const link: App.Token = allTokens.filter(token => token.currency.symbol === "LINK")[0]; - ethToken = { - chainId: App.ChainIdEnum.MAINNET, - address: "", - currency: { - decimals: 18, - name: "Ether", - symbol: "ETH", - }, - } - tokens = [aave, dai, usdc, comp, weth, wbtc, uniswap, link]; - // create test case pairs - const aave_dai: App.Pair | undefined = await getPairData(aave, dai, client, fsUri); - const usdc_dai: App.Pair | undefined = await getPairData(usdc, dai, client, fsUri); - const link_usdc: App.Pair | undefined = await getPairData(link, usdc, client, fsUri); - const comp_weth: App.Pair | undefined = await getPairData(comp, weth, client, fsUri); - const uni_link: App.Pair | undefined = await getPairData(uniswap, link, client, fsUri); - const uni_wbtc: App.Pair | undefined = await getPairData(uniswap, wbtc, client, fsUri); - const wbtc_weth: App.Pair | undefined = await getPairData(wbtc, weth, client, fsUri); - [aave_dai, usdc_dai, link_usdc, uni_link, uni_wbtc, wbtc_weth, comp_weth].forEach(pair => { - if (pair) { - pairs.push(pair) - } - }); - - uniPairs = getUniPairs(pairs, 1); - }); - - afterAll(async () => { - await stopInfra(); - }) - - it('creates a trade', async () => { - const routePairs: App.Pair[] = [pairs[1], pairs[2], pairs[3]]; - const uniRoutePairs: uni.Pair[] = [uniPairs[1], uniPairs[2], uniPairs[3]]; - const tokenIn: App.Token = tokens[1]; - const tokenOut: App.Token = tokens[6]; - const amountIn: App.TokenAmount = { token: tokenIn, amount: "1000000000000000000" }; - const route = await client.invoke({ - uri: fsUri, - method: "createRoute", - args: { - pairs: routePairs, - input: tokenIn, - output: tokenOut, - } - }); - const actualTrade = await client.invoke({ - uri: fsUri, - method: "createTrade", - args: { - route: route.data, - amount: amountIn, - tradeType: "EXACT_INPUT", - } - }); - // expected trade - const uniAmountIn: uni.TokenAmount = new uni.TokenAmount(new uni.Token( - 1, - amountIn.token.address, - amountIn.token.currency.decimals, - amountIn.token.currency.symbol || "", - amountIn.token.currency.name || "" - ), amountIn.amount); - const uniTokenOut: uni.Token = new uni.Token( - 1, - tokenOut.address, - tokenOut.currency.decimals, - tokenOut.currency.symbol || "", - tokenOut.currency.name || "" - ); - const expectedRoute: uni.Route = new uni.Route(uniRoutePairs, uniAmountIn.currency, uniTokenOut) - const expectedTrade: uni.Trade = new uni.Trade(expectedRoute, uniAmountIn, 0); - // compare paths - const actualPath: string[] = actualTrade.data?.route.path.map(token => token.currency.symbol || "")!; - const expectedPath: string[] = expectedTrade.route.path.map(token => token.symbol ?? ""); - expect(actualPath).toStrictEqual(expectedPath); - // compare output amounts - expect(actualTrade.data?.outputAmount.amount).toStrictEqual(expectedTrade.outputAmount.numerator.toString()); - }); - - it('finds the best trade for exact input (default options)', async () => { - for (let i = 0; i < tokens.length; i++) { - for (let j = 0; j < tokens.length; j++) { - if (tokens[i] === tokens[j]) { - continue; - } - // get best trades - const amountIn: App.TokenAmount = { - token: tokens[i], - amount: "1000000000000000000" - } - const tokenOut = tokens[j]; - const invocation = await client.invoke({ - uri: fsUri, - method: "bestTradeExactIn", - args: { - pairs, - amountIn, - tokenOut, - options: null - } - }); - const actualTrades: App.Trade[] = invocation.data ?? []; - // expected best trades - const uniAmountIn: uni.TokenAmount = new uni.TokenAmount(new uni.Token( - 1, - amountIn.token.address, - amountIn.token.currency.decimals, - amountIn.token.currency.symbol || "", - amountIn.token.currency.name || "" - ), amountIn.amount); - const uniTokenOut: uni.Token = new uni.Token( - 1, - tokenOut.address, - tokenOut.currency.decimals, - tokenOut.currency.symbol || "", - tokenOut.currency.name || "" - ); - const expectedTrades = uni.Trade.bestTradeExactIn(uniPairs, uniAmountIn, uniTokenOut); - // compare trade array lengths and trade type - if (actualTrades.length !== expectedTrades.length) { - console.log("actual path: " + actualTrades[0]?.route.path.map(token => token.currency.symbol).toString()) - console.log("expected path: " + expectedTrades[0]?.route.path.map(token => token.symbol).toString()) - console.log(invocation.error); - } - expect(actualTrades.length).toStrictEqual(expectedTrades.length); - if (actualTrades.length === 0 && expectedTrades.length === 0) { - continue; - } - expect(actualTrades[0].tradeType).toStrictEqual(expectedTrades[0].tradeType); - // compare trade route paths - for (let k = 0; k < actualTrades.length; k++) { - const actualTrade = actualTrades[k]; - const expectedTrade = expectedTrades[k]; - const actualRoutePath: string[] = actualTrade.route.path.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedTrade.route.path.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - // compare result amounts - for (let k = 0; k < actualTrades.length; k++) { - expect(actualTrades[k].outputAmount.amount).toStrictEqual(expectedTrades[k].outputAmount.numerator.toString()); - } - } - } - }); - - it('finds the best trade for exact output (default options)', async () => { - for (let i = 0; i < tokens.length; i++) { - for (let j = 0; j < tokens.length; j++) { - if (tokens[i] === tokens[j]) { - continue; - } - // get best trades - const tokenIn = tokens[i]; - const amountOut: App.TokenAmount = { - token: tokens[j], - amount: "1000000000000000000" - } - const invocation = await client.invoke({ - uri: fsUri, - method: "bestTradeExactOut", - args: { - pairs, - tokenIn, - amountOut, - options: null - } - }); - const actualTrades: App.Trade[] = invocation.data ?? []; - // expected best trades - const uniTokenIn: uni.Token = new uni.Token( - 1, - tokenIn.address, - tokenIn.currency.decimals, - tokenIn.currency.symbol || "", - tokenIn.currency.name || "" - ); - const uniAmountOut: uni.TokenAmount = new uni.TokenAmount(new uni.Token( - 1, - amountOut.token.address, - amountOut.token.currency.decimals, - amountOut.token.currency.symbol || "", - amountOut.token.currency.name || "" - ), amountOut.amount); - const expectedTrades = uni.Trade.bestTradeExactOut(uniPairs, uniTokenIn, uniAmountOut); - // compare trade array lengths and trade type - if (actualTrades.length !== expectedTrades.length) { - console.log("actual path: " + actualTrades[0]?.route.path.map(token => token.currency.symbol).toString()) - console.log("expected path: " + expectedTrades[0]?.route.path.map(token => token.symbol).toString()) - console.log(invocation.error); - } - expect(actualTrades.length).toStrictEqual(expectedTrades.length); - if (actualTrades.length === 0 && expectedTrades.length === 0) { - continue; - } - expect(actualTrades[0].tradeType).toStrictEqual(expectedTrades[0].tradeType); - // compare trade route paths - for (let k = 0; k < actualTrades.length; k++) { - const actualTrade = actualTrades[k]; - const expectedTrade = expectedTrades[k]; - const actualRoutePath: string[] = actualTrade.route.path.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedTrade.route.path.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - // compare result amounts - for (let k = 0; k < actualTrades.length; k++) { - expect(actualTrades[k].inputAmount.amount).toStrictEqual(expectedTrades[k].inputAmount.numerator.toString()); - } - } - } - }); - - - it('finds the best trade for exact input with Eth input', async () => { - // get best trades - const amountIn: App.TokenAmount = { - token: ethToken, - amount: "1000000000000000000" - } - const tokenOut: App.Token = tokens.filter(token => token.currency.symbol === "COMP")[0]; - const invocation = await client.invoke({ - uri: fsUri, - method: "bestTradeExactIn", - args: { - pairs, - amountIn, - tokenOut, - options: null - } - }); - const actualTrades: App.Trade[] = invocation.data ?? []; - // expected best trades - const uniAmountIn: uni.CurrencyAmount = uni.CurrencyAmount.ether(amountIn.amount); - const uniTokenOut: uni.Token = new uni.Token( - 1, - tokenOut.address, - tokenOut.currency.decimals, - tokenOut.currency.symbol || "", - tokenOut.currency.name || "" - ); - const expectedTrades = uni.Trade.bestTradeExactIn(uniPairs, uniAmountIn, uniTokenOut); - // compare trade array lengths and trade type - if (actualTrades.length !== expectedTrades.length) { - console.log("actual path: " + actualTrades[0]?.route.path.map(token => token.currency.symbol).toString()) - console.log("expected path: " + expectedTrades[0]?.route.path.map(token => token.symbol).toString()) - console.log(invocation.error); - } - expect(actualTrades.length).toStrictEqual(expectedTrades.length); - expect(actualTrades[0].tradeType).toStrictEqual(expectedTrades[0].tradeType); - // compare trade route paths - for (let k = 0; k < actualTrades.length; k++) { - const actualTrade = actualTrades[k]; - const expectedTrade = expectedTrades[k]; - const actualRoutePath: string[] = actualTrade.route.path.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedTrade.route.path.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - // compare result amounts - for (let k = 0; k < actualTrades.length; k++) { - expect(actualTrades[k].outputAmount.amount).toStrictEqual(expectedTrades[k].outputAmount.numerator.toString()); - } - // compare input and output tokens for best trade - const actualInputToken = actualTrades[0].inputAmount.token.currency.symbol - const expectedInputToken = expectedTrades[0].inputAmount.currency.symbol - expect(actualInputToken).toStrictEqual(expectedInputToken); - const actualOutputToken = actualTrades[0].outputAmount.token.currency.symbol - const expectedOutputToken = expectedTrades[0].outputAmount.currency.symbol - expect(actualOutputToken).toStrictEqual(expectedOutputToken); - }); - - it('finds the best trade for exact input with Eth output', async () => { - // get best trades - const amountIn: App.TokenAmount = { - token: tokens.filter(token => token.currency.symbol === "COMP")[0], - amount: "1000000000000000000" - } - const tokenOut: App.Token = ethToken - const invocation = await client.invoke({ - uri: fsUri, - method: "bestTradeExactIn", - args: { - pairs, - amountIn, - tokenOut, - options: null - } - }); - const actualTrades: App.Trade[] = invocation.data ?? []; - // expected best trades - const uniAmountIn: uni.TokenAmount = new uni.TokenAmount(new uni.Token( - 1, - amountIn.token.address, - amountIn.token.currency.decimals, - amountIn.token.currency.symbol || "", - amountIn.token.currency.name || "" - ), amountIn.amount); - const uniTokenOut: uni.Currency = uni.ETHER - const expectedTrades = uni.Trade.bestTradeExactIn(uniPairs, uniAmountIn, uniTokenOut); - // compare trade array lengths and trade type - if (actualTrades.length !== expectedTrades.length) { - console.log("actual path: " + actualTrades[0]?.route.path.map(token => token.currency.symbol).toString()) - console.log("expected path: " + expectedTrades[0]?.route.path.map(token => token.symbol).toString()) - console.log(invocation.error); - } - expect(actualTrades.length).toStrictEqual(expectedTrades.length); - expect(actualTrades[0].tradeType).toStrictEqual(expectedTrades[0].tradeType); - // compare trade route paths - for (let k = 0; k < actualTrades.length; k++) { - const actualTrade = actualTrades[k]; - const expectedTrade = expectedTrades[k]; - const actualRoutePath: string[] = actualTrade.route.path.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedTrade.route.path.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - // compare result amounts - for (let k = 0; k < actualTrades.length; k++) { - expect(actualTrades[k].outputAmount.amount).toStrictEqual(expectedTrades[k].outputAmount.numerator.toString()); - } - // compare input and output tokens for best trade - const actualInputToken = actualTrades[0].inputAmount.token.currency.symbol - const expectedInputToken = expectedTrades[0].inputAmount.currency.symbol - expect(actualInputToken).toStrictEqual(expectedInputToken); - const actualOutputToken = actualTrades[0].outputAmount.token.currency.symbol - const expectedOutputToken = expectedTrades[0].outputAmount.currency.symbol - expect(actualOutputToken).toStrictEqual(expectedOutputToken); - }); - - it('finds the best trade for exact output with Eth input', async () => { - // get best trades - const tokenIn: App.Token = ethToken; - const amountOut: App.TokenAmount = { - token: tokens.filter(token => token.currency.symbol === "COMP")[0], - amount: "1000000000000000000" - } - const invocation = await client.invoke({ - uri: fsUri, - method: "bestTradeExactOut", - args: { - pairs, - tokenIn, - amountOut, - options: null - } - }); - const actualTrades: App.Trade[] = invocation.data ?? []; - // expected best trades - const uniTokenIn: uni.Currency = uni.ETHER; - const uniAmountOut: uni.TokenAmount = new uni.TokenAmount(new uni.Token( - 1, - amountOut.token.address, - amountOut.token.currency.decimals, - amountOut.token.currency.symbol || "", - amountOut.token.currency.name || "" - ), amountOut.amount); - const expectedTrades = uni.Trade.bestTradeExactOut(uniPairs, uniTokenIn, uniAmountOut); - // compare trade array lengths and trade type - if (actualTrades.length !== expectedTrades.length) { - console.log("actual path: " + actualTrades[0]?.route.path.map(token => token.currency.symbol).toString()) - console.log("expected path: " + expectedTrades[0]?.route.path.map(token => token.symbol).toString()) - console.log(invocation.error); - } - expect(actualTrades.length).toStrictEqual(expectedTrades.length); - expect(actualTrades[0].tradeType).toStrictEqual(expectedTrades[0].tradeType); - // compare trade route paths - for (let k = 0; k < actualTrades.length; k++) { - const actualTrade = actualTrades[k]; - const expectedTrade = expectedTrades[k]; - const actualRoutePath: string[] = actualTrade.route.path.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedTrade.route.path.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - // compare result amounts - for (let k = 0; k < actualTrades.length; k++) { - expect(actualTrades[k].outputAmount.amount).toStrictEqual(expectedTrades[k].outputAmount.numerator.toString()); - } - // compare input and output tokens for best trade - const actualInputToken = actualTrades[0].inputAmount.token.currency.symbol - const expectedInputToken = expectedTrades[0].inputAmount.currency.symbol - expect(actualInputToken).toStrictEqual(expectedInputToken); - const actualOutputToken = actualTrades[0].outputAmount.token.currency.symbol - const expectedOutputToken = expectedTrades[0].outputAmount.currency.symbol - expect(actualOutputToken).toStrictEqual(expectedOutputToken); - }); - - it('finds the best trade for exact output with Eth output', async () => { - // get best trades - const tokenIn: App.Token = tokens.filter(token => token.currency.symbol === "COMP")[0]; - const amountOut: App.TokenAmount = { - token: ethToken, - amount: "1000000000000000000" - } - const invocation = await client.invoke({ - uri: fsUri, - method: "bestTradeExactOut", - args: { - pairs, - tokenIn, - amountOut, - options: null - } - }); - const actualTrades: App.Trade[] = invocation.data ?? []; - // expected best trades - const uniTokenIn: uni.Currency = new uni.Token( - 1, - tokenIn.address, - tokenIn.currency.decimals, - tokenIn.currency.symbol || "", - tokenIn.currency.name || "" - ); - const uniAmountOut: uni.CurrencyAmount = uni.CurrencyAmount.ether(amountOut.amount); - const expectedTrades = uni.Trade.bestTradeExactOut(uniPairs, uniTokenIn, uniAmountOut); - // compare trade array lengths and trade type - if (actualTrades.length !== expectedTrades.length) { - console.log("actual path: " + actualTrades[0]?.route.path.map(token => token.currency.symbol).toString()) - console.log("expected path: " + expectedTrades[0]?.route.path.map(token => token.symbol).toString()) - console.log(invocation.error) - } - expect(actualTrades.length).toStrictEqual(expectedTrades.length); - expect(actualTrades[0].tradeType).toStrictEqual(expectedTrades[0].tradeType); - // compare trade route paths - for (let k = 0; k < actualTrades.length; k++) { - const actualTrade = actualTrades[k]; - const expectedTrade = expectedTrades[k]; - const actualRoutePath: string[] = actualTrade.route.path.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedTrade.route.path.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - // compare result amounts - for (let k = 0; k < actualTrades.length; k++) { - expect(actualTrades[k].outputAmount.amount).toStrictEqual(expectedTrades[k].outputAmount.numerator.toString()); - } - // compare input and output tokens for best trade - const actualInputToken = actualTrades[0].inputAmount.token.currency.symbol - const expectedInputToken = expectedTrades[0].inputAmount.currency.symbol - expect(actualInputToken).toStrictEqual(expectedInputToken); - const actualOutputToken = actualTrades[0].outputAmount.token.currency.symbol - const expectedOutputToken = expectedTrades[0].outputAmount.currency.symbol - expect(actualOutputToken).toStrictEqual(expectedOutputToken); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/types/polywrap.app.yaml b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/types/polywrap.app.yaml deleted file mode 100644 index b243fe91f..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/e2e/types/polywrap.app.yaml +++ /dev/null @@ -1,4 +0,0 @@ -format: 0.1.0 -name: generate-typescript-types -language: app/typescript -schema: ../../../schema.graphql \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/pair.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/pair.spec.ts deleted file mode 100644 index d79d58e13..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/pair.spec.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { ChainId, Pair, Token, TokenAmount } from "../../wrap"; -import { - pairLiquidityMinted, - pairLiquidityValue, - pairReserves, - pairToken0Price, - pairToken1Price, - tokenSortsBefore -} from "../../index"; -import { Option, BigInt, BigNumber } from "@polywrap/wasm-as"; - -const token0: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000001", - currency: { - decimals: 18, - symbol: "t0", - name: null, - } -} -const token1: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000002", - currency: { - decimals: 18, - symbol: "t1", - name: null, - } -} -const token2: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000003", - currency: { - decimals: 18, - symbol: "t2", - name: null, - } -} -const token3: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000004", - currency: { - decimals: 18, - symbol: "t3", - name: null, - } -} - -const pair_0_1: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1000"), - token: token0 - }, - tokenAmount1: { - amount: BigInt.fromString("1000"), - token: token1 - } -} -const pair_0_2: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1000"), - token: token0 - }, - tokenAmount1: { - amount: BigInt.fromString("1100"), - token: token2 - } -} -const pair_0_3: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1000"), - token: token0 - }, - tokenAmount1: { - amount: BigInt.fromString("900"), - token: token3 - } -} -const pair_1_2: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1200"), - token: token1 - }, - tokenAmount1: { - amount: BigInt.fromString("1000"), - token: token2 - } -} -const pair_1_3: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1200"), - token: token1 - }, - tokenAmount1: { - amount: BigInt.fromString("1300"), - token: token3 - } -} - -const pairs = [pair_0_1, pair_0_2, pair_0_3, pair_1_2, pair_1_3]; - -describe('Pair core', () => { - - test("pairReserves", () => { - for (let i = 0; i < pairs.length; i++) { - const pair: Pair = pairs[i]; - const reserves: TokenAmount[] = pairReserves({ pair }); - let tokenAmount0: TokenAmount; - let tokenAmount1: TokenAmount; - if (tokenSortsBefore({ token: pair.tokenAmount0.token, other: pair.tokenAmount1.token })) { - tokenAmount0 = reserves[0]; - tokenAmount1 = reserves[1]; - } else { - tokenAmount0 = reserves[1]; - tokenAmount1 = reserves[0]; - } - expect(reserves[0].token).toStrictEqual(tokenAmount0.token); - expect(reserves[0].amount).toStrictEqual(tokenAmount0.amount); - expect(reserves[1].token).toStrictEqual(tokenAmount1.token); - expect(reserves[1].amount).toStrictEqual(tokenAmount1.amount); - } - }); - - test("pairToken0Price",() => { - for (let i = 0; i < pairs.length; i++) { - const pair: Pair = pairs[i]; - const price: string = pairToken0Price({ pair }); - const expectedPrice: BigNumber = BigNumber.fromFraction(pair.tokenAmount1.amount, pair.tokenAmount0.amount); - expect(BigNumber.fromString(price).toFixed(18)).toStrictEqual(expectedPrice.toFixed(18)); - } - }); - - test("pairToken1Price", () => { - for (let i = 0; i < pairs.length; i++) { - const pair = pairs[i]; - const price: string = pairToken1Price({ pair }); - const expectedPrice: BigNumber = BigNumber.fromFraction(pair.tokenAmount0.amount, pair.tokenAmount1.amount); - expect(price).toStrictEqual(expectedPrice.toFixed(18)); - } - }); - -}); - -describe('Pair miscellaneous', () => { - - test("pairLiquidityMinted 0 reserves", () => { - const pair: Pair = { tokenAmount0: { token: token0, amount: BigInt.ZERO }, tokenAmount1: { token: token1, amount: BigInt.ZERO } }; - const totalSupply: TokenAmount = { - token: - { - chainId: ChainId.MAINNET, - address: "", - currency: { - decimals: 18, - name: "", - symbol: "", - }, - }, - amount: BigInt.ZERO - }; - const tokenAmount0: TokenAmount = { token: token0, amount: BigInt.fromString("1001") }; - const tokenAmount1: TokenAmount = { token: token1, amount: BigInt.fromString("1001") }; - - const minted: TokenAmount = pairLiquidityMinted({ pair, totalSupply, tokenAmount0, tokenAmount1 }); - expect(minted.amount.toString()).toStrictEqual('1'); - }); - - test("pairLiquidityMinted !0 reserves", () => { - const pair: Pair = { tokenAmount0: { token: token0, amount: BigInt.fromString("10000") }, tokenAmount1: { token: token1, amount: BigInt.fromString("10000") } }; - const totalSupply: TokenAmount = { - token: { - chainId: ChainId.MAINNET, - address: "", - currency: { - decimals: 18, - name: "", - symbol: "", - }, - }, - amount: BigInt.fromString("10000") }; - const tokenAmount0: TokenAmount = { token: token0, amount: BigInt.fromString("2000") }; - const tokenAmount1: TokenAmount = { token: token1, amount: BigInt.fromString("2000") }; - - const minted: TokenAmount = pairLiquidityMinted({ pair, totalSupply, tokenAmount0, tokenAmount1 }); - expect(minted.amount.toString()).toStrictEqual('2000'); - - }); - - it('getLiquidityValue:!feeOn', () => { - const pair: Pair = { tokenAmount0: { token: token0, amount: BigInt.fromString("1000") }, tokenAmount1: { token: token1, amount: BigInt.fromString("1000") } }; - const totalSupply: TokenAmount = { - token: { - chainId: ChainId.MAINNET, - address: "", - currency: { - decimals: 18, - name: "", - symbol: "", - }, - }, amount: BigInt.fromString("1000") }; - const liquidity1000: TokenAmount = { - token: { - chainId: ChainId.MAINNET, - address: "", - currency: { - decimals: 18, - name: "", - symbol: "", - }, - }, - amount: BigInt.fromString("1000") }; - const liquidity500: TokenAmount = { - token: { - chainId: ChainId.MAINNET, - address: "", - currency: { - decimals: 18, - name: "", - symbol: "", - }, - }, - amount: BigInt.fromString("500") }; - - const liquidityValueA = pairLiquidityValue({ pair: pair, totalSupply: totalSupply, liquidity: liquidity1000, feeOn: Option.None(), kLast: null }); - expect(liquidityValueA[0].token).toStrictEqual(token0); - expect(liquidityValueA[1].token).toStrictEqual(token1); - expect(liquidityValueA[0].amount.toString()).toStrictEqual("1000"); - expect(liquidityValueA[1].amount.toString()).toStrictEqual("1000"); - const liquidityValueB = pairLiquidityValue({ pair: pair, totalSupply: totalSupply, liquidity: liquidity500, feeOn: new Option(false, false), kLast: null }); - expect(liquidityValueB[0].token).toStrictEqual(token0); - expect(liquidityValueB[0].amount.toString()).toStrictEqual("500"); - }) - - it('getLiquidityValue:feeOn', () => { - const pair: Pair = { tokenAmount0: { token: token0, amount: BigInt.fromString("1000") }, tokenAmount1: { token: token1, amount: BigInt.fromString("1000") } }; - const totalSupply: TokenAmount = { - token: { - chainId: ChainId.MAINNET, - address: "", - currency: { - decimals: 18, - name: "", - symbol: "", - }, - }, - amount: BigInt.fromString("500") }; - const liquidity: TokenAmount = { - token: { - chainId: ChainId.MAINNET, - address: "", - currency: { - decimals: 18, - name: "", - symbol: "", - }, - }, - amount: BigInt.fromString("500") }; - const kLast: BigInt = BigInt.fromString("250000"); - - const liquidityValue = pairLiquidityValue({ pair: pair, totalSupply: totalSupply, liquidity: liquidity, feeOn: new Option(true, false), kLast: kLast }); - expect(liquidityValue[0].token).toStrictEqual(token0); - expect(liquidityValue[0].amount.toString()).toStrictEqual("917"); // ceiling(1000 - (500 * (1 / 6))) - }) - -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/route.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/route.spec.ts deleted file mode 100644 index 246847e3a..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/route.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { ChainId, Pair, Route, Token } from "../../wrap"; -import { createRoute, routeMidPrice } from "../../index"; -import { BigInt, BigNumber } from "@polywrap/wasm-as"; - -const token0: Token = { - chainId: ChainId.MAINNET, - address: '0x0000000000000000000000000000000000000001', - currency: { - decimals: 18, - symbol: "t0", - name: null, - } }; -const token1: Token = { - chainId: ChainId.MAINNET, - address: '0x0000000000000000000000000000000000000002', - currency: { - decimals: 18, - symbol: "t1", - name: null, - } }; -const weth:Token = { - chainId: ChainId.MAINNET, - address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - currency: { - decimals: 18, - symbol: "WETH9", - name: "Wrapped Ether" - } -}; -const pair_0_1: Pair = { tokenAmount0: {token: token0, amount: BigInt.fromString("100")}, tokenAmount1: { token: token1, amount: BigInt.fromString("200") } }; -const pair_0_weth: Pair = { tokenAmount0: {token: token0, amount: BigInt.fromString("100")}, tokenAmount1: { token: weth, amount: BigInt.fromString("100") } }; -const pair_1_weth: Pair = { tokenAmount0: {token: token1, amount: BigInt.fromString("175")}, tokenAmount1: { token: weth, amount: BigInt.fromString("100") } }; - -describe('Route', () => { - - it('constructs a path from the tokens', () => { - const route: Route = createRoute({ - pairs: [pair_0_1], - input: token0, - output: token1, - }); - expect(route.pairs).toStrictEqual([pair_0_1]); - expect(route.path).toStrictEqual([token0, token1]); - expect(route.input).toStrictEqual(token0); - expect(route.output).toStrictEqual(token1); - }); - - it('can have a token as both input and output', () => { - const route: Route = createRoute({ - pairs: [pair_0_weth, pair_0_1, pair_1_weth], - input: weth, - output: weth, - }); - expect(route.pairs).toStrictEqual([pair_0_weth, pair_0_1, pair_1_weth]); - expect(route.path).toStrictEqual([weth, token0, token1, weth]); - expect(route.input).toStrictEqual(weth); - expect(route.output).toStrictEqual(weth); - }); - - it('returns route midPrice:0', () => { - const route: Route = createRoute({ - pairs: [pair_0_weth, pair_0_1, pair_1_weth], - input: weth, - output: weth, - }); - const midPrice: string = routeMidPrice({ route }); - expect(midPrice).toStrictEqual("1.142857142857142857"); - }); - - it('returns route midPrice:1', () => { - const route: Route = createRoute({ - pairs: [pair_1_weth, pair_0_1], - input: weth, - output: token0, - }); - const midPrice: string = routeMidPrice({ route }); - const amount: string = BigNumber.fromString(midPrice).toString(); - expect(amount).toStrictEqual("0.875"); - }); - - it('returns route midPrice:2', () => { - const route: Route = createRoute({ - pairs: [pair_0_weth, pair_1_weth], - input: token0, - output: token1, - }); - const midPrice: string = routeMidPrice({ route }); - const amount: string = BigNumber.fromString(midPrice).toString(); - expect(amount).toStrictEqual("1.75"); - }); - -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/router.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/router.spec.ts deleted file mode 100644 index cc16dcc11..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/router.spec.ts +++ /dev/null @@ -1,569 +0,0 @@ -import { createRoute, createTrade, swapCallParameters, toHex } from "../../index"; -import { ChainId, Pair, Token, TradeType, } from "../../wrap"; -import { ETHER } from "../../utils"; -import { getWETH9 } from "../../utils/utils"; -import { Option, BigInt } from "@polywrap/wasm-as"; - -const token0: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000001", - currency: { - decimals: 18, - symbol: "t0", - name: null, - } -} -const token1: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000002", - currency: { - decimals: 18, - symbol: "t1", - name: null, - } -} - -const pair_0_1: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1000"), - token: token0 - }, - tokenAmount1: { - amount: BigInt.fromString("1000"), - token: token1 - } -} -const pair_weth_0: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1000"), - token: getWETH9(ChainId.MAINNET) - }, - tokenAmount1: { - amount: BigInt.fromString("1000"), - token: token0, - } -} - -describe("toHex", () => { - test("returns valid hex string from number", () => { - const result = toHex(BigInt.fromUInt32(999)); - - expect(result).toStrictEqual("0x3e7"); - }); -}); - -describe("swapCallParameters", () => { - describe("exact in", () => { - test("ether to token1", () => { - const exactIn = createTrade({ - route: createRoute({ - pairs: [pair_weth_0, pair_0_1], - input: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - output: token1, - }), - amount: { - token: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET, - }, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_INPUT - }) - const result = swapCallParameters({ - trade: exactIn, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: Option.None(), - feeOnTransfer: Option.None() - } - }) - - expect(result.methodName).toStrictEqual("swapExactETHForTokens"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x51", - '["' + [getWETH9(ChainId.MAINNET).address, token0.address, token1.address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x64"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - - test("deadline specified", () => { - const exactIn = createTrade({ - route: createRoute({ - pairs: [pair_weth_0, pair_0_1], - input: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - output: token1, - }), - amount: { - token: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET, - }, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_INPUT - }) - const result = swapCallParameters({ - trade: exactIn, - tradeOptions: { - ttl: Option.None(), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(50, false), - feeOnTransfer: new Option() - } - }) - - expect(result.methodName).toStrictEqual("swapExactETHForTokens"); - expect(result.args).toStrictEqual([ - "0x51", - '["' + ([getWETH9(ChainId.MAINNET).address, token0.address, token1.address]).join('","') + '"]', - "0x0000000000000000000000000000000000000004", - "0x32" - ]); - }); - - test("token1 to ether", () => { - const exactIn = createTrade({ - route: createRoute({ - pairs: [pair_0_1, pair_weth_0], - input: token1, - output: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - }), - amount: { - token: token1, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_INPUT - }); - const result = swapCallParameters({ - trade: exactIn, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option() - } - }) - - expect(result.methodName).toStrictEqual("swapExactTokensForETH"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x64", - "0x51", - '["' + [token1.address, token0.address, getWETH9(ChainId.MAINNET).address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x0"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - - test("token0 to token1", () => { - const exactIn = createTrade({ - route: createRoute({ - pairs: [pair_0_1], - input: token0, - output: token1 - }), - amount: { - token: token0, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_INPUT - }); - const result = swapCallParameters({ - trade: exactIn, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option() - } - }) - - expect(result.methodName).toStrictEqual("swapExactTokensForTokens"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x64", - "0x59", - '["' + [token0.address, token1.address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x0"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - }); - - describe("exact out", () => { - test("ether to token1", () => { - const exactOut = createTrade({ - route: createRoute({ - pairs: [pair_weth_0, pair_0_1], - input: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - output: token1, - }), - amount: { - token: token1, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_OUTPUT - }) - const result = swapCallParameters({ - trade: exactOut, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option() - } - }) - - expect(result.methodName).toStrictEqual("swapETHForExactTokens"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x64", - '["' + [getWETH9(ChainId.MAINNET).address, token0.address, token1.address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x80"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - - test("token1 to ether", () => { - const exactOut = createTrade({ - route: createRoute({ - pairs: [pair_0_1, pair_weth_0], - input: token1, - output: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - }), - amount: { - token: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_OUTPUT - }); - const result = swapCallParameters({ - trade: exactOut, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option() - } - }) - - expect(result.methodName).toStrictEqual("swapTokensForExactETH"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x64", - "0x80", - '["' + [token1.address, token0.address, getWETH9(ChainId.MAINNET).address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x0"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - - test("token0 to token1", () => { - const exactOut = createTrade({ - route: createRoute({ - pairs: [pair_0_1], - input: token0, - output: token1 - }), - amount: { - token: token1, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_OUTPUT - }); - const result = swapCallParameters({ - trade: exactOut, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option() - } - }) - - expect(result.methodName).toStrictEqual("swapTokensForExactTokens"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x64", - "0x71", - '["' + [token0.address, token1.address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x0"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - }); - - describe("supporting fee on transfer", () => { - describe("exact in", () => { - test("ether to token1", () => { - const exactIn = createTrade({ - route: createRoute({ - pairs: [pair_weth_0, pair_0_1], - input: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - output: token1, - }), - amount: { - token: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET, - }, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_INPUT - }) - const result = swapCallParameters({ - trade: exactIn, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option(true, false) - } - }) - - expect(result.methodName).toStrictEqual("swapExactETHForTokensSupportingFeeOnTransferTokens"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x51", - '["' + [getWETH9(ChainId.MAINNET).address, token0.address, token1.address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x64"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - - test("token1 to ether", () => { - const exactIn = createTrade({ - route: createRoute({ - pairs: [pair_0_1, pair_weth_0], - input: token1, - output: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - }), - amount: { - token: token1, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_INPUT - }); - const result = swapCallParameters({ - trade: exactIn, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option(true, false) - } - }) - - expect(result.methodName).toStrictEqual("swapExactTokensForETHSupportingFeeOnTransferTokens"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x64", - "0x51", - '["' + [token1.address, token0.address, getWETH9(ChainId.MAINNET).address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x0"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - - test("token0 to token1", () => { - const exactIn = createTrade({ - route: createRoute({ - pairs: [pair_0_1], - input: token0, - output: token1 - }), - amount: { - token: token0, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_INPUT - }); - const result = swapCallParameters({ - trade: exactIn, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option(true, false) - } - }) - - expect(result.methodName).toStrictEqual("swapExactTokensForTokensSupportingFeeOnTransferTokens"); - expect(result.args.slice(0, -1)).toStrictEqual([ - "0x64", - "0x59", - '["' + [token0.address, token1.address].join('","') + '"]', - "0x0000000000000000000000000000000000000004" - ]); - expect(result.value).toStrictEqual("0x0"); - const deadlineDifference = (Date.now() / 1000) as number - parseInt(result.args[result.args.length - 1]) as number; - expect(deadlineDifference < 5).toBe(true); - }); - }); - - describe("exact out", () => { - test("ether to token1", () => { - expect(() => { - const exactOut = createTrade({ - route: createRoute({ - pairs: [pair_weth_0, pair_0_1], - input: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - output: token1, - }), - amount: { - token: token1, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_OUTPUT - }); - swapCallParameters({ - trade: exactOut, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option(true, false) - } - }); - }); - }); - - test("token1 to ether", () => { - expect(() => { - const exactOut = createTrade({ - route: createRoute({ - pairs: [pair_0_1, pair_weth_0], - input: token1, - output: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - }), - amount: { - token: { - currency: ETHER, - address: "", - chainId: ChainId.MAINNET - }, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_OUTPUT - }); - swapCallParameters({ - trade: exactOut, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option(true, false) - } - }); - }).toThrow(); - }); - - test("token0 to token1", () => { - expect(() => { - const exactOut = createTrade({ - route: createRoute({ - pairs: [pair_0_1], - input: token0, - output: token1 - }), - amount: { - token: token1, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_OUTPUT - }); - swapCallParameters({ - trade: exactOut, - tradeOptions: { - ttl: new Option(50, false), - recipient: "0x0000000000000000000000000000000000000004", - unixTimestamp: Date.now() / 1000, - allowedSlippage: "0.01", - deadline: new Option(), - feeOnTransfer: new Option(true, false) - } - }); - }); - }); - }); - }); -}); diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/token.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/token.spec.ts deleted file mode 100644 index c6da2fee2..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/token.spec.ts +++ /dev/null @@ -1,310 +0,0 @@ -import { tokenAmountEquals, tokenEquals, tokenSortsBefore } from "../../index"; -import { ChainId } from "../../wrap"; - -import { BigInt } from "@polywrap/wasm-as"; - -const ADDRESS_ONE = '0x0000000000000000000000000000000000000001' -const ADDRESS_TWO = '0x0000000000000000000000000000000000000002' - -describe('tokenEquals', () => { - test("returns false if address differs", () => { - const result = tokenEquals({ - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - other: { - chainId: ChainId.MAINNET, - address: ADDRESS_TWO, - currency: { - decimals: 18, - name: null, - symbol: null - } - } - }); - - expect(result).toBe(false); - }); - - test("returns false if chain id differse", () => { - const result = tokenEquals({ - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - other: { - chainId: ChainId.ROPSTEN, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - } - }); - - expect(result).toBe(false); - }); - - test("returns true if only decimals differ", () => { - const result = tokenEquals({ - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - other: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 9, - name: null, - symbol: null - } - } - }); - - expect(result).toBe(true); - }); - - test("returns true if address is the same", () => { - const result = tokenEquals({ - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - other: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - } - }); - - expect(result).toBe(true); - }); - - test("returns true if name/symbol/decimals differ", () => { - const result = tokenEquals({ - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: "token0", - symbol: "a" - } - }, - other: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 9, - name: "token1", - symbol: "b" - } - } - }); - - expect(result).toBe(true); - }); -}) - -describe('tokenAmountEquals', () => { - - test("returns true if TokenAmounts have same token and same amounts", () => { - const result = tokenAmountEquals({ - tokenAmount0: { - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - amount: BigInt.fromString("1000") - }, - tokenAmount1: { - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - amount: BigInt.fromString("1000") - }, - }); - - expect(result).toBe(true); - }); - - test("returns false if TokenAmounts have same token and different amounts", () => { - const result = tokenAmountEquals({ - tokenAmount0: { - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - amount: BigInt.fromString("1001") - }, - tokenAmount1: { - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - amount: BigInt.fromString("1000") - }, - }); - - expect(result).toBe(false); - }); - - test("returns false if TokenAmounts have different tokens and same amounts", () => { - const result = tokenAmountEquals({ - tokenAmount0: { - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - amount: BigInt.fromString("1000") - }, - tokenAmount1: { - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_TWO, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - amount: BigInt.fromString("1000") - }, - }); - - expect(result).toBe(false); - }); - -}); - -describe('tokenSortsBefore', () => { - - test("returns true if address sorts before other", () => { - const result = tokenSortsBefore({ - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - other: { - chainId: ChainId.MAINNET, - address: ADDRESS_TWO, - currency: { - decimals: 18, - name: null, - symbol: null - } - } - }); - - expect(result).toBe(true); - }); - - test("returns false if address sorts after other", () => { - const result = tokenSortsBefore({ - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_TWO, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - other: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - } - }); - - expect(result).toBe(false); - }); - - test("returns false if addresses are the same", () => { - const result = tokenSortsBefore({ - token: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - }, - other: { - chainId: ChainId.MAINNET, - address: ADDRESS_ONE, - currency: { - decimals: 18, - name: null, - symbol: null - } - } - }); - - expect(result).toBe(false); - }); - -}); diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/trade.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/trade.spec.ts deleted file mode 100644 index da91e18cf..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/entities/trade.spec.ts +++ /dev/null @@ -1,690 +0,0 @@ -import { Option, BigInt } from "@polywrap/wasm-as"; -import { - createRoute, - bestTradeExactIn, - bestTradeExactOut, - createTrade, - tradeMaximumAmountIn, - tradeMinimumAmountOut -} from "../../index"; -import { ChainId, Pair, Token, TradeType } from "../../wrap"; - -const token0: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000001", - currency: { - decimals: 18, - symbol: "t0", - name: null, - } -} -const token1: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000002", - currency: { - decimals: 18, - symbol: "t1", - name: null, - } -} -const token2: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000003", - currency: { - decimals: 18, - symbol: "t2", - name: null, - } -} -const token3: Token = { - chainId: ChainId.MAINNET, - address: "0x0000000000000000000000000000000000000004", - currency: { - decimals: 18, - symbol: "t3", - name: null, - } -} - -// const tokenEth: Token = { -// chainId: ChainId.MAINNET, -// address: "", -// currency: ETHER -// } -// -// const tokenWeth: Token = getWETH9(ChainId.MAINNET); - -const pair_0_1: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1000"), - token: token0 - }, - tokenAmount1: { - amount: BigInt.fromString("1000"), - token: token1 - } -} -const pair_0_2: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1000"), - token: token0 - }, - tokenAmount1: { - amount: BigInt.fromString("1100"), - token: token2 - } -} -const pair_0_3: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1000"), - token: token0 - }, - tokenAmount1: { - amount: BigInt.fromString("900"), - token: token3 - } -} -const pair_1_2: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1200"), - token: token1 - }, - tokenAmount1: { - amount: BigInt.fromString("1000"), - token: token2 - } -} -const pair_1_3: Pair = { - tokenAmount0: { - amount: BigInt.fromString("1200"), - token: token1 - }, - tokenAmount1: { - amount: BigInt.fromString("1300"), - token: token3 - } -} - -const empty_pair_0_1: Pair = { - tokenAmount0: { - amount: BigInt.ZERO, - token: token0 - }, - tokenAmount1: { - amount: BigInt.ZERO, - token: token1 - } -} - -// const pair_weth_1: Pair = { -// tokenAmount0: { -// amount: "1000", -// token: tokenWeth -// }, -// tokenAmount1: { -// amount: "1000", -// token: token1 -// } -// } - -const exactIn = createTrade({ - route: createRoute({ - pairs: [pair_0_1, pair_1_2], - input: token0, - output: null, - }), - amount: { - token: token0, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_INPUT -}) -const exactOut = createTrade({ - route: createRoute({ - pairs: [pair_0_1, pair_1_2], - input: token0, - output: null, - }), - amount: { - token: token2, - amount: BigInt.fromString("100") - }, - tradeType: TradeType.EXACT_OUTPUT -}) - -describe("Trade", () => { - - describe("bestTradeExactIn", () => { - test("throws with empty pairs", () => { - expect(() => { - bestTradeExactIn({ - pairs: [], - amountIn: { - token: token0, - amount: BigInt.fromString("100") - }, - tokenOut: token2, - options: null, - }) - }).toThrow(); - }) - - test("throws with max hops of 0", () => { - expect(() => { - bestTradeExactIn({ - pairs: [pair_0_2], - amountIn: { - token: token0, - amount: BigInt.fromString("100") - }, - tokenOut: token2, - options: { - maxHops: new Option(0, false), - maxNumResults: Option.None(), - }, - }) - }).toThrow(); - }) - - test("provides best route", () => { - const result = bestTradeExactIn({ - pairs: [ - pair_0_1, pair_0_2, pair_1_2 - ], - amountIn: { - token: token0, - amount: BigInt.fromString("100") - }, - tokenOut: token2, - options: null, - }); - - expect(result.length).toStrictEqual(2); - expect(result[0].route.pairs.length).toStrictEqual(1) - expect(result[0].route.path).toStrictEqual([token0, token2]); - expect(result[0].inputAmount).toStrictEqual({ - token: token0, - amount: BigInt.fromString("100") - }) - expect(result[1].route.pairs.length).toStrictEqual(2); - expect(result[1].route.path).toStrictEqual([token0, token1, token2]); - expect(result[1].inputAmount).toStrictEqual({ - token: token0, - amount: BigInt.fromString("100") - }) - }); - - test("doesn't throw for zero liquidity pairs", () => { - const result = bestTradeExactIn({ - pairs: [empty_pair_0_1], - amountIn: { - token: token0, - amount: BigInt.fromString("100") - }, - tokenOut: token1, - options: null - }); - expect(result.length).toStrictEqual(0); - }); - - test("respects maxHops", () => { - const result = bestTradeExactIn({ - pairs: [pair_0_1, pair_0_2, pair_1_2], - amountIn: { - token: token0, - amount: BigInt.fromString("10") - }, - tokenOut: token2, - options: { - maxHops: new Option(1, false), - maxNumResults: Option.None(), - } - }); - - expect(result.length).toStrictEqual(1); - expect(result[0].route.pairs.length).toStrictEqual(1); - expect(result[0].route.path).toStrictEqual([token0, token2]); - }); - - test("insufficient input for one pair", () => { - const result = bestTradeExactIn({ - pairs: [pair_0_1, pair_0_2, pair_1_2], - amountIn: { - token: token0, - amount: BigInt.fromString("1") - }, - tokenOut: token2, - options: { - maxHops: new Option(1, false), - maxNumResults: Option.None(), - } - }); - - expect(result.length).toStrictEqual(1); - expect(result[0].route.pairs.length).toStrictEqual(1); - expect(result[0].route.path).toStrictEqual([token0, token2]); - expect(result[0].outputAmount).toStrictEqual({ - token: token2, - amount: BigInt.fromString("1") - }) - }); - - - test("respects n", () => { - const result = bestTradeExactIn({ - pairs: [pair_0_1, pair_0_2, pair_1_2], - amountIn: { - token: token0, - amount: BigInt.fromString("10") - }, - tokenOut: token2, - options: { - maxHops: Option.None(), - maxNumResults: new Option(1, false), - } - }); - - // TODO: respect maxNumResults param - expect(result.length).toStrictEqual(1); - }); - - test("no path", () => { - const result = bestTradeExactIn({ - pairs: [pair_0_1, pair_0_3, pair_1_3], - amountIn: { - token: token0, - amount: BigInt.fromString("10") - }, - tokenOut: token2, - options: null - }); - - expect(result.length).toStrictEqual(0); - }); - - // TODO: WETH bestTrade as-pect unit tests are not compiling correctly (e.g. the expected token is changing values without being modified and more) - // test("exactIn accepts Eth input", () => { - // const result = bestTradeExactIn({ - // pairs: [pair_weth_1, pair_0_1, pair_0_3, pair_1_3], - // amountIn: { - // token: tokenEth, - // amount: "10" - // }, - // tokenOut: token1, - // options: null - // }); - // expect(result.length).toStrictEqual(1); - // expect(result[0].route.pairs.length).toStrictEqual(1); - // expect(result[0].route.path).toStrictEqual([tokenWeth, token1]); - // expect(result[0].inputAmount).toStrictEqual({ - // token: tokenEth, - // amount: "10" - // }); - // }); - // - // test("exactIn accepts Eth output", () => { - // const result = bestTradeExactIn({ - // pairs: [pair_weth_1, pair_0_1, pair_0_3, pair_1_3], - // amountIn: { - // token: token1, - // amount: "10" - // }, - // tokenOut: tokenEth, - // options: null - // }); - // expect(result.length).toStrictEqual(1); - // expect(result[0].route.pairs.length).toStrictEqual(1); - // expect(result[0].route.path).toStrictEqual([token1, tokenWeth]); - // expect(result[0].outputAmount.token).toStrictEqual(tokenEth); - // }); - // - // test("exactOut accepts Eth input", () => { - // const result = bestTradeExactOut({ - // pairs: [pair_weth_1, pair_0_1, pair_0_3, pair_1_3], - // amountOut: { - // token: token1, - // amount: "10" - // }, - // tokenIn: tokenEth, - // options: null - // }); - // expect(result.length).toStrictEqual(1); - // expect(result[0].route.pairs.length).toStrictEqual(1); - // expect(result[0].route.path).toStrictEqual([tokenWeth, token1]); - // expect(result[0].inputAmount.token).toStrictEqual(tokenEth); - // }); - // - // test("exactOut accepts Eth output", () => { - // const result = bestTradeExactOut({ - // pairs: [pair_weth_1, pair_0_1, pair_0_3, pair_1_3], - // amountOut: { - // token: tokenEth, - // amount: "10" - // }, - // tokenIn: token1, - // options: null - // }); - // expect(result.length).toStrictEqual(1); - // expect(result[0].route.pairs.length).toStrictEqual(1); - // expect(result[0].route.path).toStrictEqual([token1, tokenWeth]); - // expect(result[0].outputAmount).toStrictEqual({ - // token: tokenEth, - // amount: "10" - // }); - // }); - - }); - - describe("bestTradeExactOut", () => { - test("throws with empty pairs", () => { - expect(() => { - bestTradeExactOut({ - pairs: [], - amountOut: { - token: token2, - amount: BigInt.fromString("100") - }, - tokenIn: token0, - options: null, - }) - }).toThrow(); - }) - - test("throws with max hops of 0", () => { - expect(() => { - bestTradeExactOut({ - pairs: [pair_0_2], - amountOut: { - token: token2, - amount: BigInt.fromString("100") - }, - tokenIn: token0, - options: { - maxHops: new Option(0, false), - maxNumResults: Option.None(), - }, - }) - }).toThrow(); - }) - - test("provides best route", () => { - const result = bestTradeExactOut({ - pairs: [ - pair_0_1, pair_0_2, pair_1_2 - ], - amountOut: { - token: token2, - amount: BigInt.fromString("100") - }, - tokenIn: token0, - options: null, - }); - - expect(result.length).toStrictEqual(2); - expect(result[0].route.pairs.length).toStrictEqual(1) - expect(result[0].route.path).toStrictEqual([token0, token2]); - expect(result[0].inputAmount).toStrictEqual({ - token: token0, - amount: BigInt.fromString("101") - }) - expect(result[0].outputAmount).toStrictEqual({ - token: token2, - amount: BigInt.fromString("100") - }) - expect(result[1].route.pairs.length).toStrictEqual(2); - expect(result[1].route.path).toStrictEqual([token0, token1, token2]); - expect(result[1].inputAmount).toStrictEqual({ - token: token0, - amount: BigInt.fromString("156") - }) - expect(result[0].outputAmount).toStrictEqual({ - token: token2, - amount: BigInt.fromString("100") - }) - }); - - test("doesn't throw for zero liquidity pairs", () => { - const result = bestTradeExactOut({ - pairs: [empty_pair_0_1], - amountOut: { - token: token1, - amount: BigInt.fromString("100") - }, - tokenIn: token1, - options: null - }); - expect(result.length).toStrictEqual(0); - }); - - test("respects maxHops", () => { - const result = bestTradeExactOut({ - pairs: [pair_0_1, pair_0_2, pair_1_2], - amountOut: { - token: token2, - amount: BigInt.fromString("10") - }, - tokenIn: token0, - options: { - maxHops: new Option(1, false), - maxNumResults: Option.None(), - } - }); - - expect(result.length).toStrictEqual(1); - expect(result[0].route.pairs.length).toStrictEqual(1); - expect(result[0].route.path).toStrictEqual([token0, token2]); - }); - - test("insufficient liquidity", () => { - const result = bestTradeExactOut({ - pairs: [pair_0_1, pair_0_2, pair_1_2], - amountOut: { - token: token2, - amount: BigInt.fromString("1200") - }, - tokenIn: token0, - options: null - }); - - expect(result.length).toStrictEqual(0); - }); - - test("insufficient liquidity in one pair but not the other", () => { - const result = bestTradeExactOut({ - pairs: [pair_0_1, pair_0_2, pair_1_2], - amountOut: { - token: token2, - amount: BigInt.fromString("1050") - }, - tokenIn: token0, - options: null - }); - - expect(result.length).toStrictEqual(1); - }); - - test("respects n", () => { - const result = bestTradeExactOut({ - pairs: [pair_0_1, pair_0_2, pair_1_2], - amountOut: { - token: token2, - amount: BigInt.fromString("10") - }, - tokenIn: token0, - options: { - maxHops: Option.None(), - maxNumResults: new Option(1, false), - } - }); - - // TODO: respect maxNumResults param - expect(result.length).toStrictEqual(1); - }); - - test("no path", () => { - const result = bestTradeExactOut({ - pairs: [pair_0_1, pair_0_3, pair_1_3], - amountOut: { - token: token2, - amount: BigInt.fromString("10") - }, - tokenIn: token0, - options: null - }); - - expect(result.length).toStrictEqual(0); - }); - - // TODO: WETH implementation and tests - }); - - describe("tradeMinimumAmountOut", () => { - - describe("tradeType = EXACT_INPUT", () => { - test("throws if less than 0", () => { - expect(() => { - tradeMinimumAmountOut({ - trade: exactIn, - slippageTolerance: "-1" - })}).toThrow() - }) - - test("returns exact if nonzero", () => { - expect(tradeMinimumAmountOut({ - trade: exactIn, - slippageTolerance: "2" - })).toStrictEqual({ - token: token2, - amount: BigInt.fromString("23") - }) - - expect(tradeMinimumAmountOut({ - trade: exactIn, - slippageTolerance: "0.05" - })).toStrictEqual({ - token: token2, - amount: BigInt.fromString("65") - }) - - expect(tradeMinimumAmountOut({ - trade: exactIn, - slippageTolerance: "0" - })).toStrictEqual({ - token: token2, - amount: BigInt.fromString("69") - }) - }) - }); - - describe("tradeType = EXACT_OUTPUT", () => { - test("throws if less than 0", () => { - expect(() => { - tradeMinimumAmountOut({ - trade: exactOut, - slippageTolerance: "-1" - })}).toThrow() - }) - - test("returns exact if nonzero", () => { - expect(tradeMinimumAmountOut({ - trade: exactOut, - slippageTolerance: "2" - })).toStrictEqual({ - token: token2, - amount: BigInt.fromString("100") - }) - - expect(tradeMinimumAmountOut({ - trade: exactOut, - slippageTolerance: "0.05" - })).toStrictEqual({ - token: token2, - amount: BigInt.fromString("100") - }) - - expect(tradeMinimumAmountOut({ - trade: exactOut, - slippageTolerance: "0" - })).toStrictEqual({ - token: token2, - amount: BigInt.fromString("100") - }) - }) - }); - }); - - describe("tradeMaximumAmountIn", () => { - - describe("tradeType = EXACT_INPUT", () => { - test("throws if less than 0", () => { - expect(() => { - tradeMaximumAmountIn({ - trade: exactIn, - slippageTolerance: "-1" - })}).toThrow() - }) - - test("returns exact if nonzero", () => { - expect(tradeMaximumAmountIn({ - trade: exactIn, - slippageTolerance: "2" - })).toStrictEqual({ - token: token0, - amount: BigInt.fromString("100") - }) - - expect(tradeMaximumAmountIn({ - trade: exactIn, - slippageTolerance: "0.05" - })).toStrictEqual({ - token: token0, - amount: BigInt.fromString("100") - }) - - expect(tradeMaximumAmountIn({ - trade: exactIn, - slippageTolerance: "0" - })).toStrictEqual({ - token: token0, - amount: BigInt.fromString("100") - }) - }) - }); - - describe("tradeType = EXACT_OUTPUT", () => { - test("throws if less than 0", () => { - expect(() => { - tradeMaximumAmountIn({ - trade: exactOut, - slippageTolerance: "-1" - })}).toThrow() - }) - - test("returns exact if nonzero", () => { - expect(tradeMaximumAmountIn({ - trade: exactOut, - slippageTolerance: "2" - })).toStrictEqual({ - token: token0, - amount: BigInt.fromString("468") - }) - - expect(tradeMaximumAmountIn({ - trade: exactOut, - slippageTolerance: "0.05" - })).toStrictEqual({ - token: token0, - amount: BigInt.fromString("163") - }) - - expect(tradeMaximumAmountIn({ - trade: exactOut, - slippageTolerance: "0" - })).toStrictEqual({ - token: token0, - amount: BigInt.fromString("156") - }) - }) - }); - }); -}) diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/infraUtils.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/infraUtils.ts deleted file mode 100644 index 5aef43b90..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/infraUtils.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { runCLI } from "@polywrap/test-env-js"; -import axios from "axios"; -import { ClientConfig } from "@polywrap/client-js"; -import { ethereumPlugin } from "@polywrap/ethereum-plugin-js"; - -export function getPlugins(): Partial { - return { - plugins: [ - { - uri: "wrap://ens/ethereum.polywrap.eth", - plugin: ethereumPlugin({ - networks: { - MAINNET: { - provider: "http://localhost:8546" - }, - }, - defaultNetwork: "MAINNET" - }), - }, - ] - }; -} - -export async function initInfra(): Promise { - const { exitCode, stderr, stdout } = await runCLI({ - args: ["infra", "up", "--verbose"] - }); - - if (exitCode) { - throw Error( - `initInfra failed to start test environment.\nExit Code: ${exitCode}\nStdErr: ${stderr}\nStdOut: ${stdout}` - ); - } - - const success = await awaitResponse( - `http://localhost:8546`, - '"jsonrpc":', - "post", - 2000, - 20000, - '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' - ); - if (!success) { - throw Error("initInfra: Ganache failed to start"); - } - - return Promise.resolve(); -} - -export async function stopInfra(): Promise { - const { exitCode, stderr, stdout } = await runCLI({ - args: ["infra", "down", "--verbose"] - }); - - if (exitCode) { - throw Error( - `initInfra failed to stop test environment.\nExit Code: ${exitCode}\nStdErr: ${stderr}\nStdOut: ${stdout}` - ); - } - - return Promise.resolve(); -} - -async function awaitResponse( - url: string, - expectedRes: string, - getPost: "get" | "post", - timeout: number, - maxTimeout: number, - data?: string -) { - let time = 0; - - while (time < maxTimeout) { - const request = getPost === "get" ? axios.get(url) : axios.post(url, data); - const success = await request - .then(function (response) { - const responseData = JSON.stringify(response.data); - return responseData.indexOf(expectedRes) > -1; - }) - .catch(function () { - return false; - }); - - if (success) { - return true; - } - - await new Promise(function (resolve) { - setTimeout(() => resolve(), timeout); - }); - - time += timeout; - } - - return false; -} \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/testUtils.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/testUtils.ts deleted file mode 100644 index 6769ef163..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/testUtils.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import * as uni from "@uniswap/sdk"; -import tokenList from "./e2e/testData/tokenList.json"; -import * as App from "./e2e/types/wrap" - -export async function getTokenList(): Promise { - let tokens: App.Token[] = []; - tokenList.forEach((token: { - address: string; - decimals: number; - symbol: string; - name: string; - }) => tokens.push({ - chainId: App.ChainIdEnum.MAINNET, - address: token.address, - currency: { - decimals: token.decimals, - symbol: token.symbol, - name: token.name, - }, - })); - return tokens; -} - -export async function getPairData(token0: App.Token, token1: App.Token, client: PolywrapClient, ensUri: string): Promise { - const pairData = await client.invoke({ - uri: ensUri, - method: "fetchPairData", - args: { - token0: token0, - token1: token1 - }, - }); - - if (pairData.error) { - throw pairData.error; - } - - return pairData.data; -} - -export function getUniPairs(pairs: App.Pair[], chainId: number): uni.Pair[] { - return pairs.map(pair => { - return new uni.Pair( - new uni.TokenAmount( - new uni.Token( - chainId, - pair.tokenAmount0.token.address, - pair.tokenAmount0.token.currency.decimals, - pair.tokenAmount0.token.currency.symbol || "", - pair.tokenAmount0.token.currency.name || "" - ), - pair.tokenAmount0.amount - ), - new uni.TokenAmount( - new uni.Token( - chainId, - pair.tokenAmount1.token.address, - pair.tokenAmount1.token.currency.decimals, - pair.tokenAmount1.token.currency.symbol || "", - pair.tokenAmount1.token.currency.name || "" - ), - pair.tokenAmount1.amount - ), - ); - }); -} - -export async function getBestTradeExactIn( - allowedPairs: App.Pair[], - currencyAmountIn: App.TokenAmount, - currencyOut: App.Token, - bestTradeOptions: App.BestTradeOptions | null, - client: PolywrapClient, - ensUri: string -): Promise { - const invocation = await client.invoke({ - uri: ensUri, - method: "bestTradeExactIn", - args: { - pairs: allowedPairs, - amountIn: currencyAmountIn, - tokenOut: currencyOut, - options: bestTradeOptions ?? null - } - }) - const result: App.Trade[] | undefined = invocation.data - if (invocation.error) { - console.log(invocation.error) - } - return result! -} - -export async function getBestTradeExactOut( - allowedPairs: App.Pair[], - currencyIn: App.Token, - currencyAmountOut: App.TokenAmount, - bestTradeOptions: App.BestTradeOptions | null, - client: PolywrapClient, - ensUri: string -): Promise { - const invocation = await client.invoke({ - uri: ensUri, - method: "bestTradeExactOut", - args: { - pairs: allowedPairs, - tokenIn: currencyIn, - amountOut: currencyAmountOut, - options: bestTradeOptions ?? null - } - }) - const result: App.Trade[] | undefined = invocation.data - if (invocation.error) { - console.log(invocation.error) - } - return result! -} - -export async function approveToken( - token: App.Token, - client: PolywrapClient, - ensUri: string -): Promise { - const invocation = await client.invoke({ - uri: ensUri, - method: "approve", - args: { - token, - }, - }); - const result: App.Ethereum_TxResponse | undefined = invocation.data - if (invocation.error) { - console.log(invocation.error) - } - return result!; -} - -export async function execTrade( - trade: App.Trade, - tradeOptions: App.TradeOptions, - client: PolywrapClient, - uri: string -): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "exec", - args: { - trade, - tradeOptions, - }, - }); - const result: App.Ethereum_TxResponse | undefined = invocation.data - if (invocation.error) { - console.log(invocation.error) - } - return result!; -} - -export async function execSwap( - tokenIn: App.Token, - tokenOut: App.Token, - amount: string, - tradeType: App.TradeType, - tradeOptions: App.TradeOptions, - client: PolywrapClient, - uri: string -): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "swap", - args: { - tokenIn: tokenIn, - tokenOut: tokenOut, - amount: amount, - tradeType: tradeType, - tradeOptions: tradeOptions - }, - }); - const result: App.Ethereum_TxResponse | undefined = invocation.data - if (invocation.error) { - console.log(invocation.error) - } - return result!; -} - -export function getSwapMethodAbi(methodName: string): string { - if (methodName == "swapExactTokensForTokens") - return `function swapExactTokensForTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external returns (uint[] memory amounts)`; - else if (methodName == "swapTokensForExactTokens") - return `function swapTokensForExactTokens(uint amountOut,uint amountInMax,address[] calldata path,address to,uint deadline) external returns (uint[] memory amounts)`; - else if (methodName == "swapExactETHForTokens") - return `function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)`; - else if (methodName == "swapTokensForExactETH") - return `function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)`; - else if (methodName == "swapExactTokensForETH") - return `function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)`; - else if (methodName == "swapETHForExactTokens") - return `function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)`; - else if ( - methodName == "swapExactTokensForTokensSupportingFeeOnTransferTokens" - ) - return `function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external`; - else if (methodName == "swapExactETHForTokensSupportingFeeOnTransferTokens") - return `function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin,address[] calldata path,address to,uint deadline) external payable`; - else if (methodName == "swapExactTokensForETHSupportingFeeOnTransferTokens") - return `function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external`; - else { - throw new Error("Invalid method name " + methodName); - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/utils/fraction.spec.ts b/protocol/ethereum/uniswapv2/wrapper/src/__tests__/utils/fraction.spec.ts deleted file mode 100644 index 0b62665a5..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/__tests__/utils/fraction.spec.ts +++ /dev/null @@ -1,329 +0,0 @@ -import { BigInt } from "as-bigint"; - -import Fraction from "../../utils/Fraction"; - -describe('Fraction', () => { - describe('qoutient', () => { - test("floor division", () => { - expect( - new Fraction(BigInt.fromUInt16(8), BigInt.fromUInt16(3)).quotient() - ).toBe(BigInt.fromUInt16(2)) - - expect( - new Fraction(BigInt.fromUInt16(12), BigInt.fromUInt16(4)).quotient() - ).toBe(BigInt.fromUInt16(3)) - - expect( - new Fraction(BigInt.fromUInt16(16), BigInt.fromUInt16(5)).quotient() - ).toBe(BigInt.fromUInt16(3)) - }); - }); - - describe('invert', () => { - test("flips num and denom", () => { - const result = new Fraction(BigInt.fromUInt16(8), BigInt.fromUInt16(3)).invert() - - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(8)) - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(3)) - }); - }); - - describe('add', () => { - test("multiples denoms and adds nums", () => { - const result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).add( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(52)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(120)); - }); - - test("same denom", () => { - const result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(5) - ).add( - new Fraction( - BigInt.fromUInt16(2), - BigInt.fromUInt16(5) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(3)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(5)); - }); - }); - - describe('subtract', () => { - test("multiples denoms and adds nums", () => { - const result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).sub( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromString("-28")); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(120)); - }); - - test("same denom", () => { - const result = new Fraction( - BigInt.fromUInt16(3), - BigInt.fromUInt16(5) - ).sub( - new Fraction( - BigInt.fromUInt16(2), - BigInt.fromUInt16(5) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(1)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(5)); - }); - }); - - describe('lt', () => { - test("correct", () => { - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).lt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(true); - - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).lt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - - expect( - new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).lt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - }); - }); - - describe('eq', () => { - test("correct", () => { - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).eq( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).eq( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(true); - - expect( - new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).eq( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - }); - }); - - describe('gt', () => { - test("correct", () => { - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).gt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).gt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - - expect( - new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).gt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(true); - }); - }); - - describe('mul', () => { - test("correct", () => { - let result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).mul( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(4)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(120)); - - result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).mul( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(4)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(36)); - - result = new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).mul( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(20)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(144)); - }); - }); - - describe('div', () => { - test("correct", () => { - let result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).div( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(12)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(40)); - - result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).div( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(12)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(12)); - - result = new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).div( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(60)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(48)); - }); - }); - - describe('fromString', () => { - test("correct", () => { - let fraction = Fraction.fromString("0.05"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(5)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(100)); - - fraction = Fraction.fromString("0.5"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(5)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(10)); - - fraction = Fraction.fromString("0.0001"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(1)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(10000)); - - fraction = Fraction.fromString("0"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(0)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(1)); - - fraction = Fraction.fromString("2"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(2)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(1)); - }); - }); -}) diff --git a/protocol/ethereum/uniswapv2/wrapper/src/entities/fetch.ts b/protocol/ethereum/uniswapv2/wrapper/src/entities/fetch.ts deleted file mode 100644 index 8c42949a9..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/entities/fetch.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { tokenSortsBefore } from "./token"; -import { - ChainId, - Ethereum_Module, - getChainIdKey, - Args_fetchKLast, - Args_fetchPairData, - Args_fetchTokenData, - Args_fetchTotalSupply, - Pair, - Token, - TokenAmount, -} from "../wrap"; -import { pairAddress } from "./pair"; -import { wrapIfEther } from "../utils/utils"; - -import { BigInt } from "@polywrap/wasm-as"; - -export function fetchTokenData(args: Args_fetchTokenData): Token { - const address: string = args.address; - const chainId: ChainId = args.chainId; - const symbol: string = - args.symbol != null - ? args.symbol! - : Ethereum_Module.callContractView({ - address: address, - method: "function symbol() external pure returns (string memory)", - args: [], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(chainId), - }, - }).unwrap(); - const name: string = - args.name != null - ? args.name! - : Ethereum_Module.callContractView({ - address: address, - method: "function name() external pure returns (string memory)", - args: [], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(chainId), - }, - }).unwrap(); - const decimals: string = Ethereum_Module.callContractView({ - address: address, - method: "function decimals() external pure returns (uint8)", - args: [], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(chainId), - }, - }).unwrap(); - return { - chainId: chainId, - address: address, - currency: { - decimals: U8.parseInt(decimals), - symbol: symbol, - name: name, - }, - }; -} - -// returns pair data in token-sorted order -export function fetchPairData(args: Args_fetchPairData): Pair { - let token0: Token = args.token0; - let token1: Token = args.token1; - // wrap if ether - token0 = wrapIfEther(token0); - token1 = wrapIfEther(token1); - // get amounts - const address = pairAddress({ token0, token1 }); - const res: string = Ethereum_Module.callContractView({ - address: address, - method: - "function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast)", - args: [], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(token0.chainId), - }, - }).unwrap(); - const resArray: string[] = res.split(","); - const amountA = resArray[0]; - const amountB = resArray[1]; - - // returned amounts are ordered by token sort order - const token0SortsBefore: boolean = tokenSortsBefore({ - token: token0, - other: token1, - }); - - if (token0SortsBefore) { - return { - tokenAmount0: { - token: token0, - amount: BigInt.fromString(amountA), - }, - tokenAmount1: { - token: token1, - amount: BigInt.fromString(amountB), - }, - }; - } else { - return { - tokenAmount0: { - token: token1, - amount: BigInt.fromString(amountA), - }, - tokenAmount1: { - token: token0, - amount: BigInt.fromString(amountB), - }, - }; - } -} - -// returns total supply of ERC20-compliant token -export function fetchTotalSupply(args: Args_fetchTotalSupply): TokenAmount { - const token: Token = args.token; - const res: string = Ethereum_Module.callContractView({ - address: token.address, - method: "function totalSupply() external view returns (uint)", - args: [], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(token.chainId), - }, - }).unwrap(); - return { - token: token, - amount: BigInt.fromString(res), - }; -} - -// input token must be a pair liquidity token -// returns reserve0 * reserve1, as of immediately after the most recent liquidity event -export function fetchKLast(args: Args_fetchKLast): BigInt { - const token: Token = args.token; - const result: string = Ethereum_Module.callContractView({ - address: token.address, - method: "function kLast() external view returns (uint)", - args: [], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(token.chainId), - }, - }).unwrap(); - return BigInt.fromString(result); -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/entities/index.ts b/protocol/ethereum/uniswapv2/wrapper/src/entities/index.ts deleted file mode 100644 index dc0dc6ef6..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/entities/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./fetch"; -export * from "./token"; -export * from "./pair"; -export * from "./route"; -export * from "./trade"; -export * from "./router"; -export * from "./swap"; diff --git a/protocol/ethereum/uniswapv2/wrapper/src/entities/pair.ts b/protocol/ethereum/uniswapv2/wrapper/src/entities/pair.ts deleted file mode 100644 index 6fb7f929d..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/entities/pair.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { fetchTokenData } from "./fetch"; -import { tokenSortsBefore } from "./token"; -import { - Args_pairAddress, - Args_pairInputAmount, - Args_pairInputNextPair, - Args_pairLiquidityMinted, - Args_pairLiquidityToken, - Args_pairLiquidityValue, - Args_pairOutputAmount, - Args_pairOutputNextPair, - Args_pairReserves, - Args_pairToken0Price, - Args_pairToken1Price, - Pair, - SHA3_Module, - Token, - TokenAmount, -} from "../wrap"; -import Price from "../utils/Price"; -import { - factoryAddress, - initCodeHash, - minimumLiquidity, - concat, - getChecksumAddress, - ProcessedPair, -} from "../utils"; - -import { BigInt } from "@polywrap/wasm-as"; - -// returns address of pair liquidity token contract -// see https://uniswap.org/docs/v2/javascript-SDK/getting-pair-addresses/ -// and https://eips.ethereum.org/EIPS/eip-1014 -export function pairAddress(args: Args_pairAddress): string { - let tokenA: string; - let tokenB: string; - if (tokenSortsBefore({ token: args.token0, other: args.token1 })) { - tokenA = args.token0.address; - tokenB = args.token1.address; - } else { - tokenA = args.token1.address; - tokenB = args.token0.address; - } - const salt: string = SHA3_Module.hex_keccak_256({ - message: tokenA.substring(2) + tokenB.substring(2), - }).unwrap(); - const concatenatedItems: Uint8Array = concat([ - "0xff", - getChecksumAddress(factoryAddress), - salt, - initCodeHash, - ]); - const concatenationHash: string = SHA3_Module.buffer_keccak_256({ - message: concatenatedItems.buffer, - }).unwrap(); - return getChecksumAddress(concatenationHash.substring(24)); -} - -// returns pair liquidity token -export function pairLiquidityToken(args: Args_pairLiquidityToken): Token { - const pair: Pair = args.pair; - const token0: Token = pair.tokenAmount0.token; - const token1: Token = pair.tokenAmount1.token; - return fetchTokenData({ - chainId: token0.chainId, - address: pairAddress({ token0, token1 }), - symbol: null, - name: null, - }); -} - -// returns the reserves for pair tokens in sorted order -export function pairReserves(args: Args_pairReserves): TokenAmount[] { - const pair: Pair = args.pair; - if ( - tokenSortsBefore({ - token: pair.tokenAmount0.token, - other: pair.tokenAmount1.token, - }) - ) { - return [pair.tokenAmount0, pair.tokenAmount1]; - } - return [pair.tokenAmount1, pair.tokenAmount0]; -} - -// Returns the current mid price of the pair in terms of token0, i.e. the ratio of reserve1 to reserve0 -export function pairToken0Price(args: Args_pairToken0Price): string { - const pair = args.pair; - const price = new Price( - pair.tokenAmount0.token, - pair.tokenAmount1.token, - pair.tokenAmount0.amount, - pair.tokenAmount1.amount - ); - return price.toFixed(18); -} - -// Returns the current mid price of the pair in terms of token1, i.e. the ratio of reserve0 to reserve1 -export function pairToken1Price(args: Args_pairToken1Price): string { - const pair = args.pair; - const price = new Price( - pair.tokenAmount1.token, - pair.tokenAmount0.token, - pair.tokenAmount1.amount, - pair.tokenAmount0.amount - ); - return price.toFixed(18); -} - -// Pricing function for exact inputs amounts. Returns maximum output amount, based on current reserves, if the trade were executed. -export function pairOutputAmount(args: Args_pairOutputAmount): TokenAmount { - const pair: Pair = args.pair; - const tradeTokenAmount: TokenAmount = args.inputAmount; - return ProcessedPair.pairOutputForExactInput(pair, tradeTokenAmount).amount; -} - -// Pricing function for exact inputs amounts. Returns next pair state, based on current reserves, if the trade were executed. -export function pairOutputNextPair(args: Args_pairOutputNextPair): Pair { - const pair: Pair = args.pair; - const tradeTokenAmount: TokenAmount = args.inputAmount; - return ProcessedPair.pairOutputForExactInput(pair, tradeTokenAmount).nextPair; -} - -// Pricing function for exact output amounts. Returns minimum inputs amount, based on current reserves, if the trade were executed. -export function pairInputAmount(args: Args_pairInputAmount): TokenAmount { - const pair: Pair = args.pair; - const tradeTokenAmount: TokenAmount = args.outputAmount; - return ProcessedPair.pairInputForExactOutput(pair, tradeTokenAmount).amount; -} - -// Pricing function for exact output amounts. Returns next pair state, based on current reserves, if the trade were executed. -export function pairInputNextPair(args: Args_pairInputNextPair): Pair { - const pair: Pair = args.pair; - const tradeTokenAmount: TokenAmount = args.outputAmount; - return ProcessedPair.pairInputForExactOutput(pair, tradeTokenAmount).nextPair; -} - -/* -Calculates the exact amount of liquidity tokens minted from a given amount of token0 and token1. - totalSupply is total supply of pair liquidity token. - totalSupply must be looked up on-chain. - The value returned from this function cannot be used as an inputs to getLiquidityValue. -*/ -export function pairLiquidityMinted( - args: Args_pairLiquidityMinted -): TokenAmount { - const pair: Pair = args.pair; - const totalSupply: TokenAmount = args.totalSupply; - const tokenAmount0: TokenAmount = args.tokenAmount0; - const tokenAmount1: TokenAmount = args.tokenAmount1; - // sort order - const pairTokens = tokenSortsBefore({ - token: pair.tokenAmount0.token, - other: pair.tokenAmount1.token, - }) - ? [pair.tokenAmount0, pair.tokenAmount1] - : [pair.tokenAmount1, pair.tokenAmount0]; - const tokenAmounts = tokenSortsBefore({ - token: tokenAmount0.token, - other: tokenAmount1.token, - }) - ? [tokenAmount0, tokenAmount1] - : [tokenAmount1, tokenAmount0]; - // calculate liquidity to mint - let liquidity: BigInt; - let amount0 = tokenAmounts[0].amount; - let amount1 = tokenAmounts[1].amount; - const supply = totalSupply.amount; - if (supply.eq(BigInt.ZERO)) { - const minLiq = BigInt.fromUInt32(minimumLiquidity); - liquidity = amount0.mul(amount1).sqrt().sub(minLiq); - } else { - const pairAmt0 = pairTokens[0].amount; - const pairAmt1 = pairTokens[1].amount; - amount0 = amount0.mul(supply).div(pairAmt0); - amount1 = amount1.mul(supply).div(pairAmt1); - liquidity = amount0.lt(amount1) ? amount0 : amount1; - } - if (liquidity.eq(BigInt.ZERO)) { - throw new Error( - "Insufficient liquidity: liquidity minted must be greater than zero" - ); - } - return { - token: totalSupply.token, - amount: liquidity, - }; -} - -/* -Calculates the exact amount of token0 or token1 that the given amount of liquidity tokens represent. - totalSupply is total supply of pair liquidity token. - totalSupply must be looked up on-chain. - If the protocol charge is on, feeOn must be set to true, and kLast must be provided from an on-chain lookup. - Values returned from this function cannot be used as inputs to getLiquidityMinted. -*/ -export function pairLiquidityValue( - args: Args_pairLiquidityValue -): TokenAmount[] { - const pair: Pair = args.pair; - const totalSupply: TokenAmount = args.totalSupply; - const liquidity: TokenAmount = args.liquidity; - const feeOn: bool = args.feeOn.isSome && args.feeOn.unwrap(); - const kLast: BigInt = args.kLast === null ? BigInt.ZERO : args.kLast!; - const amount0 = pair.tokenAmount0.amount; - const amount1 = pair.tokenAmount1.amount; - const liqAmt = liquidity.amount; - let totalSupplyAmount = totalSupply.amount; - if (feeOn && kLast.gt(BigInt.ZERO)) { - const rootK = amount0.mul(amount1).sqrt(); - const rootKLast = kLast.sqrt(); - if (rootK.gt(rootKLast)) { - const numerator1 = totalSupplyAmount; - const numerator2 = rootK.sub(rootKLast); - const denominator = rootK.mul(BigInt.fromUInt16(5)).add(rootKLast); - const feeLiquidity = numerator1.mul(numerator2).div(denominator); - totalSupplyAmount = totalSupplyAmount.add(feeLiquidity); - } - } - const token0Value = amount0.mul(liqAmt).div(totalSupplyAmount); - const token1Value = amount1.mul(liqAmt).div(totalSupplyAmount); - - return [ - { token: pair.tokenAmount0.token, amount: token0Value }, - { token: pair.tokenAmount1.token, amount: token1Value }, - ]; -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/entities/route.ts b/protocol/ethereum/uniswapv2/wrapper/src/entities/route.ts deleted file mode 100644 index eace1cab4..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/entities/route.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { tokenEquals } from "./token"; -import { - Args_routeMidPrice, - Args_routePath, - Args_createRoute, - Pair, - Route, - Token, - TokenAmount, -} from "../wrap"; -import Price from "../utils/Price"; -import { pairReserves } from "./pair"; -import { wrapIfEther } from "../utils/utils"; - -export function createRoute(args: Args_createRoute): Route { - const path = routePath({ - pairs: args.pairs, - input: args.input, - }); - - let output: Token; - if (args.output != null) { - output = args.output as Token; - } else { - output = path[path.length - 1]; - } - - return { - path: path, - pairs: args.pairs, - input: args.input, - output: output, - }; -} - -// returns the full path from input token to output token. -export function routePath(args: Args_routePath): Token[] { - const pairs: Pair[] = args.pairs; - if (!(pairs.length > 0)) { - throw new Error("Route has to define at least on pair"); - } - const inToken: Token = args.input; - - const path: Token[] = [wrapIfEther(inToken)]; - for (let i = 0; i < pairs.length; i++) { - const currentIn = path[i]; - const token0 = pairs[i].tokenAmount0.token; - const token1 = pairs[i].tokenAmount1.token; - const isToken0In = tokenEquals({ token: currentIn, other: token0 }); - const isToken1In = tokenEquals({ token: currentIn, other: token1 }); - if (!(isToken0In || isToken1In)) { - throw new Error( - "Invalid or unordered route: Route must contain ordered pairs such that adjacent pairs contain one token in common." - ); - } - const currentOut = isToken0In ? token1 : token0; - path.push(currentOut); - } - return path; -} - -// Returns the current mid price along the route. -export function routeMidPrice(args: Args_routeMidPrice): string { - const route: Route = args.route; - const finalPrice = midPrice(route); - return finalPrice.toFixed(18); -} - -// helper function for use in routeMidPrice and trade query functions -export function midPrice(route: Route): Price { - const path = route.path; - const prices: Price[] = []; - for (let i = 0; i < route.pairs.length; i++) { - const pair = route.pairs[i]; - const reserves: TokenAmount[] = pairReserves({ pair: pair }); - const reserve0: TokenAmount = reserves[0]; - const reserve1: TokenAmount = reserves[1]; - prices.push( - tokenEquals({ token: path[i], other: reserve0.token }) - ? new Price( - reserve0.token, - reserve1.token, - reserve0.amount, - reserve1.amount - ) - : new Price( - reserve1.token, - reserve0.token, - reserve1.amount, - reserve0.amount - ) - ); - } - return prices.slice(1).reduce((k, v) => k.mul(v), prices[0]); -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/entities/router.ts b/protocol/ethereum/uniswapv2/wrapper/src/entities/router.ts deleted file mode 100644 index 8801984e1..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/entities/router.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { tradeMaximumAmountIn, tradeMinimumAmountOut } from "./trade"; -import { - ChainId, - Ethereum_Module, - getChainIdKey, - Args_estimateGas, - Args_swapCallParameters, - Args_execCallStatic, - SwapParameters, - TradeType, - TxOverrides, - Ethereum_StaticTxResult, -} from "../wrap"; -import { currencyEquals } from "./token"; -import { UNISWAP_ROUTER_CONTRACT, getSwapMethodAbi, ETHER } from "../utils"; - -import { BigInt, Option } from "@polywrap/wasm-as"; - -const ZERO_HEX = "0x0"; - -export function toHex(currencyAmount: BigInt): string { - return "0x" + currencyAmount.toString(16); -} - -export function swapCallParameters( - args: Args_swapCallParameters -): SwapParameters { - const etherIn = currencyEquals({ - currency: args.trade.inputAmount.token.currency, - other: ETHER, - }); - const etherOut = currencyEquals({ - currency: args.trade.outputAmount.token.currency, - other: ETHER, - }); - - if (etherIn && etherOut) { - throw new Error("Ether can't be trade input and output"); - } - - if (args.tradeOptions.ttl.isNone && args.tradeOptions.deadline.isNone) { - throw new Error("Either ttl or deadline have to be defined for trade"); - } - - const to = args.tradeOptions.recipient; - const amountIn = toHex( - tradeMaximumAmountIn({ - trade: args.trade, - slippageTolerance: args.tradeOptions.allowedSlippage, - }).amount - ); - const amountOut = toHex( - tradeMinimumAmountOut({ - trade: args.trade, - slippageTolerance: args.tradeOptions.allowedSlippage, - }).amount - ); - - const pathArray = args.trade.route.path.map((token) => token.address); - const path = '["' + pathArray.join('","') + '"]'; - const deadline = !args.tradeOptions.ttl.isNone - ? "0x" + - ( - args.tradeOptions.unixTimestamp + args.tradeOptions.ttl.unwrap() - ).toString(16) - : "0x" + (args.tradeOptions.deadline.unwrap() as u32).toString(16); - const useFeeOnTransfer = args.tradeOptions.feeOnTransfer; - - let methodName: string; - let input: string[]; - let value: string; - - switch (args.trade.tradeType) { - case TradeType.EXACT_INPUT: - if (etherIn) { - methodName = - !useFeeOnTransfer.isNone && useFeeOnTransfer.unwrap() - ? "swapExactETHForTokensSupportingFeeOnTransferTokens" - : "swapExactETHForTokens"; - // (uint amountOutMin, address[] calldata path, address to, uint deadline) - input = [amountOut, path, to, deadline]; - value = amountIn; - } else if (etherOut) { - methodName = - !useFeeOnTransfer.isNone && useFeeOnTransfer.unwrap() - ? "swapExactTokensForETHSupportingFeeOnTransferTokens" - : "swapExactTokensForETH"; - // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) - input = [amountIn, amountOut, path, to, deadline]; - value = ZERO_HEX; - } else { - methodName = - !useFeeOnTransfer.isNone && useFeeOnTransfer.unwrap() - ? "swapExactTokensForTokensSupportingFeeOnTransferTokens" - : "swapExactTokensForTokens"; - // (uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) - input = [amountIn, amountOut, path, to, deadline]; - value = ZERO_HEX; - } - break; - case TradeType.EXACT_OUTPUT: - if (!useFeeOnTransfer.isNone && useFeeOnTransfer.unwrap()) { - throw new Error("Cannot use fee on transfer with exact out trade"); - } - - if (etherIn) { - methodName = "swapETHForExactTokens"; - // (uint amountOut, address[] calldata path, address to, uint deadline) - input = [amountOut, path, to, deadline]; - value = amountIn; - } else if (etherOut) { - methodName = "swapTokensForExactETH"; - // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) - input = [amountOut, amountIn, path, to, deadline]; - value = ZERO_HEX; - } else { - methodName = "swapTokensForExactTokens"; - // (uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) - input = [amountOut, amountIn, path, to, deadline]; - value = ZERO_HEX; - } - break; - default: - throw new Error("method name not found"); - } - - return { - methodName: methodName, - args: input, - value: value, - }; -} - -export function estimateGas(args: Args_estimateGas): BigInt { - const swapParameters: SwapParameters = args.parameters; - const chainId: Option = args.chainId; - return Ethereum_Module.estimateContractCallGas({ - address: UNISWAP_ROUTER_CONTRACT, - method: getSwapMethodAbi(swapParameters.methodName), - args: swapParameters.args, - connection: chainId.isNone - ? null - : { - node: null, - networkNameOrChainId: getChainIdKey(chainId.unwrap()), - }, - txOverrides: { - value: BigInt.fromString(swapParameters.value.substring(2), 16), - gasPrice: null, - gasLimit: null, - }, - }).unwrap(); -} - -export function execCallStatic( - args: Args_execCallStatic -): Ethereum_StaticTxResult { - const swapParameters: SwapParameters = args.parameters; - const chainId: ChainId = args.chainId; - const txOverrides: TxOverrides = - args.txOverrides === null - ? { gasLimit: null, gasPrice: null } - : args.txOverrides!; - - return Ethereum_Module.callContractStatic({ - address: UNISWAP_ROUTER_CONTRACT, - method: getSwapMethodAbi(swapParameters.methodName), - args: swapParameters.args, - connection: { - node: null, - networkNameOrChainId: getChainIdKey(chainId), - }, - txOverrides: { - value: BigInt.fromString(swapParameters.value.substring(2), 16), - gasPrice: txOverrides.gasPrice, - gasLimit: txOverrides.gasLimit, - }, - }).unwrap(); -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/entities/swap.ts b/protocol/ethereum/uniswapv2/wrapper/src/entities/swap.ts deleted file mode 100644 index fc3bda06b..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/entities/swap.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { - Args_approve, - Args_exec, - Args_execCall, - Args_swap, - ChainId, - Ethereum_Module, - Ethereum_TxResponse, - getChainIdKey, - Pair, - Route, - SwapParameters, - Trade, - TradeType, - TxOverrides, -} from "../wrap"; -import { getSwapMethodAbi, UNISWAP_ROUTER_CONTRACT } from "../utils"; -import { swapCallParameters, toHex } from "./router"; -import { fetchPairData } from "./fetch"; -import { createTrade } from "./trade"; -import { createRoute } from "./route"; - -import { BigInt } from "@polywrap/wasm-as"; - -const MAX_UINT_256 = - "115792089237316195423570985008687907853269984665640564039457584007913129639935"; - -export function exec(args: Args_exec): Ethereum_TxResponse { - const swapParameters: SwapParameters = swapCallParameters({ - trade: args.trade, - tradeOptions: args.tradeOptions, - }); - return execCall({ - parameters: swapParameters, - chainId: args.trade.inputAmount.token.chainId, - txOverrides: args.txOverrides, - }); -} - -export function execCall(args: Args_execCall): Ethereum_TxResponse { - const swapParameters: SwapParameters = args.parameters; - const chainId: ChainId = args.chainId; - const txOverrides: TxOverrides = - args.txOverrides === null - ? { gasLimit: null, gasPrice: null } - : args.txOverrides!; - - return Ethereum_Module.callContractMethod({ - address: UNISWAP_ROUTER_CONTRACT, - method: getSwapMethodAbi(swapParameters.methodName), - args: swapParameters.args, - connection: { - node: null, - networkNameOrChainId: getChainIdKey(chainId), - }, - txOverrides: { - value: BigInt.fromString(swapParameters.value.substring(2), 16), - gasPrice: txOverrides.gasPrice, - gasLimit: txOverrides.gasLimit, - }, - }).unwrap(); -} - -export function swap(args: Args_swap): Ethereum_TxResponse { - const pair: Pair = fetchPairData({ - token0: args.tokenIn, - token1: args.tokenOut, - }); - const route: Route = createRoute({ - pairs: [pair], - input: args.tokenIn, - output: args.tokenOut, - }); - const trade: Trade = createTrade({ - route, - amount: { - token: - args.tradeType == TradeType.EXACT_INPUT ? args.tokenIn : args.tokenOut, - amount: args.amount, - }, - tradeType: args.tradeType, - }); - return exec({ - trade: trade, - tradeOptions: args.tradeOptions, - txOverrides: args.txOverrides, - }); -} - -export function approve(args: Args_approve): Ethereum_TxResponse { - const amount: BigInt = - args.amount === null ? BigInt.fromString(MAX_UINT_256) : args.amount!; - const txOverrides: TxOverrides = - args.txOverrides === null - ? { gasLimit: null, gasPrice: null } - : args.txOverrides!; - - return Ethereum_Module.callContractMethod({ - address: args.token.address, - method: - "function approve(address spender, uint value) external returns (bool)", - args: [UNISWAP_ROUTER_CONTRACT, toHex(amount)], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(args.token.chainId), - }, - txOverrides: { - value: null, - gasPrice: txOverrides.gasPrice, - gasLimit: txOverrides.gasLimit, - }, - }).unwrap(); -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/entities/token.ts b/protocol/ethereum/uniswapv2/wrapper/src/entities/token.ts deleted file mode 100644 index 54f72cbc8..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/entities/token.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - Currency, - Args_currencyEquals, - Args_tokenAmountEquals, - Args_tokenEquals, - Args_tokenSortsBefore, - Token, - TokenAmount, -} from "../wrap"; - -// Checks if the current instance is equal to another (has an identical chainId and address). -export function currencyEquals(args: Args_currencyEquals): boolean { - const currency: Currency = args.currency; - const other: Currency = args.other; - return ( - currency.name == other.name && - currency.symbol == other.symbol && - currency.decimals == other.decimals - ); -} - -// Checks if the current instance is equal to another (has an identical chainId and address). -export function tokenEquals(args: Args_tokenEquals): boolean { - const token: Token = args.token; - const other: Token = args.other; - return token.chainId == other.chainId && token.address == other.address; -} - -// compares two TokenAmount types for equality, returning true if they have the -// same token and same amount -export function tokenAmountEquals(args: Args_tokenAmountEquals): boolean { - const amt0: TokenAmount = args.tokenAmount0; - const amt1: TokenAmount = args.tokenAmount1; - return ( - tokenEquals({ token: amt0.token, other: amt1.token }) && - amt0.amount == amt1.amount - ); -} - -// Checks if the current instance sorts before another, by address. -export function tokenSortsBefore(args: Args_tokenSortsBefore): boolean { - const token: Token = args.token; - const other: Token = args.other; - const tokenAddress: string = token.address.toLowerCase(); - const otherAddress: string = other.address.toLowerCase(); - return tokenAddress.localeCompare(otherAddress) < 0; -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/entities/trade.ts b/protocol/ethereum/uniswapv2/wrapper/src/entities/trade.ts deleted file mode 100644 index 64798ff13..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/entities/trade.ts +++ /dev/null @@ -1,430 +0,0 @@ -import { - Pair, - Token, - TokenAmount, - Trade, - TradeType, - Args_tradeExecutionPrice, - Args_tradeNextMidPrice, - Args_tradeSlippage, - Args_tradeMinimumAmountOut, - Args_tradeMaximumAmountIn, - Args_bestTradeExactIn, - Args_bestTradeExactOut, - Args_createTrade, -} from "../wrap"; -import { createRoute, midPrice, routeMidPrice } from "./route"; -import Price from "../utils/Price"; -import { pairInputAmount, pairOutputAmount } from "./pair"; -import Fraction from "../utils/Fraction"; -import { currencyEquals, tokenAmountEquals, tokenEquals } from "./token"; -import { PriorityQueue, TradeOptions, ETHER } from "../utils"; -import { copyTokenAmount, wrapIfEther } from "../utils/utils"; - -import { BigInt, BigNumber, Option } from "@polywrap/wasm-as"; - -export function createTrade(args: Args_createTrade): Trade { - const amounts: TokenAmount[] = new Array(args.route.path.length); - if (args.tradeType == TradeType.EXACT_INPUT) { - if ( - !currencyEquals({ - currency: args.amount.token.currency, - other: args.route.input.currency, - }) - ) { - throw new Error( - "Trade input token must be the same as trade route input token" - ); - } - - amounts[0] = args.amount; - for (let i = 0; i < args.route.path.length - 1; i++) { - const pair = args.route.pairs[i]; - amounts[i + 1] = pairOutputAmount({ - pair: pair, - inputAmount: amounts[i], - }); - } - } else { - if (args.amount.token.currency != args.route.output.currency) { - throw new Error( - "Trade output token must be the same as trade route output token" - ); - } - - amounts[amounts.length - 1] = args.amount; - for (let i = args.route.path.length - 1; i > 0; i--) { - const pair = args.route.pairs[i - 1]; - amounts[i - 1] = pairInputAmount({ - pair: pair, - outputAmount: amounts[i], - }); - } - } - const inputAmount: TokenAmount = - args.tradeType == TradeType.EXACT_INPUT ? args.amount : amounts[0]; - const outputAmount: TokenAmount = - args.tradeType == TradeType.EXACT_OUTPUT - ? args.amount - : amounts[amounts.length - 1]; - - if (currencyEquals({ currency: args.route.input.currency, other: ETHER })) { - inputAmount.token.currency = ETHER; - } - if (currencyEquals({ currency: args.route.output.currency, other: ETHER })) { - outputAmount.token.currency = ETHER; - } - - return { - inputAmount: inputAmount, - outputAmount: outputAmount, - route: args.route, - tradeType: args.tradeType, - }; -} - -// The average price that the trade would execute at. -export function tradeExecutionPrice(args: Args_tradeExecutionPrice): string { - const trade: Trade = args.trade; - const executionPrice = new Price( - trade.inputAmount.token, - trade.outputAmount.token, - trade.inputAmount.amount, - trade.outputAmount.amount - ); - return executionPrice.toFixed(18); -} - -// What the new mid price would be if the trade were to execute. -export function tradeNextMidPrice(args: Args_tradeNextMidPrice): string { - const trade: Trade = args.trade; - return routeMidPrice({ - route: trade.route, - }); -} - -// The slippage incurred by the trade. (strictly > 0.30%) -// result is a percent like 100.0% -export function tradeSlippage(args: Args_tradeSlippage): string { - const trade: Trade = args.trade; - const price: Price = midPrice(trade.route); - // compute price impact - const argsFraction: Fraction = new Fraction(trade.inputAmount.amount); - const outputFraction: Fraction = new Fraction(trade.outputAmount.amount); - const exactQuote: Fraction = price.raw().mul(argsFraction); - const slippage = exactQuote.sub(outputFraction).div(exactQuote); - return slippage.toFixed(18); -} - -export function tradeMinimumAmountOut( - args: Args_tradeMinimumAmountOut -): TokenAmount { - const trade: Trade = args.trade; - const slippageTolerance = Fraction.fromString(args.slippageTolerance); - - if (slippageTolerance.lt(new Fraction(BigInt.ZERO))) { - throw new RangeError("slippage tolerance cannot be less than zero"); - } - if (trade.tradeType == TradeType.EXACT_OUTPUT) { - return trade.outputAmount; - } else { - const biOutAmt = trade.outputAmount.amount; - const slippageAdjustedAmountOut = new Fraction(BigInt.ONE) - .add(slippageTolerance) - .invert() - .mul(new Fraction(biOutAmt)) - .quotient(); - return { - token: trade.outputAmount.token, - amount: slippageAdjustedAmountOut, - }; - } -} - -export function tradeMaximumAmountIn( - args: Args_tradeMaximumAmountIn -): TokenAmount { - const trade: Trade = args.trade; - const slippageTolerance = Fraction.fromString(args.slippageTolerance); - - if (slippageTolerance.lt(new Fraction(BigInt.ZERO))) { - throw new RangeError("slippage tolerance cannot be less than zero"); - } - if (trade.tradeType == TradeType.EXACT_INPUT) { - return trade.inputAmount; - } else { - const biInputAmt = trade.inputAmount.amount; - const slippageAdjustedAmountIn = new Fraction(BigInt.ONE) - .add(slippageTolerance) - .mul(new Fraction(biInputAmt)) - .quotient(); - return { - token: trade.inputAmount.token, - amount: slippageAdjustedAmountIn, - }; - } -} - -/* Given a list of pairs, a fixed amount in, and token amount out, this method - returns the best maxNumResults trades that swap an input token amount to an - output token, making at most maxHops hops. The returned trades are sorted by - output amount, in decreasing order, and all share the given input amount. */ -export function bestTradeExactIn(args: Args_bestTradeExactIn): Trade[] { - const pairs: Pair[] = args.pairs; - const amountIn: TokenAmount = args.amountIn; - const tokenOut: Token = args.tokenOut; - const options: TradeOptions = new TradeOptions(args.options); - if (pairs.length == 0) { - throw new Error("Pairs array is empty"); - } - if (options.maxHops == 0) { - throw new Error("maxHops must be greater than zero"); - } - - const bestTrades = _bestTradeExactIn(pairs, amountIn, tokenOut, options); - if (options.maxNumResults) { - return bestTrades.toArray().slice(0, options.maxNumResults); - } else { - return bestTrades.toArray(); - } -} - -/* Similar to the above method, but targets a fixed output token amount. The - returned trades are sorted by input amount, in increasing order, and all share - the given output amount. */ -export function bestTradeExactOut(args: Args_bestTradeExactOut): Trade[] { - const pairs: Pair[] = args.pairs; - const tokenIn: Token = args.tokenIn; - const amountOut: TokenAmount = args.amountOut; - const options: TradeOptions = new TradeOptions(args.options); - if (pairs.length == 0) { - throw new Error("Pairs array is empty"); - } - if (options.maxHops == 0) { - throw new Error("maxHops must be greater than zero"); - } - - const bestTrades = _bestTradeExactOut(pairs, tokenIn, amountOut, options); - if (options.maxNumResults) { - return bestTrades.toArray().slice(0, options.maxNumResults); - } else { - return bestTrades.toArray(); - } -} - -function _bestTradeExactIn( - pairs: Pair[], - amountIn: TokenAmount, - currencyOut: Token, - options: TradeOptions, - currentPairs: Pair[] = [], - originalAmountIn: TokenAmount = copyTokenAmount(amountIn), - bestTrades: PriorityQueue = new PriorityQueue(tradeComparator) -): PriorityQueue { - const sameTokenAmount = tokenAmountEquals({ - tokenAmount0: originalAmountIn, - tokenAmount1: amountIn, - }); - if (!sameTokenAmount && currentPairs.length == 0) { - throw new Error("Recursion error: invariants are false"); - } - amountIn.token = wrapIfEther(amountIn.token); - const tokenOut: Token = wrapIfEther(currencyOut); - for (let i = 0; i < pairs.length; i++) { - const pair = pairs[i]; - - const isToken0 = tokenEquals({ - token: amountIn.token, - other: pair.tokenAmount0.token, - }); - const isToken1 = tokenEquals({ - token: amountIn.token, - other: pair.tokenAmount1.token, - }); - if (!isToken0 && !isToken1) continue; - - const biTokenAmt0 = pair.tokenAmount0.amount; - const biTokenAmt1 = pair.tokenAmount1.amount; - if (biTokenAmt0.isZero() || biTokenAmt1.isZero()) continue; - const biAmtIn = amountIn.amount; - if (biAmtIn.isZero()) continue; - - const amountOutToken = isToken0 - ? pair.tokenAmount1.token - : pair.tokenAmount0.token; - if (tokenEquals({ token: amountOutToken, other: tokenOut })) { - const newTrade = createTrade({ - route: createRoute({ - pairs: currentPairs.concat([pair]), - input: originalAmountIn.token, - output: currencyOut, - }), - amount: originalAmountIn, - tradeType: TradeType.EXACT_INPUT, - }); - bestTrades.insert(newTrade); - } else if (options.maxHops > 1 && pairs.length > 1) { - const amountOut: TokenAmount = pairOutputAmount({ - pair: pair, - inputAmount: amountIn, - }); - const otherPairs = pairs.slice(0, i).concat(pairs.slice(i + 1)); - _bestTradeExactIn( - otherPairs, - amountOut, - currencyOut, - new TradeOptions({ - maxNumResults: new Option(options.maxNumResults, false), - maxHops: new Option(options.maxHops - 1, false), - }), - currentPairs.concat([pair]), - originalAmountIn, - bestTrades - ); - } - } - - return bestTrades; -} - -function _bestTradeExactOut( - pairs: Pair[], - currencyIn: Token, - amountOut: TokenAmount, - options: TradeOptions, - currentPairs: Pair[] = [], - originalAmountOut: TokenAmount = copyTokenAmount(amountOut), - bestTrades: PriorityQueue = new PriorityQueue(tradeComparator) -): PriorityQueue { - const sameTokenAmount = tokenAmountEquals({ - tokenAmount0: originalAmountOut, - tokenAmount1: amountOut, - }); - if (!sameTokenAmount && currentPairs.length == 0) { - throw new Error("Recursion error: invariants are false"); - } - const tokenIn: Token = wrapIfEther(currencyIn); - amountOut.token = wrapIfEther(amountOut.token); - for (let i = 0; i < pairs.length; i++) { - const pair = pairs[i]; - - const isToken0 = tokenEquals({ - token: amountOut.token, - other: pair.tokenAmount0.token, - }); - const isToken1 = tokenEquals({ - token: amountOut.token, - other: pair.tokenAmount1.token, - }); - if (!isToken0 && !isToken1) continue; - - const biTokenAmt0 = pair.tokenAmount0.amount; - const biTokenAmt1 = pair.tokenAmount1.amount; - if (biTokenAmt0.eq(BigInt.ZERO) || biTokenAmt1.eq(BigInt.ZERO)) continue; - const biAmtOut = amountOut.amount; - if (biAmtOut.eq(BigInt.ZERO)) continue; - - if (isToken0) { - if (biTokenAmt0.lt(biAmtOut)) { - continue; - } - } else { - if (biTokenAmt1.lt(biAmtOut)) { - continue; - } - } - const amountInToken = isToken0 - ? pair.tokenAmount1.token - : pair.tokenAmount0.token; - if (tokenEquals({ token: amountInToken, other: tokenIn })) { - const newTrade: Trade = createTrade({ - route: createRoute({ - pairs: [pair].concat(currentPairs), - output: originalAmountOut.token, - input: currencyIn, - }), - amount: originalAmountOut, - tradeType: TradeType.EXACT_OUTPUT, - }); - bestTrades.insert(newTrade); - } else if (options.maxHops > 1 && pairs.length > 1) { - const amountIn: TokenAmount = pairInputAmount({ - pair: pair, - outputAmount: amountOut, - }); - const otherPairs = pairs.slice(0, i).concat(pairs.slice(i + 1)); - _bestTradeExactOut( - otherPairs, - currencyIn, - amountIn, - new TradeOptions({ - maxNumResults: new Option(options.maxNumResults, false), - maxHops: new Option(options.maxHops - 1, false), - }), - [pair].concat(currentPairs), - originalAmountOut, - bestTrades - ); - } - } - return bestTrades; -} - -function computePriceImpact(trade: Trade): BigNumber { - const slippage: string = tradeSlippage({ trade }); - return BigNumber.fromString(slippage); -} - -export function tradeComparator(b: Trade, a: Trade): i32 { - const ioCmp = inputOutputComparator(a, b); - if (ioCmp != 0) { - return ioCmp; - } - - const aPriceImpact = computePriceImpact(a); - const bPriceImpact = computePriceImpact(b); - if (aPriceImpact.lt(bPriceImpact)) { - return -1; - } else if (aPriceImpact.gt(bPriceImpact)) { - return 1; - } - - return a.route.path.length - b.route.path.length; -} - -export function inputOutputComparator(a: Trade, b: Trade): i32 { - const aInput = a.inputAmount; - const bInput = b.inputAmount; - if (!tokenEquals({ token: aInput.token, other: bInput.token })) { - throw new Error("To be compared, trades must the same input token"); - } - - const aOutput = a.outputAmount; - const bOutput = b.outputAmount; - if (!tokenEquals({ token: aOutput.token, other: bOutput.token })) { - throw new Error("To be compared, trades must the same output token"); - } - - const aOutputBI = aOutput.amount; - const bOutputBI = bOutput.amount; - const aInputBI = aInput.amount; - const bInputBI = bInput.amount; - - if (aOutputBI.eq(bOutputBI)) { - if (aInputBI.eq(bInputBI)) { - return 0; - } - - if (aInputBI.lt(bInputBI)) { - return -1; - } else { - return 1; - } - } else { - if (aOutputBI.lt(bOutputBI)) { - return 1; - } else { - return -1; - } - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/index.ts b/protocol/ethereum/uniswapv2/wrapper/src/index.ts deleted file mode 100644 index 85246958c..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./entities"; diff --git a/protocol/ethereum/uniswapv2/wrapper/src/schema.graphql b/protocol/ethereum/uniswapv2/wrapper/src/schema.graphql deleted file mode 100644 index c69a0ff81..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/schema.graphql +++ /dev/null @@ -1,286 +0,0 @@ -#import { Module, TxResponse, StaticTxResult } into Ethereum from "wrap://ens/ethereum.polywrap.eth" -#import { Module } into SHA3 from "wrap://ens/sha3.polywrap.eth" - -type Module { - swap ( - tokenIn: Token! - tokenOut: Token! - amount: BigInt! - tradeType: TradeType! - tradeOptions: TradeOptions! - txOverrides: TxOverrides - ): Ethereum_TxResponse! - - exec( - trade: Trade! - tradeOptions: TradeOptions! - txOverrides: TxOverrides - ): Ethereum_TxResponse! - - execCall( - parameters: SwapParameters! - chainId: ChainId! - txOverrides: TxOverrides - ): Ethereum_TxResponse! - - approve( - token: Token! - amount: BigInt - txOverrides: TxOverrides - ): Ethereum_TxResponse! - - # Token - currencyEquals( - currency: Currency! - other: Currency! - ): Boolean! - - tokenEquals( - token: Token! - other: Token! - ): Boolean! - - tokenAmountEquals( - tokenAmount0: TokenAmount! - tokenAmount1: TokenAmount! - ): Boolean! - - tokenSortsBefore( - token: Token! - other: Token! - ): Boolean! - - # Pair - pairAddress( - token0: Token! - token1: Token! - ): String! - - pairLiquidityToken( - pair: Pair! - ): Token! - - pairReserves( - pair: Pair! - ): [TokenAmount!]! - - pairToken0Price( - pair: Pair! - ): String! - - pairToken1Price( - pair: Pair! - ): String! - - pairOutputAmount( - pair: Pair! - inputAmount: TokenAmount! - ): TokenAmount! - - pairOutputNextPair( - pair: Pair! - inputAmount: TokenAmount! - ): Pair! - - pairInputAmount( - pair: Pair! - outputAmount: TokenAmount! - ): TokenAmount! - - pairInputNextPair( - pair: Pair! - outputAmount: TokenAmount! - ): Pair! - - pairLiquidityMinted( - pair: Pair! - totalSupply: TokenAmount! - tokenAmount0: TokenAmount! - tokenAmount1: TokenAmount! - ): TokenAmount - - pairLiquidityValue( - pair: Pair! - totalSupply: TokenAmount! - liquidity: TokenAmount! - feeOn: Boolean - kLast: BigInt - ): [TokenAmount!]! - - # Route - createRoute( - pairs: [Pair!]! - input: Token! - output: Token - ): Route! - - routePath( - pairs: [Pair!]! - input: Token! - ): [Token!]! - - routeMidPrice( - route: Route! - ): String! - - # Router - swapCallParameters( - trade: Trade!, - tradeOptions: TradeOptions! - ): SwapParameters! - - estimateGas( - parameters: SwapParameters! - chainId: ChainId - ): BigInt! - - execCallStatic( - parameters: SwapParameters! - chainId: ChainId! - txOverrides: TxOverrides - ): Ethereum_StaticTxResult! - - # Trade - createTrade( - route: Route! - amount: TokenAmount! - tradeType: TradeType! - ): Trade! - - tradeExecutionPrice( - trade: Trade! - ): String! - - tradeNextMidPrice( - trade: Trade! - ): String! - - tradeSlippage( - trade: Trade! - ): String! - - tradeMinimumAmountOut( - trade: Trade! - slippageTolerance: String! # Float32! - ): TokenAmount! - - tradeMaximumAmountIn( - trade: Trade! - slippageTolerance: String! # Float32! - ): TokenAmount! - - bestTradeExactIn( - pairs: [Pair!]! - amountIn: TokenAmount! - tokenOut: Token! - options: BestTradeOptions - ): [Trade!]! - - bestTradeExactOut( - pairs: [Pair!]! - tokenIn: Token! - amountOut: TokenAmount! - options: BestTradeOptions - ): [Trade!]! - - # Fetch - fetchTokenData( - chainId: ChainId! - address: String! - symbol: String - name: String - ): Token! - - fetchPairData( - token0: Token! - token1: Token! - ): Pair! - - fetchTotalSupply( - token: Token! - ): TokenAmount! - - fetchKLast( - token: Token! - ): BigInt! -} - -enum ChainId { - MAINNET - ROPSTEN - RINKEBY - GOERLI - KOVAN -} - -enum TradeType { - EXACT_INPUT - EXACT_OUTPUT -} - -enum Rounding { - ROUND_DOWN - ROUND_HALF_UP - ROUND_UP -} - -type TradeOptions { - allowedSlippage: String! - recipient: String! - unixTimestamp: UInt32! - ttl: UInt32 - deadline: UInt32 - feeOnTransfer: Boolean -} - -type Token { - chainId: ChainId! - address: String! - currency: Currency! -} - -type Currency { - decimals: UInt8! - symbol: String - name: String -} - -type TokenAmount { - token: Token! - amount: BigInt! -} - -type Pair { - tokenAmount0: TokenAmount! - tokenAmount1: TokenAmount! -} - -type Route { - path: [Token!]! - pairs: [Pair!]! - input: Token! - output: Token! -} - -type Trade { - route: Route! - inputAmount: TokenAmount! - outputAmount: TokenAmount! - tradeType: TradeType! -} - -type BestTradeOptions { - maxNumResults: UInt32 - maxHops: UInt32 -} - -type SwapParameters { - methodName: String! - args: [String!]! - value: String! -} - -type TxOverrides { - gasPrice: BigInt - gasLimit: BigInt -} \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/Currency.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/Currency.ts deleted file mode 100644 index 9ec06cc61..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/Currency.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Currency } from "../wrap"; - -export const ETHER: Currency = { - decimals: 18, - name: "Ether", - symbol: "ETH", -}; diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/Fraction.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/Fraction.ts deleted file mode 100644 index 6fcf8224c..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/Fraction.ts +++ /dev/null @@ -1,143 +0,0 @@ -// translated to AS from https://github.com/Uniswap/uniswap-sdk-core/blob/main/src/entities/fractions/fraction.ts - -import { Rounding } from "../wrap"; - -import { BigInt, BigNumber, Rounding as BNRounding } from "@polywrap/wasm-as"; - -export default class Fraction { - public readonly numerator: BigInt; - public readonly denominator: BigInt; - - public constructor(numerator: BigInt, denominator: BigInt = BigInt.ONE) { - this.numerator = numerator; - this.denominator = denominator; - } - - public static fromString(decimalNumber: string): Fraction { - const index = decimalNumber.indexOf("."); - if (index == -1) { - return new Fraction(BigInt.fromString(decimalNumber)); - } - const numerator = BigInt.fromString( - decimalNumber.substring(0, index) + decimalNumber.substring(index + 1) - ); - const e: i32 = decimalNumber.length - index - 1; - let denomStr = "1"; - for (let i = 0; i < e; i++) { - denomStr += "0"; - } - const denominator = BigInt.fromString(denomStr); - return new Fraction(numerator, denominator); - } - - // performs floor division - public quotient(): BigInt { - return BigInt.div(this.numerator, this.denominator); - } - - public invert(): Fraction { - return new Fraction(this.denominator, this.numerator); - } - - public add(other: Fraction): Fraction { - if (this.denominator.eq(other.denominator)) { - const numeratorSum: BigInt = BigInt.add(this.numerator, other.numerator); - return new Fraction(numeratorSum, this.denominator); - } - return new Fraction( - BigInt.add( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ), - BigInt.mul(this.denominator, other.denominator) - ); - } - - public sub(other: Fraction): Fraction { - if (BigInt.eq(this.denominator, other.denominator)) { - const numeratorSub: BigInt = BigInt.sub(this.numerator, other.numerator); - return new Fraction(numeratorSub, this.denominator); - } - return new Fraction( - BigInt.sub( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ), - BigInt.mul(this.denominator, other.denominator) - ); - } - - public lt(other: Fraction): boolean { - return BigInt.lt( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ); - } - - public eq(other: Fraction): boolean { - return BigInt.eq( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ); - } - - public gt(other: Fraction): boolean { - return BigInt.gt( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ); - } - - public mul(other: Fraction): Fraction { - return new Fraction( - BigInt.mul(this.numerator, other.numerator), - BigInt.mul(this.denominator, other.denominator) - ); - } - - public div(other: Fraction): Fraction { - return new Fraction( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(this.denominator, other.numerator) - ); - } - - public toSignificant( - significantDigits: i32, - rounding: Rounding = Rounding.ROUND_HALF_UP - ): string { - if (significantDigits < 0) { - throw new Error( - significantDigits.toString() + " is not a positive integer." - ); - } - return BigNumber.fromFraction( - this.numerator, - this.denominator - ).toSignificant(significantDigits, Fraction.mapRounding(rounding)); - } - - public toFixed( - decimalPlaces: i32, - rounding: Rounding = Rounding.ROUND_HALF_UP - ): string { - if (decimalPlaces < 0) { - throw new Error(decimalPlaces.toString() + " is negative."); - } - return BigNumber.fromFraction(this.numerator, this.denominator).toFixed( - decimalPlaces, - Fraction.mapRounding(rounding) - ); - } - - private static mapRounding(rounding: Rounding): BNRounding { - switch (rounding) { - case Rounding.ROUND_DOWN: - return BNRounding.DOWN; - case Rounding.ROUND_UP: - return BNRounding.UP; - default: - return BNRounding.HALF_UP; - } - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/Price.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/Price.ts deleted file mode 100644 index 00a20d054..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/Price.ts +++ /dev/null @@ -1,87 +0,0 @@ -// translated to AS from https://github.com/Uniswap/uniswap-sdk-core/blob/main/src/entities/fractions/fraction.ts - -import { Rounding, Token, TokenAmount } from "../wrap"; -import Fraction from "./Fraction"; -import { tokenEquals } from "../entities"; - -import { BigInt } from "@polywrap/wasm-as"; - -export default class Price extends Fraction { - public readonly baseToken: Token; // input i.e. denominator - public readonly quoteToken: Token; // output i.e. numerator - public readonly scalar: Fraction; // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token - - // denominator and numerator _must_ be raw, i.e. in the native representation - public constructor( - baseToken: Token, - quoteToken: Token, - denominator: BigInt, - numerator: BigInt - ) { - super(numerator, denominator); - - this.baseToken = baseToken; - this.quoteToken = quoteToken; - this.scalar = new Fraction( - BigInt.pow(BigInt.fromUInt16(10), baseToken.currency.decimals), - BigInt.pow(BigInt.fromUInt16(10), quoteToken.currency.decimals) - ); - } - - public raw(): Fraction { - return new Fraction(this.numerator, this.denominator); - } - - public adjusted(): Fraction { - return super.mul(this.scalar); - } - - public invert(): Price { - return new Price( - this.quoteToken, - this.baseToken, - this.numerator, - this.denominator - ); - } - - public mul(other: Price): Price { - if (!tokenEquals({ token: this.quoteToken, other: other.baseToken })) - throw new Error( - "Price multiply error: quoteToken of 'left' must be the same as baseToken of 'right'" - ); - const fraction = super.mul(other); - return new Price( - this.baseToken, - other.quoteToken, - fraction.denominator, - fraction.numerator - ); - } - - public quote(tokenAmount: TokenAmount): TokenAmount { - if (!tokenEquals({ token: tokenAmount.token, other: this.baseToken })) { - throw new Error("Token of tokenAmount must be the same as baseToken"); - } - const biAmount = tokenAmount.amount; - const res = super.mul(new Fraction(biAmount)).quotient(); - return { - token: this.quoteToken, - amount: res, - }; - } - - public toSignificant( - significantDigits: i32 = 6, - rounding: Rounding = Rounding.ROUND_HALF_UP - ): string { - return this.adjusted().toSignificant(significantDigits, rounding); - } - - public toFixed( - decimalPlaces: i32 = 4, - rounding: Rounding = Rounding.ROUND_HALF_UP - ): string { - return this.adjusted().toFixed(decimalPlaces, rounding); - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/PriorityQueue.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/PriorityQueue.ts deleted file mode 100644 index 24efbd775..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/PriorityQueue.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - Heap priority queue that sorts by max priority, determined by priority function comapareTo. - compareTo is a sorting function that takes two values and returns: - a negative number if left < right, - a positive number if left > right, - or zero if left = right. - To sort by min priority, simply write compareTo to flip the sign of the result before returning. - It is assumed that any mutations of Key don't change sort order. -*/ -export class PriorityQueue { - private readonly _pq: (Key | null)[]; - private _n: i32 = 0; - private readonly _compareTo: (left: Key, right: Key) => i32; - - constructor(comparator: (left: Key, right: Key) => i32, capacity: i32 = 0) { - this._pq = new Array(capacity + 1); - this._pq[0] = null; // 0 index must be null for heap tree math - this._compareTo = comparator; - } - - public toArray(): Key[] { - const result: Key[] = new Array(this._n); - let i: i32 = 0; - let val: Key | null = this.delMax(); - while (val !== null) { - result[i++] = val; - val = this.delMax(); - } - return result; - } - - public isEmpty(): boolean { - return this._n == 0; - } - - public length(): i32 { - return this._n; - } - - public insert(v: Key): void { - this._pq.push(v); - this._swim(++this._n); - } - - public delMax(): Key | null { - if (this._n < 1) return null; - const max: Key | null = this._pq[1]; - this._exch(1, this._n--); - this._pq.pop(); - this._sink(1); - return max; - } - - private _less(i: i32, j: i32): boolean { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this._compareTo(this._pq[i]!, this._pq[j]!) < 0; - } - - private _exch(i: i32, j: i32): void { - const t: Key | null = this._pq[i]; - this._pq[i] = this._pq[j]; - this._pq[j] = t; - } - - private _swim(k: i32): void { - while (k > 1 && this._less(k / 2, k)) { - this._exch(k / 2, k); - k = k / 2; - } - } - - private _sink(k: i32): void { - while (2 * k <= this._n) { - let j: i32 = 2 * k; - if (j < this._n && this._less(j, j + 1)) j++; - if (!this._less(k, j)) break; - this._exch(k, j); - k = j; - } - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/ProcessedPair.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/ProcessedPair.ts deleted file mode 100644 index 56a7762e5..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/ProcessedPair.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { Pair, Token, TokenAmount } from "../wrap"; -import { wrapIfEther } from "./utils"; -import { tokenEquals } from "../entities"; - -import { BigInt } from "@polywrap/wasm-as"; - -export class ProcessedPair { - amount: TokenAmount; - nextPair: Pair; - - private constructor(amount: TokenAmount, nextPair: Pair) { - this.amount = amount; - this.nextPair = nextPair; - } - - static pairOutputForExactInput( - pair: Pair, - tradeTokenAmount: TokenAmount - ): ProcessedPair { - const tradeAmount = tradeTokenAmount.amount; - if (tradeAmount.isZero()) { - throw new RangeError( - "Insufficient input amount: Input amount must be greater than zero" - ); - } - if ( - pair.tokenAmount0.amount.isZero() || - pair.tokenAmount1.amount.isZero() - ) { - throw new RangeError( - "Insufficient liquidity: Pair reserves must be greater than zero" - ); - } - // make sure input and output tokens are correctly assigned - let inTokenAmount: TokenAmount; - let outTokenAmount: TokenAmount; - const wrappedTradeToken: Token = wrapIfEther(tradeTokenAmount.token); - if ( - tokenEquals({ - token: wrapIfEther(pair.tokenAmount0.token), - other: wrappedTradeToken, - }) - ) { - inTokenAmount = pair.tokenAmount0; - outTokenAmount = pair.tokenAmount1; - } else if ( - tokenEquals({ - token: wrapIfEther(pair.tokenAmount1.token), - other: wrappedTradeToken, - }) - ) { - inTokenAmount = pair.tokenAmount1; - outTokenAmount = pair.tokenAmount0; - } else { - throw new Error("Input token must be a member of the pair"); - } - // calculate - const biInTokenAmt: BigInt = inTokenAmount.amount; - const biOutTokenAmt: BigInt = outTokenAmount.amount; - const amountInWithFee: BigInt = tradeAmount.mul(BigInt.fromUInt16(997)); - const numerator: BigInt = amountInWithFee.mul(biOutTokenAmt); - const denominator: BigInt = biInTokenAmt - .mul(BigInt.fromUInt16(1000)) - .add(amountInWithFee); - const output = numerator.div(denominator); - // instantiate results - const resultAmount: TokenAmount = { - token: outTokenAmount.token, - amount: output, - }; - const resultInputTokenAmount: TokenAmount = { - token: inTokenAmount.token, - amount: biInTokenAmt.add(tradeAmount), - }; - const resultOutputTokenAmount: TokenAmount = { - token: outTokenAmount.token, - amount: biOutTokenAmt.sub(output), - }; - // return results - if (pair.tokenAmount0.token.address == inTokenAmount.token.address) { - return new ProcessedPair(resultAmount, { - tokenAmount0: resultInputTokenAmount, - tokenAmount1: resultOutputTokenAmount, - }); - } else { - return new ProcessedPair(resultAmount, { - tokenAmount0: resultOutputTokenAmount, - tokenAmount1: resultInputTokenAmount, - }); - } - } - - public static pairInputForExactOutput( - pair: Pair, - tradeTokenAmount: TokenAmount - ): ProcessedPair { - const tradeAmount = tradeTokenAmount.amount; - if (tradeAmount.isZero()) { - throw new RangeError( - "Insufficient output amount: Output amount must be greater than zero" - ); - } - if ( - pair.tokenAmount0.amount.isZero() || - pair.tokenAmount1.amount.isZero() - ) { - throw new RangeError( - "Insufficient liquidity: Pair reserves must be greater than zero" - ); - } - // make sure input and output tokens are correctly assigned - let inTokenAmount: TokenAmount; - let outTokenAmount: TokenAmount; - const wrappedTradeToken: Token = wrapIfEther(tradeTokenAmount.token); - if ( - tokenEquals({ - token: wrapIfEther(pair.tokenAmount0.token), - other: wrappedTradeToken, - }) - ) { - outTokenAmount = pair.tokenAmount0; - inTokenAmount = pair.tokenAmount1; - } else if ( - tokenEquals({ - token: wrapIfEther(pair.tokenAmount1.token), - other: wrappedTradeToken, - }) - ) { - outTokenAmount = pair.tokenAmount1; - inTokenAmount = pair.tokenAmount0; - } else { - throw new Error("Output token must be a member of the pair"); - } - // calculate - const biInTokenAmt = inTokenAmount.amount; - const biOutTokenAmt = outTokenAmount.amount; - const numerator: BigInt = biInTokenAmt - .mul(tradeAmount) - .mul(BigInt.fromUInt16(1000)); - const denominator: BigInt = biOutTokenAmt - .sub(tradeAmount) - .mul(BigInt.fromUInt16(997)); - const input: BigInt = numerator.div(denominator).add(BigInt.fromUInt16(1)); - // instantiate results - const resultAmount: TokenAmount = { - token: inTokenAmount.token, - amount: input, - }; - const resultInputTokenAmount: TokenAmount = { - token: inTokenAmount.token, - amount: biInTokenAmt.add(input), - }; - const resultOutputTokenAmount: TokenAmount = { - token: outTokenAmount.token, - amount: biOutTokenAmt.sub(tradeAmount), - }; - // return results - if (pair.tokenAmount0.token.address == inTokenAmount.token.address) { - return new ProcessedPair(resultAmount, { - tokenAmount0: resultInputTokenAmount, - tokenAmount1: resultOutputTokenAmount, - }); - } else { - return new ProcessedPair(resultAmount, { - tokenAmount0: resultOutputTokenAmount, - tokenAmount1: resultInputTokenAmount, - }); - } - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/TradeOptions.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/TradeOptions.ts deleted file mode 100644 index 232168011..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/TradeOptions.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { BestTradeOptions } from "../wrap"; - -export class TradeOptions { - maxNumResults: u32; - maxHops: u32; - - constructor(options: BestTradeOptions | null) { - if (options == null) { - this.maxNumResults = 3; - this.maxHops = 3; - } else { - this.maxNumResults = options.maxNumResults.isNone - ? 3 - : options.maxNumResults.unwrap(); - this.maxHops = options.maxHops.isNone ? 3 : options.maxHops.unwrap(); - } - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/abi.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/abi.ts deleted file mode 100644 index 6a1638a02..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/abi.ts +++ /dev/null @@ -1,25 +0,0 @@ -export function getSwapMethodAbi(methodName: string): string { - if (methodName == "swapExactTokensForTokens") - return `function swapExactTokensForTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external returns (uint[] memory amounts)`; - else if (methodName == "swapTokensForExactTokens") - return `function swapTokensForExactTokens(uint amountOut,uint amountInMax,address[] calldata path,address to,uint deadline) external returns (uint[] memory amounts)`; - else if (methodName == "swapExactETHForTokens") - return `function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)`; - else if (methodName == "swapTokensForExactETH") - return `function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)`; - else if (methodName == "swapExactTokensForETH") - return `function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)`; - else if (methodName == "swapETHForExactTokens") - return `function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)`; - else if ( - methodName == "swapExactTokensForTokensSupportingFeeOnTransferTokens" - ) - return `function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external`; - else if (methodName == "swapExactETHForTokensSupportingFeeOnTransferTokens") - return `function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin,address[] calldata path,address to,uint deadline) external payable`; - else if (methodName == "swapExactTokensForETHSupportingFeeOnTransferTokens") - return `function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external`; - else { - throw new Error("Invalid method name " + methodName); - } -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/addressUtils.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/addressUtils.ts deleted file mode 100644 index fc27a2320..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/addressUtils.ts +++ /dev/null @@ -1,61 +0,0 @@ -// https://github.com/ethers-io/ethers.js/blob/master/packages/address/src.ts/index.ts#L143 -import { SHA3_Module } from "../wrap"; - -export function getChecksumAddress(address: string): string { - if (address.startsWith("0x")) { - address = address.substring(2); - } - address = address.toLowerCase(); - const chars: string[] = address.split(""); - - const expanded: Uint8Array = new Uint8Array(40); - for (let i = 0; i < 40; i++) { - expanded[i] = chars[i].charCodeAt(0); - } - - const hashed: string = SHA3_Module.buffer_keccak_256({ - message: expanded.buffer, - }).unwrap(); - const hashedArr: Uint8Array = arrayify(hashed); - - for (let i = 0; i < 40; i += 2) { - if (hashedArr[i >> 1] >> 4 >= 8) { - chars[i] = chars[i].toUpperCase(); - } - if ((hashedArr[i >> 1] & 0x0f) >= 8) { - chars[i + 1] = chars[i + 1].toUpperCase(); - } - } - return "0x" + chars.join(""); -} - -// https://github.com/ethers-io/ethers.js/blob/d395d16fa357ec5dda9b59922cf21c39dc34c071/packages/bytes/lib.esm/index.js#L43 -function arrayify(hex: string): Uint8Array { - if (hex.startsWith("0x")) { - hex = hex.substring(2); - } - const result: Uint8Array = new Uint8Array(hex.length / 2); - let j: i32 = 0; - for (let i = 0; i < hex.length; i += 2) { - result[j++] = U8.parseInt(hex.substring(i, i + 2), 16); - } - return result; -} - -// https://github.com/ethers-io/ethers.js/blob/d395d16fa357ec5dda9b59922cf21c39dc34c071/packages/bytes/lib.esm/index.js#L89 -export function concat(items: string[]): Uint8Array { - const objects: Uint8Array[] = items.map((item: string) => - arrayify(item) - ); - const length = objects.reduce( - (accum: i32, item: Uint8Array) => accum + item.length, - 0 - ); - const result = new Uint8Array(length); - let offset: i32 = 0; - for (let i = 0; i < objects.length; i++) { - result.set(objects[i], offset); - offset += objects[i].length; - } - return result; -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/constants.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/constants.ts deleted file mode 100644 index 17aea501d..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/constants.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const UNISWAP_ROUTER_CONTRACT = - "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"; -export const factoryAddress = "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f"; -export const initCodeHash = - "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f"; -export const minimumLiquidity = 1000; diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/index.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/index.ts deleted file mode 100644 index fcb392098..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from "./abi"; -export * from "./addressUtils"; -export * from "./constants"; -export * from "./Currency"; -export * from "./Fraction"; -export * from "./mathUtils"; -export * from "./Price"; -export * from "./PriorityQueue"; -export * from "./ProcessedPair"; -export * from "./TradeOptions"; diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/mathUtils.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/mathUtils.ts deleted file mode 100644 index 70980fd0c..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/mathUtils.ts +++ /dev/null @@ -1,66 +0,0 @@ -// can replace u64 with u256 and u32 with u128 when they are available - -// babylonian method -> https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/libraries/Math.sol -export function sqrt(y: u64): u64 { - let z: u64 = 0; - if (y > 3) { - z = y; - let x: u64 = y / 2 + 1; - while (x < z) { - z = x; - x = (y / x + x) / 2; - } - } else if (y != 0) { - z = 1; - } - return z; -} - -// https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1 -// slightly differs from uniswap implementation -> https://github.com/Uniswap/uniswap-lib/blob/master/contracts/libraries/FullMath.sol -function fullMul(x: u64, y: u64): u64[] { - // the casts to u32 are intended to wrap around; solidity wraps around on overflow rather than throws - const xl: u64 = x; - const xh: u64 = x >> 128; - const yl: u64 = y; - const yh: u64 = y >> 128; - const xlyl: u64 = xl * yl; - const xlyh: u64 = xl * yh; - const xhyl: u64 = xh * yl; - const xhyh: u64 = xh * yh; - - const ll: u64 = xlyl; - const lh: u64 = (xlyl >> 128) + xlyh + xhyl; - const hl: u64 = xhyh + (xlyh >> 128) + (xhyl >> 128); - const hh: u64 = (xhyh >> 128); - const l = ll + (lh << 128); - const h = (lh >> 128) + hl + (hh << 128); - return [l, h]; -} - -// https://github.com/Uniswap/uniswap-lib/blob/master/contracts/libraries/FullMath.sol -function fullDiv(l: u64, h: u64, d: u64): u64 { - const pow2: u64 = d & -d; - d /= pow2; - l /= pow2; - l += h * ((-pow2) / pow2 + 1); - let r: u64 = 1; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - return l * r; -} - -// https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1 -// slightly differs from uniswap implementation -> https://github.com/Uniswap/uniswap-lib/blob/master/contracts/libraries/FullMath.sol -export function mulDiv(x: u64, y: u64, d: u64): u64 { - const mulRes: u64[] = fullMul(x, y); - const l = mulRes[0]; - const h = mulRes[1]; - return fullDiv(l, h, d); -} diff --git a/protocol/ethereum/uniswapv2/wrapper/src/utils/utils.ts b/protocol/ethereum/uniswapv2/wrapper/src/utils/utils.ts deleted file mode 100644 index 4f673f7aa..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/src/utils/utils.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { ChainId, Token, TokenAmount } from "../wrap"; -import { currencyEquals } from "../entities"; -import { ETHER } from "./Currency"; - -export function getWETH9(chainId: ChainId): Token { - switch (chainId) { - case ChainId.MAINNET: - return { - chainId: ChainId.MAINNET, - address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, - }; - case ChainId.ROPSTEN: - return { - chainId: ChainId.ROPSTEN, - address: "0xc778417E063141139Fce010982780140Aa0cD5Ab", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, - }; - case ChainId.RINKEBY: - return { - chainId: ChainId.RINKEBY, - address: "0xc778417E063141139Fce010982780140Aa0cD5Ab", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, - }; - case ChainId.GOERLI: - return { - chainId: ChainId.GOERLI, - address: "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, - }; - case ChainId.KOVAN: - return { - chainId: ChainId.KOVAN, - address: "0xd0A1E359811322d97991E03f863a0C30C2cF029C", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, - }; - default: - throw new Error("Unknown chain ID. This should never happen."); - } -} - -// check if need to wrap ether -export function wrapIfEther(token: Token): Token { - if ( - currencyEquals({ currency: token.currency, other: ETHER }) && - token.address == "" - ) { - return getWETH9(token.chainId); - } - return token; -} - -export function copyToken(token: Token): Token { - return { - chainId: token.chainId, - address: token.address, - currency: { - name: token.currency.name, - symbol: token.currency.symbol, - decimals: token.currency.decimals, - }, - }; -} - -export function copyTokenAmount(tokenAmount: TokenAmount): TokenAmount { - return { - token: copyToken(tokenAmount.token), - amount: tokenAmount.amount, - }; -} diff --git a/protocol/ethereum/uniswapv2/wrapper/tsconfig.json b/protocol/ethereum/uniswapv2/wrapper/tsconfig.json deleted file mode 100644 index 879b5b94d..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "assemblyscript/std/assembly.json", - "compilerOptions": { - "outDir": "build" - }, - "include": [ - "./src/**/*.ts", - ], - "exclude": [ - "./src/__tests__/e2e/**/*.ts" - ] -} \ No newline at end of file diff --git a/protocol/ethereum/uniswapv2/wrapper/tsconfig.ts.json b/protocol/ethereum/uniswapv2/wrapper/tsconfig.ts.json deleted file mode 100644 index f131026b6..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/tsconfig.ts.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "compilerOptions": { - "lib": [ - "es2020", - "es2015", - "es5", - "dom" - ], - "esModuleInterop": true, - "outDir": "build", - "moduleResolution": "node", - "declaration": true, - "preserveSymlinks": true, - "preserveWatchOutput": true, - "pretty": false, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noUnusedLocals": true, - "module": "commonjs", - "sourceMap": true, - "target": "es5", - "resolveJsonModule": true, - "strictNullChecks": true - }, - "include": [ - "./src/__tests__/e2e/**/*.ts" - ], - "exclude": [ - "./src/entities/**/*.ts", - "./src/utils/**/*.ts", - "./src/__tests__/entities/**/*.ts", - "./src/__tests__/utils/**/*.ts" - ] -} diff --git a/protocol/ethereum/uniswapv2/wrapper/yarn.lock b/protocol/ethereum/uniswapv2/wrapper/yarn.lock deleted file mode 100644 index 376979e8b..000000000 --- a/protocol/ethereum/uniswapv2/wrapper/yarn.lock +++ /dev/null @@ -1,8222 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@apidevtools/json-schema-ref-parser@9.0.9": - version "9.0.9" - resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#d720f9256e3609621280584f2b47ae165359268b" - integrity sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w== - dependencies: - "@jsdevtools/ono" "^7.1.3" - "@types/json-schema" "^7.0.6" - call-me-maybe "^1.0.1" - js-yaml "^4.1.0" - -"@as-covers/assembly@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@as-covers/assembly/-/assembly-0.2.0.tgz#6f335834483ddf91b21da06955bd86647f9e8db9" - integrity sha512-3Mo0pdLmaorJPqookq10LmJlWIpyXF/D9JWjphMtv5Th23yO537t6vMGi92uKe35d07k2xMOH/4WRHi04mlk6Q== - -"@as-covers/core@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@as-covers/core/-/core-0.2.1.tgz#362a4719a1901d416941f5425b63fa46288ce8e6" - integrity sha512-/GGTzPB850shvL6ZiidKDmIXSpBflYfzhYyipe7HA1eijBQKKluaLSRy/JLSN53f6kp3tLrCevPXN6HA2fyuBw== - dependencies: - "@as-covers/assembly" "^0.2.0" - "@as-covers/glue" "^0.2.0" - "@as-covers/transform" "^0.2.1" - -"@as-covers/glue@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@as-covers/glue/-/glue-0.2.0.tgz#c829491bcda643087259675361efba300d477615" - integrity sha512-oIRC3q5TA4zfNBv+UwNH10FKq1poAeRTrZUg5pmEcFNv2HpZfED30mb9fF0anNRbr7gmXrSY9iMsRSz6hkrmYQ== - dependencies: - csv-stringify "^5.6.2" - table "^6.7.1" - -"@as-covers/transform@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@as-covers/transform/-/transform-0.2.1.tgz#ea3cb56371493ba77b5761766d3ef46aba36d7c0" - integrity sha512-FutGj2yMIT2GOfqXrbnqSpeZ0eB5Bsnsg+BLnmqpEszthFhe/5/hKYmfNsiF2QBYZnqcIQ7dHw/z31+PlyUDug== - dependencies: - line-column "^1.0.2" - visitor-as "^0.6.0" - -"@as-pect/assembly@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@as-pect/assembly/-/assembly-6.2.0.tgz#29a0efa173df321354b76d92228e46944159ba95" - integrity sha512-jYr1jdlr0xNndIhOpTMBaPHmlhD/c3PcVCzow8wIkzLxgcSOzhBkqjip+LWPWGsiFK1vsZ8ZUaMTeK3fcnXQhw== - -"@as-pect/cli@6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@as-pect/cli/-/cli-6.2.4.tgz#83476d235a6bfb9052e78cef24e450c199ae9146" - integrity sha512-OSWehx90djGxgR4RxFZKixRyh9hsMLNM/6otayAljijEPjiD1zS2lxu3WCu/DiwSWIRJUYdGOUVzw15nqvdcZQ== - dependencies: - "@as-covers/core" "0.2.1" - "@as-pect/assembly" "^6.2.0" - "@as-pect/core" "^6.2.1" - chalk "^4.1.1" - glob "^7.1.7" - optionalDependencies: - "@as-pect/csv-reporter" "^6.2.1" - "@as-pect/json-reporter" "^6.2.1" - -"@as-pect/core@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@as-pect/core/-/core-6.2.1.tgz#fa1f3658e337506c19df7944f75a8ba7b13aed97" - integrity sha512-JnvUb55OhGP7CYUnYtsLXttUb+FGv+6kEN9NleTbIMvU73NFJzyTCGjoZuayPNpfiUzOF96j91XuMHuinJ8BAg== - dependencies: - "@as-pect/assembly" "^6.2.0" - "@as-pect/snapshots" "^6.2.1" - chalk "^4.1.1" - long "^4.0.0" - -"@as-pect/csv-reporter@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@as-pect/csv-reporter/-/csv-reporter-6.2.1.tgz#fe7e23ac2d811e2519006ccc82f5245adcaad526" - integrity sha512-jy8ka8dEP4UY/pK/OIjHFUqs4j2Hvw3r6no6XfX1AkOd9CRLlt/JIDddlzwEqCGEfF83GSBQfQ1At86FkE7RtA== - dependencies: - "@as-pect/core" "^6.2.1" - -"@as-pect/json-reporter@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@as-pect/json-reporter/-/json-reporter-6.2.1.tgz#a77c3257aed8e5b1e5175509fb1046c1f94851cf" - integrity sha512-vsTYOiqB42+WPpec0M3apm9P2SjstUe6MfXepDvVIu2DCZzt1rkEuIIXro13LLQCnOzwXgHO/00sn+uPEjsmSQ== - dependencies: - "@as-pect/core" "^6.2.1" - -"@as-pect/snapshots@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@as-pect/snapshots/-/snapshots-6.2.1.tgz#237ed3b958e85b3e527a0e9f43292813b6dbf789" - integrity sha512-a6xcOUaXMrR3f1n6vgGxMJxUUd6MIVm5vlQ3nZ2hDEMz1PFyEQ04OvGqqUIYHhKAeXIvD3iwz02cI8Wh9lDK7Q== - dependencies: - diff "^5.0.0" - nearley "^2.20.1" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - 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.6": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.6.tgz#54a107a3c298aee3fe5e1947a6464b9b6faca03d" - integrity sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.6" - "@babel/helper-compilation-targets" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helpers" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" - 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.18.6", "@babel/generator@^7.18.7": - version "7.18.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.7.tgz#2aa78da3c05aadfc82dbac16c99552fc802284bd" - integrity sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A== - dependencies: - "@babel/types" "^7.18.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz#18d35bfb9f83b1293c22c55b3d576c1315b6ed96" - integrity sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg== - dependencies: - "@babel/compat-data" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz#b7eee2b5b9d70602e59d1a6cad7dd24de7ca6cd7" - integrity sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q== - -"@babel/helper-function-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz#8334fecb0afba66e6d87a7e8c6bb7fed79926b83" - integrity sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw== - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - 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-module-imports@^7.18.6": - version "7.18.6" - 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": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz#4f8408afead0188cfa48672f9d0e5787b61778c8" - integrity sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@babel/types" "^7.18.8" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz#9448974dd4fb1d80fefe72e8a0af37809cd30d6d" - integrity sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg== - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - 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.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - 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.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.6.tgz#4c966140eaa1fcaa3d5a8c09d7db61077d4debfd" - integrity sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/highlight@^7.18.6": - version "7.18.6" - 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.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.8.tgz#822146080ac9c62dac0823bb3489622e0bc1cbdf" - integrity sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - 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-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - 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-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/template@^7.18.6", "@babel/template@^7.3.3": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.18.6", "@babel/traverse@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.8.tgz#f095e62ab46abf1da35e5a2011f43aee72d8d5b0" - integrity sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.7" - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-function-name" "^7.18.6" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.8" - "@babel/types" "^7.18.8" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.18.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.8.tgz#c5af199951bf41ba4a6a9a6d0d8ad722b30cd42f" - integrity sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@dorgjelli-test/ipfs-http-client-lite@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@dorgjelli-test/ipfs-http-client-lite/-/ipfs-http-client-lite-0.3.1.tgz#5514b4400e0c91ea64e0b5faf426ba808809ddfe" - integrity sha512-N96ilOlJnjnprOOIrwKjEA7lu67mbXyGmJO/vOBXQvY9AQw9XrPdIEn0x30bHwQ6pWSwN4RhIgJUy1/A7u/hEg== - dependencies: - abort-controller "^3.0.0" - async-iterator-to-pull-stream "^1.3.0" - buffer "^5.2.1" - cids "^0.7.1" - explain-error "^1.0.4" - form-data "^2.4.0" - iterable-ndjson "^1.1.0" - node-fetch "^2.6.0" - pull-stream-to-async-iterator "^1.0.2" - querystring "^0.2.0" - -"@dorgjelli/graphql-schema-cycles@1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@dorgjelli/graphql-schema-cycles/-/graphql-schema-cycles-1.1.4.tgz#31f230c61f624f7c2ceca7e18fad8b2cb07d392f" - integrity sha512-U5ARitMQWKjOAvwn1+0Z52R9sbNe1wpbgAbj2hOfRFb/vupfPlRwZLbuUZAlotMpkoxbTbk+GRmoiNzGcJfyHw== - dependencies: - graphql "15.5.0" - graphql-json-transform "^1.1.0-alpha.0" - -"@eslint/eslintrc@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" - integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.19" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@ethersproject/abi@5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.1.tgz#f7de888edeb56b0a657b672bdd1b3a1135cd14f7" - integrity sha512-0cqssYh6FXjlwKWBmLm3+zH2BNARoS5u/hxbz+LpQmcDB3w0W553h2btWui1/uZp2GBM/SI3KniTuMcYyHpA5w== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.6.0", "@ethersproject/abi@^5.6.3": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362" - integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== - dependencies: - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/abstract-provider@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" - integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - -"@ethersproject/abstract-provider@^5.0.0", "@ethersproject/abstract-provider@^5.0.3", "@ethersproject/abstract-provider@^5.6.0", "@ethersproject/abstract-provider@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" - integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.3" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/web" "^5.6.1" - -"@ethersproject/abstract-signer@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" - integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.0.3", "@ethersproject/abstract-signer@^5.6.0", "@ethersproject/abstract-signer@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" - integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/address@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.7.tgz#ee7fd7d3b3a400dec6035c7b3f0b7e4652207308" - integrity sha512-+63DiYG+2og6rFNvQmLlLw8i5LtyT65n+jtHd06Ic81rLHc+JUKRpeZFhBa+gqh9f+P8V0xtKR5NI/EHXOfgSw== - dependencies: - "@ethersproject/bignumber" "^5.0.10" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/rlp" "^5.0.3" - -"@ethersproject/address@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" - integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - -"@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.3", "@ethersproject/address@^5.6.0", "@ethersproject/address@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" - integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.1" - -"@ethersproject/base64@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" - integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - -"@ethersproject/base64@^5.0.0", "@ethersproject/base64@^5.6.0", "@ethersproject/base64@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" - integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - -"@ethersproject/basex@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.7.tgz#2f7026b12c9dee6cdc7b7bf1805461836e635495" - integrity sha512-OsXnRsujGmYD9LYyJlX+cVe5KfwgLUbUJrJMWdzRWogrygXd5HvGd7ygX1AYjlu1z8W/+t2FoQnczDR/H2iBjA== - dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/properties" "^5.0.7" - -"@ethersproject/basex@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" - integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/basex@^5.0.3", "@ethersproject/basex@^5.6.0", "@ethersproject/basex@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305" - integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/bignumber@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" - integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.0.10", "@ethersproject/bignumber@^5.0.6", "@ethersproject/bignumber@^5.6.0", "@ethersproject/bignumber@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" - integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.0.9", "@ethersproject/bytes@^5.6.0", "@ethersproject/bytes@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/constants@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" - integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - -"@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.0.3", "@ethersproject/constants@^5.6.0", "@ethersproject/constants@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" - integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - -"@ethersproject/contracts@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" - integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== - dependencies: - "@ethersproject/abi" "^5.6.0" - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - -"@ethersproject/contracts@^5.0.0": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc" - integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g== - dependencies: - "@ethersproject/abi" "^5.6.3" - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.2" - -"@ethersproject/hash@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" - integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.0.3", "@ethersproject/hash@^5.6.0", "@ethersproject/hash@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" - integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/hdnode@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" - integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - -"@ethersproject/hdnode@^5.0.0", "@ethersproject/hdnode@^5.6.0", "@ethersproject/hdnode@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2" - integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/basex" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.1" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/wordlists" "^5.6.1" - -"@ethersproject/json-wallets@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" - integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/json-wallets@^5.0.0", "@ethersproject/json-wallets@^5.6.0", "@ethersproject/json-wallets@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91" - integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hdnode" "^5.6.2" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.1" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" - integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== - dependencies: - "@ethersproject/bytes" "^5.6.0" - js-sha3 "0.8.0" - -"@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.0", "@ethersproject/keccak256@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" - integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== - dependencies: - "@ethersproject/bytes" "^5.6.1" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" - integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== - -"@ethersproject/networks@5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" - integrity sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/networks@^5.0.0", "@ethersproject/networks@^5.0.3", "@ethersproject/networks@^5.6.0", "@ethersproject/networks@^5.6.3": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07" - integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/pbkdf2@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" - integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - -"@ethersproject/pbkdf2@^5.0.0", "@ethersproject/pbkdf2@^5.6.0", "@ethersproject/pbkdf2@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1" - integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/sha2" "^5.6.1" - -"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.7", "@ethersproject/properties@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" - integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/providers@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.7.tgz#8dfb9eacb36d3c05c08831f71ad43fb46d2aaec6" - integrity sha512-lT+w/w2PKX9oyddX0DTBYl2CVHJTJONZP5HLJ3MzVvSA5dTOdiJ9Sx5rpqR7Tw+mxVA9xPjanoNCaPPIT7cykQ== - dependencies: - "@ethersproject/abstract-provider" "^5.0.3" - "@ethersproject/abstract-signer" "^5.0.3" - "@ethersproject/address" "^5.0.3" - "@ethersproject/basex" "^5.0.3" - "@ethersproject/bignumber" "^5.0.6" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.3" - "@ethersproject/hash" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/networks" "^5.0.3" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/random" "^5.0.3" - "@ethersproject/rlp" "^5.0.3" - "@ethersproject/sha2" "^5.0.3" - "@ethersproject/strings" "^5.0.3" - "@ethersproject/transactions" "^5.0.3" - "@ethersproject/web" "^5.0.4" - bech32 "1.1.4" - ws "7.2.3" - -"@ethersproject/providers@5.6.4": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.4.tgz#1a49c211b57b0b2703c320819abbbfa35c83dff7" - integrity sha512-WAdknnaZ52hpHV3qPiJmKx401BLpup47h36Axxgre9zT+doa/4GC/Ne48ICPxTm0BqndpToHjpLP1ZnaxyE+vw== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.6.8", "@ethersproject/providers@^5.0.0": - version "5.6.8" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d" - integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/base64" "^5.6.1" - "@ethersproject/basex" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.3" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/rlp" "^5.6.1" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/web" "^5.6.1" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" - integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/random@^5.0.0", "@ethersproject/random@^5.0.3", "@ethersproject/random@^5.6.0", "@ethersproject/random@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255" - integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/rlp@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" - integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/rlp@^5.0.0", "@ethersproject/rlp@^5.0.3", "@ethersproject/rlp@^5.6.0", "@ethersproject/rlp@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" - integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/sha2@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" - integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - hash.js "1.1.7" - -"@ethersproject/sha2@^5.0.0", "@ethersproject/sha2@^5.0.3", "@ethersproject/sha2@^5.6.0", "@ethersproject/sha2@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656" - integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" - integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/signing-key@^5.0.0", "@ethersproject/signing-key@^5.6.0", "@ethersproject/signing-key@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" - integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" - integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/solidity@^5.0.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2" - integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/strings@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" - integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.0.3", "@ethersproject/strings@^5.6.0", "@ethersproject/strings@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" - integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/transactions@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" - integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - -"@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.3", "@ethersproject/transactions@^5.6.0", "@ethersproject/transactions@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" - integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== - dependencies: - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - -"@ethersproject/units@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" - integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/units@^5.0.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f" - integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/wallet@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" - integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/json-wallets" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - -"@ethersproject/wallet@5.6.2", "@ethersproject/wallet@^5.0.0": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c" - integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/hdnode" "^5.6.2" - "@ethersproject/json-wallets" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/wordlists" "^5.6.1" - -"@ethersproject/web@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" - integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== - dependencies: - "@ethersproject/base64" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/web@^5.0.0", "@ethersproject/web@^5.0.4", "@ethersproject/web@^5.6.0", "@ethersproject/web@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" - integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== - dependencies: - "@ethersproject/base64" "^5.6.1" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/wordlists@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" - integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/wordlists@^5.0.0", "@ethersproject/wordlists@^5.6.0", "@ethersproject/wordlists@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1" - integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@formatjs/ecma402-abstract@1.6.2": - version "1.6.2" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.2.tgz#9d064a2cf790769aa6721e074fb5d5c357084bb9" - integrity sha512-aLBODrSRhHaL/0WdQ0T2UsGqRbdtRRHqqrs4zwNQoRsGBEtEAvlj/rgr6Uea4PSymVJrbZBoAyECM2Z3Pq4i0g== - dependencies: - tslib "^2.1.0" - -"@formatjs/intl-datetimeformat@3.2.12": - version "3.2.12" - resolved "https://registry.yarnpkg.com/@formatjs/intl-datetimeformat/-/intl-datetimeformat-3.2.12.tgz#c9b2e85f0267ee13ea615a8991995da3075e3b13" - integrity sha512-qvY5+dl3vlgH0iWRXwl8CG9UkSVB5uP2+HH//fyZZ01G4Ww5rxMJmia1SbUqatpoe/dX+Z+aLejCqUUyugyL2g== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -"@formatjs/intl-displaynames@4.0.10": - version "4.0.10" - resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-4.0.10.tgz#5bbd1bbcd64a036b4be27798b650c864dcf4466a" - integrity sha512-KmYJQHynGnnMeqIWVXhbzCMcEC8lg1TfGVdcO9May6paDT+dksZoOBQc741t7iXi/YVO/wXEZdmXhUNX7ODZug== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -"@formatjs/intl-listformat@5.0.10": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-5.0.10.tgz#9f8c4ad5e8a925240e151ba794c41fba01f742cc" - integrity sha512-FLtrtBPfBoeteRlYcHvThYbSW2YdJTllR0xEnk6cr/6FRArbfPRYMzDpFYlESzb5g8bpQMKZy+kFQ6V2Z+5KaA== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -"@formatjs/intl-relativetimeformat@8.1.2": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-8.1.2.tgz#119f3dce97458991f86bf34a736880e4a7bc1697" - integrity sha512-LZUxbc9GHVGmDc4sqGAXugoxhvZV7EG2lG2c0aKERup2ixvmDMbbEN3iEEr5aKkP7YyGxXxgqDn2dwg7QCPR6Q== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -"@formatjs/intl@1.8.2": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.8.2.tgz#6090e6c1826a92e70668dfe08b4ba30127ea3a85" - integrity sha512-9xHoNKPv4qQIQ5AVfpQbIPZanz50i7oMtZWrd6Fz7Q2GM/5uhBr9mrCrY1tz/+diP7uguKmhj1IweLYaxY3DTQ== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - "@formatjs/intl-datetimeformat" "3.2.12" - "@formatjs/intl-displaynames" "4.0.10" - "@formatjs/intl-listformat" "5.0.10" - "@formatjs/intl-relativetimeformat" "8.1.2" - fast-memoize "^2.5.2" - intl-messageformat "9.5.2" - intl-messageformat-parser "6.4.2" - tslib "^2.1.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" - slash "^3.0.0" - -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== - dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== - dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" - "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" - -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" - -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" - -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== - dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - 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" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - 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": - version "3.1.0" - 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.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - 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.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jsdevtools/ono@^7.1.3": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" - integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== - -"@msgpack/msgpack@2.7.2": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" - integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== - -"@multiformats/base-x@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - 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" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - 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.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" - -"@opentelemetry/api-metrics@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-metrics/-/api-metrics-0.20.0.tgz#5c332cadfacd1fa966318292ba8dbb542f5ead57" - integrity sha512-S/OeOuk5W8nlv2dp4JQmIzZvafpOKhEb4j9gWdWQaM0+U+Cv+yQlboeTQHFcpj5obwJ7AzTHrwnL6ApV8dtmuw== - -"@opentelemetry/api@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-0.20.0.tgz#d4e26d30dc0c5da697d1ff51434ad8f0cf30e565" - integrity sha512-n06MtDYEc2H07S/NTvGMlxF2Ijp0YbNrI/rBgLcxpEh3hxOkPZA12gxlUoZkBHWCZYau2j3b/uL+QFpiQKOjSw== - -"@opentelemetry/context-async-hooks@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-0.20.0.tgz#44c457eb2359ff3086bb8fc5d306b2efd91921d9" - integrity sha512-4cuTIPpufWRDdShtvT0c30/jHfO9eXzUh6tU087J8aO8J/hckyCIlN03eB7pfqPwQzLnWONGdHOpGjLSY7q4tg== - -"@opentelemetry/context-zone-peer-dep@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-zone-peer-dep/-/context-zone-peer-dep-0.20.0.tgz#d9d9da21466471609f49dd4ac6c231a21473165b" - integrity sha512-IuR21APoAwPMkEwYtRQW1bEqFZttmwflloNr8eWXlb19kH6E8oTvDkH0dTTQWfEkj7T/R93ePPlDMh98L05AfQ== - -"@opentelemetry/context-zone@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-zone/-/context-zone-0.20.0.tgz#88b59ed212f07f0286e99f4dda218d20f211fcdd" - integrity sha512-jefasByZ4qlx4QT8jeQoenemlxFMNXqP/4dQaJEQi8OyzaFFdOvRLHc3dJLMV2Icq0z7Vdir44icI+sbXnHp0A== - dependencies: - "@opentelemetry/context-zone-peer-dep" "0.20.0" - zone.js "^0.11.0" - -"@opentelemetry/core@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-0.20.0.tgz#2fc9619fa225c7ea7a6169ac578f89c9894b5900" - integrity sha512-09zQqB4vp2jcyBnglA/TFklDQoVgWrFKtr9pDm0q3Oa1bD2Hwpq+JapBAw18YdMQsLNQM/qsXhFlS3gFDVEy4A== - dependencies: - "@opentelemetry/semantic-conventions" "0.20.0" - semver "^7.1.3" - -"@opentelemetry/exporter-collector@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-collector/-/exporter-collector-0.20.0.tgz#e8fe1d3411f115d3b113115c2a78e16b3dacacd1" - integrity sha512-ka4FHPqXYZpTRx2KYTUpBB9gqzwtzuVBvxew5/0TpR8W3yP2gUErWPsUBrch2tRBQ7jY2kJN5sfkJPVt/j1X9w== - dependencies: - "@opentelemetry/api-metrics" "0.20.0" - "@opentelemetry/core" "0.20.0" - "@opentelemetry/metrics" "0.20.0" - "@opentelemetry/resources" "0.20.0" - "@opentelemetry/tracing" "0.20.0" - -"@opentelemetry/exporter-jaeger@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-jaeger/-/exporter-jaeger-0.20.0.tgz#7d7da470a68ce3bd10038444609e4efdb74dc4cf" - integrity sha512-tzxuta6Z5YWHFDavIoXYB3cr7/y6WBieQiXnXfjuh9JEagUPE3en+0Qdc4Iu65E38eFNI8G3HWABoavWfRuvRQ== - dependencies: - "@opentelemetry/core" "0.20.0" - "@opentelemetry/semantic-conventions" "0.20.0" - "@opentelemetry/tracing" "0.20.0" - jaeger-client "^3.15.0" - -"@opentelemetry/exporter-zipkin@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-0.20.0.tgz#636e9f02d4c561da2b3b58565a08ce840df9a2e4" - integrity sha512-SoCcx749YkYAwnep6KZeR1zyQeg55uxDL/ZX5zP1ZMblmVcYIO8X7aNFBIHM9IlvbArNnYHMECBu7idCJPA/WQ== - dependencies: - "@opentelemetry/core" "0.20.0" - "@opentelemetry/resources" "0.20.0" - "@opentelemetry/semantic-conventions" "0.20.0" - "@opentelemetry/tracing" "0.20.0" - -"@opentelemetry/metrics@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/metrics/-/metrics-0.20.0.tgz#9f8b2652929a830513dc6949e2471f325c1e8dbd" - integrity sha512-1jqtRvI+AdRIG+Up8njOgooOxa570uoWTKgokanllcCRp2gOOnkgLQ8YQhbArX0F4Xi2FHYe7o5vDO3J0Aj5kA== - dependencies: - "@opentelemetry/api-metrics" "0.20.0" - "@opentelemetry/core" "0.20.0" - "@opentelemetry/resources" "0.20.0" - lodash.merge "^4.6.2" - -"@opentelemetry/node@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/node/-/node-0.20.0.tgz#7d4594deb87f0c0133d4b97b78a5678a6f8554cf" - integrity sha512-MVwnH/AoHQTz1jOhJTYXoAoQD4CA/3L7QQkiiA93f6QGaWKIHjI/+3fUtA/GCfPR9Kf0sItQ/aag8KtCJClPCw== - dependencies: - "@opentelemetry/context-async-hooks" "0.20.0" - "@opentelemetry/core" "0.20.0" - "@opentelemetry/propagator-b3" "0.20.0" - "@opentelemetry/propagator-jaeger" "0.20.0" - "@opentelemetry/tracing" "0.20.0" - semver "^7.1.3" - -"@opentelemetry/propagator-b3@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-0.20.0.tgz#78944a0527675c856b4f369dbfdd48d5272a434e" - integrity sha512-TGI2D45oUVlbXVEWDedqxwO0WUtzchN/tuYghEHjRTNcVLLKT2ci9JwzHormC+ls98SYPDfvuzpB0+ParoexPQ== - dependencies: - "@opentelemetry/core" "0.20.0" - -"@opentelemetry/propagator-jaeger@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-0.20.0.tgz#35fc5e0bfde1bef6afc0307f88a4b22135bc5c14" - integrity sha512-6kdnd1ePADx4XDaFw4Ea47fdIZohhJbd30Fc4yvl0DO+RR5WEAiAho0IsoTj6L/qvOb/+LAfvjvdk2UOXgb/3Q== - dependencies: - "@opentelemetry/core" "0.20.0" - -"@opentelemetry/resources@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-0.20.0.tgz#038d985c610600cde146ee1e95b6a124f3ad4754" - integrity sha512-nnd3vIM+A9ih6kOVBc2CF5NkTYmdNci5aQ+A5lQjf3HqjEptcGubpg1J1Q84LSFVoITvuH2O6+GhPBrdxYBt8g== - dependencies: - "@opentelemetry/core" "0.20.0" - "@opentelemetry/semantic-conventions" "0.20.0" - -"@opentelemetry/semantic-conventions@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-0.20.0.tgz#adc7e391bba6db9bbaba04ae263c3e92b1703d44" - integrity sha512-x40C3vQMttFlnNEfhFwO49jHrY6AoWnntL35TCem3LINr/aw1W0hGhdKY/zweC64CBJEyiHumaae480rqF8eOA== - -"@opentelemetry/tracing@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/tracing/-/tracing-0.20.0.tgz#ff0224568925158244926661b339c0ac63a729ba" - integrity sha512-8ZIH0IBxIucgza0BFNiCCLByUsvu45Dm5k292RlO/E8Z1q/J7otJmh9r/EkaFb0ZSyjNdawmJ1CXnlU7+IQN1w== - dependencies: - "@opentelemetry/core" "0.20.0" - "@opentelemetry/resources" "0.20.0" - "@opentelemetry/semantic-conventions" "0.20.0" - lodash.merge "^4.6.2" - -"@opentelemetry/web@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/web/-/web-0.20.0.tgz#e0e090f0dcd35ebaa068c2e98f1b69d1a4aacfce" - integrity sha512-Ysja/YtlM/9hYKp8NUk63rSXQWT8N4uLWCyE/diW+iJDvUHY6DrNkSYKFYk5oRc50McYFq2Yqkmm/y1hRDCwHg== - dependencies: - "@opentelemetry/core" "0.20.0" - "@opentelemetry/semantic-conventions" "0.20.0" - "@opentelemetry/tracing" "0.20.0" - -"@polywrap/asyncify-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.3.0.tgz#dcb1f56a0f3607260a141459acef39b507c7d389" - integrity sha512-yGP1UqEO4zWlEnk7a/AMx/Tszd3adxXcCF2EvKpG5FA19HmBoTg9kOqw6KPF8ujGm2V3VZUxT0+c4ShezxaENQ== - -"@polywrap/client-js@0.3.0", "@polywrap/client-js@0.3.x": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.3.0.tgz#36ca44201a7afc914f2c381be2b177b3ca67c8c2" - integrity sha512-pL3VaQ4vRfYdj3rKQobELNaoxOb4x40BsCV38TX9/7mQtXBuWGHPFuRZk8+b3oYSr2ZCU+LsT0WJ/o/Sc/PaBg== - dependencies: - "@polywrap/asyncify-js" "0.3.0" - "@polywrap/core-js" "0.3.0" - "@polywrap/ens-resolver-plugin-js" "0.3.0" - "@polywrap/ethereum-plugin-js" "0.3.0" - "@polywrap/fs-plugin-js" "0.3.0" - "@polywrap/fs-resolver-plugin-js" "0.3.0" - "@polywrap/graph-node-plugin-js" "0.3.0" - "@polywrap/http-plugin-js" "0.3.0" - "@polywrap/ipfs-plugin-js" "0.3.0" - "@polywrap/ipfs-resolver-plugin-js" "0.3.0" - "@polywrap/logger-plugin-js" "0.3.0" - "@polywrap/msgpack-js" "0.3.0" - "@polywrap/schema-parse" "0.3.0" - "@polywrap/sha3-plugin-js" "0.3.0" - "@polywrap/tracing-js" "0.3.0" - "@polywrap/uts46-plugin-js" "0.3.0" - "@polywrap/wrap-manifest-types-js" "0.3.0" - graphql "15.5.0" - js-yaml "3.14.0" - uuid "8.3.2" - -"@polywrap/core-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.3.0.tgz#220bd4d66b8e9980ebbe2852fc7623f317feca18" - integrity sha512-3iSp99UIgj53WXAwWJStPjjGUeBoLcgakuEoA/vaWG9PHtRB7dmcIWpL7DtyE1eXMP8QrIMBuS40wDM1zy2Vlw== - dependencies: - "@polywrap/tracing-js" "0.3.0" - "@polywrap/wrap-manifest-types-js" "0.3.0" - graphql "15.5.0" - graphql-tag "2.10.4" - js-yaml "3.14.0" - jsonschema "1.4.0" - semver "7.3.5" - -"@polywrap/ens-resolver-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/ens-resolver-plugin-js/-/ens-resolver-plugin-js-0.3.0.tgz#bcf85851fdfda62ac54aa2b24a31f7579160ea10" - integrity sha512-3yBFA45hCxh1Wnu8YWEFot21E9MS1BZnDfZ1b6UMHwTOU9xLpsbOhpwXGTBaChjLb8O5/dCPFBBrDDL35PnKQg== - dependencies: - "@ethersproject/address" "5.0.7" - "@ethersproject/basex" "5.0.7" - "@polywrap/core-js" "0.3.0" - ethers "5.0.7" - -"@polywrap/ethereum-plugin-js@0.3.0", "@polywrap/ethereum-plugin-js@0.3.x": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/ethereum-plugin-js/-/ethereum-plugin-js-0.3.0.tgz#45a97e0d73d54bc4e4de709a2196ae18142866bf" - integrity sha512-K87KnXSjBu7g/Up6T3QgQj07D3ZN0iXf7KsC0JH6MMj6Yq61Nb7JJWz3r8uQJ5NfbnKcF+aKfRNKWKObWxdHRg== - dependencies: - "@ethersproject/address" "5.0.7" - "@ethersproject/providers" "5.0.7" - "@polywrap/core-js" "0.3.0" - ethers "5.0.7" - -"@polywrap/fs-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/fs-plugin-js/-/fs-plugin-js-0.3.0.tgz#e1fe70bb3caf5173378dc3fc9ad033207273b3ee" - integrity sha512-oeH3OnSK0Sh9haYF3VKSWYXk+/TViE+eh/Qm/3isR5Z5QH8r1dq7ptbd15afsxRwtJKWtL/rU1lG9I5v2RAdYw== - dependencies: - "@polywrap/core-js" "0.3.0" - -"@polywrap/fs-resolver-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/fs-resolver-plugin-js/-/fs-resolver-plugin-js-0.3.0.tgz#d8db954f438888b09ed850f8704d6eff570dc33a" - integrity sha512-OkMCNqMdDKzZwNUb50aK7J/Ci35EE3fbAQ7dVpoRM746ShkLxxjs2X6mwo2O8JI71nAOA9A8GmmkutKkqg2RkQ== - dependencies: - "@polywrap/core-js" "0.3.0" - -"@polywrap/graph-node-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/graph-node-plugin-js/-/graph-node-plugin-js-0.3.0.tgz#0b4d2d7b4ad640b440d842f4ea289d3f6e4c68ea" - integrity sha512-7t8CV/SmaHA8/26EgFTB9YKy6US9muemRHi1OEN2Yh7QuXbZ7NslBquI0TqrDXItkFTBRlSBig+9yr/Ln0Jhfg== - dependencies: - "@polywrap/core-js" "0.3.0" - "@polywrap/http-plugin-js" "0.3.0" - apollo-link "1.2.14" - apollo-link-http "1.5.17" - cross-fetch "3.0.5" - graphql-tag "2.10.4" - -"@polywrap/http-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/http-plugin-js/-/http-plugin-js-0.3.0.tgz#1f0a1bd8d154ab6c367fec218a8358499a45f2b4" - integrity sha512-QnxJeQA4USmzdqKeRMiFiZNuJEDcAIYZ0T+anCfojBYZ0dOff1EYhQ+C45dNjXhFcNqYrIrHpc9WesVD0TyM9Q== - dependencies: - "@polywrap/core-js" "0.3.0" - axios "0.21.4" - -"@polywrap/ipfs-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/ipfs-plugin-js/-/ipfs-plugin-js-0.3.0.tgz#9c982b194e6410ef10ebcf9256adee8c76f1ba0f" - integrity sha512-/vujcTDJGSMA+aeIm2NDjhHkRpNsCRyfCj9I6ufVPS4AUfRWWo+5I3rjLuKoSWZtPd2fQfNeuyGZ+Hfe5EOyGg== - dependencies: - "@dorgjelli-test/ipfs-http-client-lite" "0.3.1" - "@polywrap/core-js" "0.3.0" - abort-controller "3.0.0" - is-ipfs "1.0.3" - multiformats "9.7.0" - -"@polywrap/ipfs-resolver-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/ipfs-resolver-plugin-js/-/ipfs-resolver-plugin-js-0.3.0.tgz#d62c5e9391d47ab69aaebc66a448482144bca2e0" - integrity sha512-8roAg0O46gm7itJi/3CHXGkViB2wRxmyS1tnnfr1gLW9q36V+O3ez7JOh9zd3wGuba0hXVIfp5VXdX562hXhSQ== - dependencies: - "@dorgjelli-test/ipfs-http-client-lite" "0.3.1" - "@polywrap/core-js" "0.3.0" - abort-controller "3.0.0" - is-ipfs "1.0.3" - -"@polywrap/logger-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.3.0.tgz#edc30364f17ee1f35c184752d22abbc1fa5d55f6" - integrity sha512-Nj3qVC0m2fPgDgoAazwAw/eEXUrrkLJPSub0LXW+t4oJ7lRZnNJoj3cKpybrsSZEN5RbT0t+1YCH4WgD39P5Tg== - dependencies: - "@polywrap/core-js" "0.3.0" - -"@polywrap/msgpack-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.3.0.tgz#6d44dfeacdf1036c59dbec5db31f09866829c2db" - integrity sha512-1O7JXQx23jOusAH+sX9myXua2/pZAPQEJqy9rqDOq+bUK/cpnhGwBfdzIIyMZY5kujlQUyRrjsryZZC2CWWJJw== - dependencies: - "@msgpack/msgpack" "2.7.2" - -"@polywrap/os-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/os-js/-/os-js-0.3.0.tgz#0ff035e000294202b82aef9f860a221269d31cee" - integrity sha512-cNQGF/tTluT/OawO5KLLhwcyxPqi4VXxJlJcSZjkhuE1V10nTJe7CZy2PFTjbNUomvmGJKeXcicRQkKmaQq01w== - -"@polywrap/polywrap-manifest-schemas@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-schemas/-/polywrap-manifest-schemas-0.3.0.tgz#7e20f91fb263f5e597610f348a8a133ed7b8e6b9" - integrity sha512-XPKPrRS8xfGNfRXSTnayeL0DoXTtgzCrSf0i1cVSYQTZwOwvrvgCItnauk6XKzZGj+lZXfSJPvv0cR7/Yvg9UQ== - -"@polywrap/polywrap-manifest-types-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-types-js/-/polywrap-manifest-types-js-0.3.0.tgz#d9f74c36223a179c68164b25e8050279b1617cfa" - integrity sha512-BWXrrnDsSih4uxi4FriYuhGwOeNnWbi1t8b7u3ycuW+Uyfp7fme8H/FXq/AiEzBVZ3u8Kp6D3C4q33tbxY05Zg== - dependencies: - "@polywrap/polywrap-manifest-schemas" "0.3.0" - js-yaml "3.14.0" - jsonschema "1.4.0" - semver "7.3.5" - -"@polywrap/schema-bind@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/schema-bind/-/schema-bind-0.3.0.tgz#074282d547ac8bf73005047aba523f1b7f42b9e0" - integrity sha512-GBj/88DW3U9xeDQHS4AaI8cxA5Duz7DnOXYNPaX41UwWkOmkFCHXOCNzhqQKRmrpyRkBvPjcV1y0EyqCEfo66Q== - dependencies: - "@polywrap/os-js" "0.3.0" - "@polywrap/schema-parse" "0.3.0" - mustache "4.0.1" - -"@polywrap/schema-compose@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/schema-compose/-/schema-compose-0.3.0.tgz#979d24736b850f59b50e8a67855d7390d06d4a8c" - integrity sha512-hIsuOPfdP/KFu1oMbuP7yYKnJlHQU7ZNXKGPK5yt/2WF3ghsKNW/urKlxk9/24no2in2SIqZQy/X5OklUsi+4Q== - dependencies: - "@polywrap/schema-parse" "0.3.0" - graphql "15.5.0" - mustache "4.0.1" - -"@polywrap/schema-parse@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/schema-parse/-/schema-parse-0.3.0.tgz#35dff65e4f92c09248857515ffa804c4f3c0bc74" - integrity sha512-IcTxVGgZ4AI8EFVVmWHKF/KKGMmV/YB1KVh4pxI1SRitdJc6jLcUmZE2+iXyoIg7XZCvdyKA2xfRbpsJ8kY/Og== - dependencies: - "@dorgjelli/graphql-schema-cycles" "1.1.4" - graphql "15.5.0" - -"@polywrap/sha3-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/sha3-plugin-js/-/sha3-plugin-js-0.3.0.tgz#7fc32844bdd67f51ed64ae9b680d5d2397c01cea" - integrity sha512-GL73Ne7MK/61AFDpOd7ZNEikeLLpEzWCRPWBQBW5WPD54sgrDYvhEmThV3k7/G5fKSHzbzww4leQBUyPvS4foA== - dependencies: - "@polywrap/core-js" "0.3.0" - js-sha3 "0.8.0" - -"@polywrap/test-env-js@0.3.0", "@polywrap/test-env-js@0.3.x": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/test-env-js/-/test-env-js-0.3.0.tgz#ce9201a4ca8d8fee0de9817ac589f5a005a91706" - integrity sha512-PbAkArGuZ0z4zx7ufU9Cz2uPKWZZocnGK9Qax0Fae9r/8v/fY/pFhMAdokgS0utXAMTXcInrMW8+K8B7bocEsA== - dependencies: - "@polywrap/client-js" "0.3.0" - "@polywrap/core-js" "0.3.0" - "@polywrap/ethereum-plugin-js" "0.3.0" - "@polywrap/polywrap-manifest-types-js" "0.3.0" - axios "0.21.2" - js-yaml "4.1.0" - spawn-command "0.0.2-1" - -"@polywrap/tracing-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.3.0.tgz#d45e90bf9e4adbbb7d9cfb79b1aaa0b71009476d" - integrity sha512-1lV/UGoq/UcGvsiAbZCsfkmcOay7EpRnCW0nBxPO7KfcuGUKFqJqmWr8SgrnREWOYkVDeHUUse9HhOYTuAL44w== - dependencies: - "@opentelemetry/api" "0.20.0" - "@opentelemetry/context-zone" "0.20.0" - "@opentelemetry/core" "0.20.0" - "@opentelemetry/exporter-collector" "0.20.0" - "@opentelemetry/exporter-jaeger" "0.20.0" - "@opentelemetry/exporter-zipkin" "0.20.0" - "@opentelemetry/node" "0.20.0" - "@opentelemetry/propagator-b3" "0.20.0" - "@opentelemetry/tracing" "0.20.0" - "@opentelemetry/web" "0.20.0" - browser-util-inspect "0.2.0" - -"@polywrap/uts46-plugin-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/uts46-plugin-js/-/uts46-plugin-js-0.3.0.tgz#2b25f1c6ebd684009e9ec8850be88c65a5ceb14b" - integrity sha512-Klp+OyjtmDg3SHsriU+aEv4uihh4vypgjTUK0CpPFOHtXG6Cl22PtDlHRU/hk2keC+cN5JK6tav8zY6LxbF8Ww== - dependencies: - "@polywrap/core-js" "0.3.0" - idna-uts46-hx "3.4.0" - -"@polywrap/wasm-as@0.3.x": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/wasm-as/-/wasm-as-0.3.0.tgz#dbb949e6e76df6971cca1a1ab8d1c52e9fcb295c" - integrity sha512-rxQaVKPu67AqgzozUdB3EQ2UKhp8bqq6ZExS8aApfgAcGhN8uH9wuk64qTbvgS725Wsw+eUWBaA471vNf1EfXw== - dependencies: - "@web3api/assemblyscript-json" "1.2.0" - as-bigint "0.5.3" - as-bignumber "0.2.1" - as-container "0.6.1" - -"@polywrap/wrap-manifest-schemas@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-schemas/-/wrap-manifest-schemas-0.3.0.tgz#26daefff75609fc2b05154f9d3e67d1c93491cc2" - integrity sha512-kHKiy03s3+y6ahejF20dg/vwD+5q+4vv0kEBCHIfH4V8GmCKISsgThM30B/DsDnVGrpDelC/kiD5dqDkSIr4aw== - -"@polywrap/wrap-manifest-types-js@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.3.0.tgz#2c3010c45a8a2986c0a5ba23ea46a47d3fed4b0a" - integrity sha512-OX7tKZO5T4o2tf+ioK5MnawbyUo6Q8XpHhoxdjCiSXBEfs98Wb1EEfKdoHjwlAWirgCkwfSvZwJC4kRdb30evQ== - dependencies: - "@polywrap/msgpack-js" "0.3.0" - "@polywrap/wrap-manifest-schemas" "0.3.0" - json-schema-ref-parser "9.0.9" - jsonschema "1.4.0" - semver "7.3.5" - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@26.0.8": - version "26.0.8" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.8.tgz#f5c5559cf25911ce227f7ce30f1f160f24966369" - integrity sha512-eo3VX9jGASSuv680D4VQ89UmuLZneNxv2MCZjfwlInav05zXVJTzfc//lavdV0GPwSxsXJTy2jALscB7Acqg0g== - dependencies: - jest-diff "^25.2.1" - pretty-format "^25.2.1" - -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.6": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node-fetch@2.5.10": - version "2.5.10" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" - integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node@*": - version "18.0.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" - integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== - -"@types/node@12.6.9": - version "12.6.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.9.tgz#ffeee23afdc19ab16e979338e7b536fdebbbaeaf" - integrity sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prettier@^2.0.0": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz#7579c6d17ad862154c10bc14b40e5427b729e209" - integrity sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw== - dependencies: - "@typescript-eslint/experimental-utils" "4.11.1" - "@typescript-eslint/scope-manager" "4.11.1" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz#2dad3535b878c25c7424e40bfa79d899f3f485bc" - integrity sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.11.1" - "@typescript-eslint/types" "4.11.1" - "@typescript-eslint/typescript-estree" "4.11.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.11.1.tgz#981e18de2e019d6ca312596615f92e8f6f6598ed" - integrity sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw== - dependencies: - "@typescript-eslint/scope-manager" "4.11.1" - "@typescript-eslint/types" "4.11.1" - "@typescript-eslint/typescript-estree" "4.11.1" - debug "^4.1.1" - -"@typescript-eslint/scope-manager@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz#72dc2b60b0029ab0888479b12bf83034920b4b69" - integrity sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ== - dependencies: - "@typescript-eslint/types" "4.11.1" - "@typescript-eslint/visitor-keys" "4.11.1" - -"@typescript-eslint/types@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.11.1.tgz#3ba30c965963ef9f8ced5a29938dd0c465bd3e05" - integrity sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA== - -"@typescript-eslint/typescript-estree@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz#a4416b4a65872a48773b9e47afabdf7519eb10bc" - integrity sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw== - dependencies: - "@typescript-eslint/types" "4.11.1" - "@typescript-eslint/visitor-keys" "4.11.1" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/visitor-keys@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz#4c050a4c1f7239786e2dd4e69691436143024e05" - integrity sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg== - dependencies: - "@typescript-eslint/types" "4.11.1" - eslint-visitor-keys "^2.0.0" - -"@uniswap/lib@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@uniswap/lib/-/lib-1.1.1.tgz#0afd29601846c16e5d082866cbb24a9e0758e6bc" - integrity sha512-2yK7sLpKIT91TiS5sewHtOa7YuM8IuBXVl4GZv2jZFys4D2sY7K5vZh6MqD25TPA95Od+0YzCVq6cTF2IKrOmg== - -"@uniswap/sdk@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@uniswap/sdk/-/sdk-3.0.3.tgz#8201c7c72215d0030cb99acc7e661eff895c18a9" - integrity sha512-t4s8bvzaCFSiqD2qfXIm3rWhbdnXp+QjD3/mRaeVDHK7zWevs6RGEb1ohMiNgOCTZANvBayb4j8p+XFdnMBadQ== - dependencies: - "@uniswap/v2-core" "^1.0.0" - big.js "^5.2.2" - decimal.js-light "^2.5.0" - jsbi "^3.1.1" - tiny-invariant "^1.1.0" - tiny-warning "^1.0.3" - toformat "^2.0.0" - -"@uniswap/v2-core@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.0.tgz#e0fab91a7d53e8cafb5326ae4ca18351116b0844" - integrity sha512-BJiXrBGnN8mti7saW49MXwxDBRFiWemGetE58q8zgfnPPzQKq55ADltEILqOt6VFZ22kVeVKbF8gVd8aY3l7pA== - -"@uniswap/v2-core@1.0.1", "@uniswap/v2-core@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.1.tgz#af8f508bf183204779938969e2e54043e147d425" - integrity sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== - -"@uniswap/v2-periphery@1.1.0-beta.0": - version "1.1.0-beta.0" - resolved "https://registry.yarnpkg.com/@uniswap/v2-periphery/-/v2-periphery-1.1.0-beta.0.tgz#20a4ccfca22f1a45402303aedb5717b6918ebe6d" - integrity sha512-6dkwAMKza8nzqYiXEr2D86dgW3TTavUvCR0w2Tu33bAbM8Ah43LKAzH7oKKPRT5VJQaMi1jtkGs1E8JPor1n5g== - dependencies: - "@uniswap/lib" "1.1.1" - "@uniswap/v2-core" "1.0.0" - -"@web3api/assemblyscript-json@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@web3api/assemblyscript-json/-/assemblyscript-json-1.2.0.tgz#f01f11f12a66cd1a319d43f12e476307d1ad3da8" - integrity sha512-x+wchJpH1giJzXj3dYs8vh2SKMXepeqVXiaFV/YCtXg4X/KaUnxi0kp5JugbEAyEJurEScH1YuV6IvGhGui/fw== - -"@wry/equality@^0.1.2": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" - integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== - dependencies: - tslib "^1.9.3" - -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abort-controller@3.0.0, abort-controller@^3.0.0: - version "3.0.0" - 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" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1, acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - -aes-js@3.0.0: - version "3.0.0" - 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.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - 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" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-color@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" - integrity sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ== - -ansi-colors@^3.2.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-colors@^4.1.1: - version "4.1.3" - 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: - version "4.3.2" - 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.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: - version "5.0.1" - 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.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.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -any-signal@^2.0.0, any-signal@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" - integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== - dependencies: - abort-controller "^3.0.0" - native-abort-controller "^1.0.3" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.3, anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -apisauce@^2.0.1: - version "2.1.5" - resolved "https://registry.yarnpkg.com/apisauce/-/apisauce-2.1.5.tgz#546229f8f145711b3b022065afb0f43bd304ecb3" - integrity sha512-bkMlz0ZUnyS8vDigej9UBYo5dne9/bQrkgIiIkGaiDHF6e5OxhYRLJDYu65V/Ox86tmWVwepIntAoTmk4Db0Hg== - dependencies: - axios "^0.21.4" - -apollo-link-http-common@^0.2.16: - version "0.2.16" - resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc" - integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg== - dependencies: - apollo-link "^1.2.14" - ts-invariant "^0.4.0" - tslib "^1.9.3" - -apollo-link-http@1.5.17: - version "1.5.17" - resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba" - integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg== - dependencies: - apollo-link "^1.2.14" - apollo-link-http-common "^0.2.16" - tslib "^1.9.3" - -apollo-link@1.2.14, apollo-link@^1.2.14: - version "1.2.14" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" - integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== - dependencies: - apollo-utilities "^1.3.0" - ts-invariant "^0.4.0" - tslib "^1.9.3" - zen-observable-ts "^0.8.21" - -apollo-utilities@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" - integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== - dependencies: - "@wry/equality" "^0.1.2" - fast-json-stable-stringify "^2.0.0" - ts-invariant "^0.4.0" - tslib "^1.10.0" - -app-module-path@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" - integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== - -arg@^4.1.0: - version "4.1.3" - 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.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.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-includes@^3.1.1: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -array.prototype.flat@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -as-bigint@0.5.3, as-bigint@^0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/as-bigint/-/as-bigint-0.5.3.tgz#a0647d0b7ce835077aca33115e71eb26a83df8be" - integrity sha512-tg9iTO/vPeovOM5CSk1WxYcsfBd/cd3twhBW5PrpcGUfiSEXlPB69eOxFKvSbZnpuDxBAyQ4YBgEkfnYL89Czw== - -as-bignumber@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/as-bignumber/-/as-bignumber-0.2.1.tgz#6479caca7f24f784b10b3d2633cde457ef9cbc22" - integrity sha512-udKOlFYKSZyuHK7upTczRR8lcXkyPS0DR6NOtP+c3bhM4B2B0VqMBTzqa0hdYG4Zss94zA6UmqpjreEbzNUo4g== - dependencies: - as-bigint "^0.5.1" - -as-container@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/as-container/-/as-container-0.6.1.tgz#94806a91e96b68622c55f301fc04e6339a1228c2" - integrity sha512-cgQ7P/dQAGeU2lLhPpinThYfFcUw3HzV8b00CoqV+l5Tsgpl7xhXdoc/2srCyK0um1BVAQwlrEpNTtthzkMF+g== - -assemblyscript@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/assemblyscript/-/assemblyscript-0.19.1.tgz#8d52332b7cef88e03d15b633e70c5febddd1f444" - integrity sha512-unWcmJsw5H0H2GrTf25GlDJCaNzAveeFYPH5XhP54m540+26KJIurTEHN+xf/EI3MdK7IhThpGCE+pNqiNuLmA== - dependencies: - binaryen "101.0.0-nightly.20210527" - long "^4.0.0" - -assemblyscript@0.19.23: - version "0.19.23" - resolved "https://registry.yarnpkg.com/assemblyscript/-/assemblyscript-0.19.23.tgz#16ece69f7f302161e2e736a0f6a474e6db72134c" - integrity sha512-fwOQNZVTMga5KRsfY80g7cpOl4PsFQczMwHzdtgoqLXaYhkhavufKb0sB0l3T1DUxpAufA0KNhlbpuuhZUwxMA== - dependencies: - binaryen "102.0.0-nightly.20211028" - long "^5.2.0" - source-map-support "^0.5.20" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-iterator-to-pull-stream@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/async-iterator-to-pull-stream/-/async-iterator-to-pull-stream-1.3.0.tgz#3a6b9f3cceadff972ca20eb480e3cb43f8789732" - integrity sha512-NjyhAEz/sx32olqgKIk/2xbWEM6o8qef1yetIgb0U/R3oBgndP1kE/0CslowH3jvnA94BO4I6OXpOkTKH7Z1AA== - dependencies: - get-iterator "^1.0.2" - pull-stream-to-async-iterator "^1.0.1" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axios@0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" - -axios@0.21.2: - version "0.21.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.2.tgz#21297d5084b2aeeb422f5d38e7be4fbb82239017" - integrity sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg== - dependencies: - follow-redirects "^1.14.0" - -axios@0.21.4, axios@^0.21.4: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== - dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" - -babel-plugin-istanbul@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== - dependencies: - babel-plugin-jest-hoist "^26.6.2" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.8: - version "3.0.9" - 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.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -bignumber.js@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binaryen@101.0.0-nightly.20210527: - version "101.0.0-nightly.20210527" - resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-101.0.0-nightly.20210527.tgz#7677155efc965e0276dd206ed30f2d9e216ed6e2" - integrity sha512-dbKentJwA6H0LfI+pRuzNNzAooJwYFNrg1L8rRw8j6rlfkU815ytNLO+uDzGNcltYehUa5ERZFJHPIdqX12n0w== - -binaryen@102.0.0-nightly.20211028: - version "102.0.0-nightly.20211028" - resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz#8f1efb0920afd34509e342e37f84313ec936afb2" - integrity sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w== - -bl@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -blob-to-it@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" - integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== - dependencies: - browser-readablestream-to-it "^1.0.3" - -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -borc@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" - integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== - dependencies: - bignumber.js "^9.0.0" - buffer "^5.5.0" - commander "^2.15.0" - ieee754 "^1.1.13" - iso-url "~0.4.7" - json-text-sequence "~0.1.0" - readable-stream "^3.6.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - 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@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - 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.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" - integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== - -browser-util-inspect@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browser-util-inspect/-/browser-util-inspect-0.2.0.tgz#cdda8ce1a4a07a4386035168a228c8777bff459c" - integrity sha512-R7WvAj0p9FtwS2Jbtc1HUd1+YZdeb5EEqjBSbbOK3owJtW1viWyJDeTPy43QZ7bZ8POtb1yMv++h844486jMsQ== - -browserslist@^4.20.2: - version "4.21.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00" - integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ== - dependencies: - caniuse-lite "^1.0.30001359" - electron-to-chromium "^1.4.172" - node-releases "^2.0.5" - update-browserslist-db "^1.0.4" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - 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-from@1.x, buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - 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" - -buffer@^6.0.1: - 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" - -bufrw@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bufrw/-/bufrw-1.3.0.tgz#28d6cfdaf34300376836310f5c31d57eeb40c8fa" - integrity sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ== - dependencies: - ansi-color "^0.2.1" - error "^7.0.0" - hexer "^1.5.0" - xtend "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - 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" - get-intrinsic "^1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - 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.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001359: - version "1.0.30001364" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001364.tgz#1e118f0e933ed2b79f8d461796b8ce45398014a0" - integrity sha512-9O0xzV3wVyX0SlegIQ6knz+okhBB5pE0PC40MNdwcipjwpxoUEHL24uJ+gG42cgklPjfO5ZjZPme9FTSN3QT2Q== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -chalk@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - 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" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@3.5.1: - version "3.5.1" - 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" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - -cids@^1.0.0: - version "1.1.9" - resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.9.tgz#402c26db5c07059377bcd6fb82f2a24e7f2f4a4f" - integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== - dependencies: - multibase "^4.0.1" - multicodec "^3.0.1" - multihashes "^4.0.1" - uint8arrays "^3.0.0" - -cids@~0.8.0: - version "0.8.3" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.8.3.tgz#aaf48ac8ed857c3d37dad94d8db1d8c9407b92db" - integrity sha512-yoXTbV3llpm+EBGWKeL9xKtksPE/s6DPoDSY4fn8I8TEW1zehWXPSB0pwAXVDlLaOlrw+sNynj995uD9abmPhA== - dependencies: - buffer "^5.6.0" - class-is "^1.1.0" - multibase "^1.0.0" - multicodec "^1.0.1" - multihashes "^1.0.1" - -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== - -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-cursor@^3.1.0: - version "3.1.0" - 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.2.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== - -cli-table3@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== - dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" - optionalDependencies: - colors "^1.1.2" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^7.0.2: - version "7.0.4" - 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" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - 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.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.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.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colors@^1.1.2, colors@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combined-stream@^1.0.6, combined-stream@^1.0.8: - version "1.0.8" - 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" - -commander@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== - -commander@^2.15.0, commander@^2.19.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg== - -content-hash@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -copyfiles@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" - integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== - dependencies: - glob "^7.0.5" - minimatch "^3.0.3" - mkdirp "^1.0.4" - noms "0.0.0" - through2 "^2.0.1" - untildify "^4.0.0" - yargs "^16.1.0" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cross-fetch@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.5.tgz#2739d2981892e7ab488a7ad03b92df2816e03f4c" - integrity sha512-FFLcLtraisj5eteosnX1gf01qYDCOc4fDy0+euOt8Kn9YBY2NtXL/pCoYPavw24NIQkQqm5ZOLsGD5Zzj0gyew== - dependencies: - node-fetch "2.6.0" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csv-stringify@^5.6.2: - version "5.6.5" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" - integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decimal.js-light@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" - integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - 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.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.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== - dependencies: - clone "^1.0.2" - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" - integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== - -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -discontinuous-range@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" - integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== - -dns-over-http-resolver@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" - integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== - dependencies: - debug "^4.3.1" - native-fetch "^3.0.0" - receptacle "^1.3.2" - -docker-compose@0.23.17: - version "0.23.17" - resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.17.tgz#8816bef82562d9417dc8c790aa4871350f93a2ba" - integrity sha512-YJV18YoYIcxOdJKeFcCFihE6F4M2NExWM/d4S1ITcS9samHKnNUihz9kjggr0dNtsrbpFNc7/Yzd19DWs+m1xg== - dependencies: - yaml "^1.10.2" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg== - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== - -electron-fetch@^1.7.2: - version "1.7.4" - resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.4.tgz#af975ab92a14798bfaa025f88dcd2e54a7b0b769" - integrity sha512-+fBLXEy4CJWQ5bz8dyaeSG1hD6JJ15kBZyj3eh24pIVrd3hLM47H/umffrdQfS6GZ0falF0g9JT9f3Rs6AVUhw== - dependencies: - encoding "^0.1.13" - -electron-to-chromium@^1.4.172: - version "1.4.185" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.185.tgz#3432d7944f1c5fe20664bb45d9cced2151405ce2" - integrity sha512-9kV/isoOGpKkBt04yYNaSWIBn3187Q5VZRtoReq8oz5NY/A4XmU6cAoqgQlDp7kKJCZMRjWZ8nsQyxfpFHvfyw== - -elliptic@6.5.4: - version "6.5.4" - 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" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.4.tgz#c608f2e1134c7f68c1c9ee056de13f9b31076de9" - integrity sha512-pkYrrDZumL2VS6VBGDhqbajCM2xpkUNLuKfGPjfKaSIBKYopQbqEFyrOkRMIb2HDR/rO1kGhEt/5twBwtzKBXw== - dependencies: - ansi-colors "^3.2.1" - -enquirer@^2.3.5: - version "2.3.6" - 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" - -err-code@^2.0.0, err-code@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -err-code@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" - integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - 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" - -error@7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" - integrity sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw== - dependencies: - string-template "~0.2.1" - xtend "~4.0.0" - -error@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" - integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== - dependencies: - string-template "~0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz#5402eb559aa94b894effd6bddfa0b1ca051c858f" - integrity sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA== - -eslint-import-resolver-node@^0.3.4: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-module-utils@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== - dependencies: - debug "^3.2.7" - find-up "^2.1.0" - -eslint-plugin-import@2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-prettier@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz#61e295349a65688ffac0b7808ef0a8244bdd8d40" - integrity sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.0.0, eslint-scope@^5.1.1: - version "5.1.1" - 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" - estraverse "^4.1.1" - -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - 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-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - 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.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.16.0.tgz#a761605bf9a7b32d24bb7cde59aeb0fd76f06092" - integrity sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.2" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.2.0" - esutils "^2.0.2" - file-entry-cache "^6.0.0" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.19" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.4" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - 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" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.2.0: - version "1.4.0" - 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.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.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.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -ethers@5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.7.tgz#41c3d774e0a57bfde12b0198885789fb41a14976" - integrity sha512-1Zu9s+z4BgsDAZcGIYACJdWBB6mVtCCmUonj68Njul7STcSdgwOyj0sCAxCUr2Nsmsamckr4E12q3ecvZPGAUw== - dependencies: - "@ethersproject/abi" "^5.0.0" - "@ethersproject/abstract-provider" "^5.0.0" - "@ethersproject/abstract-signer" "^5.0.0" - "@ethersproject/address" "^5.0.0" - "@ethersproject/base64" "^5.0.0" - "@ethersproject/bignumber" "^5.0.0" - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/constants" "^5.0.0" - "@ethersproject/contracts" "^5.0.0" - "@ethersproject/hash" "^5.0.0" - "@ethersproject/hdnode" "^5.0.0" - "@ethersproject/json-wallets" "^5.0.0" - "@ethersproject/keccak256" "^5.0.0" - "@ethersproject/logger" "^5.0.0" - "@ethersproject/networks" "^5.0.0" - "@ethersproject/pbkdf2" "^5.0.0" - "@ethersproject/properties" "^5.0.0" - "@ethersproject/providers" "^5.0.0" - "@ethersproject/random" "^5.0.0" - "@ethersproject/rlp" "^5.0.0" - "@ethersproject/sha2" "^5.0.0" - "@ethersproject/signing-key" "^5.0.0" - "@ethersproject/solidity" "^5.0.0" - "@ethersproject/strings" "^5.0.0" - "@ethersproject/transactions" "^5.0.0" - "@ethersproject/units" "^5.0.0" - "@ethersproject/wallet" "^5.0.0" - "@ethersproject/web" "^5.0.0" - "@ethersproject/wordlists" "^5.0.0" - -ethers@5.6.4: - version "5.6.4" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.4.tgz#23629e9a7d4bc5802dfb53d4da420d738744b53c" - integrity sha512-62UIfxAQXdf67TeeOaoOoPctm5hUlYgfd0iW3wxfj7qRYKDcvvy0f+sJ3W2/Pyx77R8dblvejA8jokj+lS+ATQ== - dependencies: - "@ethersproject/abi" "5.6.1" - "@ethersproject/abstract-provider" "5.6.0" - "@ethersproject/abstract-signer" "5.6.0" - "@ethersproject/address" "5.6.0" - "@ethersproject/base64" "5.6.0" - "@ethersproject/basex" "5.6.0" - "@ethersproject/bignumber" "5.6.0" - "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.0" - "@ethersproject/contracts" "5.6.0" - "@ethersproject/hash" "5.6.0" - "@ethersproject/hdnode" "5.6.0" - "@ethersproject/json-wallets" "5.6.0" - "@ethersproject/keccak256" "5.6.0" - "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.2" - "@ethersproject/pbkdf2" "5.6.0" - "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.4" - "@ethersproject/random" "5.6.0" - "@ethersproject/rlp" "5.6.0" - "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.0" - "@ethersproject/solidity" "5.6.0" - "@ethersproject/strings" "5.6.0" - "@ethersproject/transactions" "5.6.0" - "@ethersproject/units" "5.6.0" - "@ethersproject/wallet" "5.6.0" - "@ethersproject/web" "5.6.0" - "@ethersproject/wordlists" "5.6.0" - -event-target-shim@^5.0.0: - version "5.0.1" - 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== - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== - dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - -explain-error@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/explain-error/-/explain-error-1.0.4.tgz#a793d3ac0cad4c6ab571e9968fbbab6cb2532929" - integrity sha512-/wSgNMxFusiYRy1rd19LT2SQlIXDppHpumpWo06wxjflD1OYxDLbl6rMVw+U3bxD5Nuhex4TKqv9Aem4D0lVzQ== - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1: - version "3.1.3" - 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.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-fifo@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.1.0.tgz#17d1a3646880b9891dfa0c54e69c5fef33cad779" - integrity sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g== - -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - 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, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-memoize@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" - integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.0: - version "6.0.1" - 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@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - 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-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - 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.0.0, find-up@^4.1.0: - version "4.1.0" - 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" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -follow-redirects@^1.10.0, follow-redirects@^1.14.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -form-data@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fs-extra@9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-jetpack@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-2.4.0.tgz#6080c4ab464a019d37a404baeb47f32af8835026" - integrity sha512-S/o9Dd7K9A7gicVU32eT8G0kHcmSu0rCVdP79P0MWInKFb8XpTc8Syhoo66k9no+HDshtlh4pUJTws8X+8fdFQ== - dependencies: - minimatch "^3.0.2" - rimraf "^2.6.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.1.2, fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - 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== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - 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.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-iterator@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" - integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0: - version "5.1.2" - 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.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globalthis@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.1: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gluegun@4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/gluegun/-/gluegun-4.6.1.tgz#f2a65d20378873de87a2143b8c3939ffc9a9e2b6" - integrity sha512-Jd5hV1Uku2rjBg59mYA/bnwLwynK7u9A1zmK/LIb/p5d3pzjDCKRjWFuxZXyPwl9rsvKGhJUQxkFo2HEy8crKQ== - dependencies: - apisauce "^2.0.1" - app-module-path "^2.2.0" - cli-table3 "~0.5.0" - colors "^1.3.3" - cosmiconfig "6.0.0" - cross-spawn "^7.0.0" - ejs "^2.6.1" - enquirer "2.3.4" - execa "^3.0.0" - fs-jetpack "^2.2.2" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - lodash.lowercase "^4.3.0" - lodash.lowerfirst "^4.3.1" - lodash.pad "^4.5.1" - lodash.padend "^4.6.1" - lodash.padstart "^4.6.1" - lodash.repeat "^4.1.0" - lodash.snakecase "^4.1.1" - lodash.startcase "^4.4.0" - lodash.trim "^4.5.1" - lodash.trimend "^4.5.1" - lodash.trimstart "^4.5.1" - lodash.uppercase "^4.3.0" - lodash.upperfirst "^4.3.1" - ora "^4.0.0" - pluralize "^8.0.0" - ramdasauce "^2.1.0" - semver "^7.0.0" - which "^2.0.0" - yargs-parser "^16.1.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graphql-json-transform@^1.1.0-alpha.0: - version "1.1.0-alpha.0" - resolved "https://registry.yarnpkg.com/graphql-json-transform/-/graphql-json-transform-1.1.0-alpha.0.tgz#fb0c88d24840067e6c55ac64bbc8d4e5de245d2d" - integrity sha512-I6lR/lYEezSz4iru0f7a/wR8Rzi3pCafk7S0bX2b/WQOtK0vKabxLShGBXIslsi0arMehIjvOPHJl7MpOUqj0w== - -graphql-tag@2.10.4: - version "2.10.4" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.4.tgz#2f301a98219be8b178a6453bb7e33b79b66d8f83" - integrity sha512-O7vG5BT3w6Sotc26ybcvLKNTdfr4GfsIVMD+LdYqXCeJIYPRyp8BIsDOUtxw7S1PYvRw5vH3278J2EDezR6mfA== - -graphql-tag@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" - integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== - -graphql@15.5.0: - version "15.5.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.0.tgz#39d19494dbe69d1ea719915b578bf920344a69d5" - integrity sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - 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.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.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - 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.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hexer@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/hexer/-/hexer-1.5.0.tgz#b86ce808598e8a9d1892c571f3cedd86fc9f0653" - integrity sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg== - dependencies: - ansi-color "^0.2.1" - minimist "^1.1.0" - process "^0.10.0" - xtend "^4.0.0" - -hmac-drbg@^1.0.1: - version "1.0.1" - 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" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - 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" - debug "4" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -iconv-lite@0.4.24: - version "0.4.24" - 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" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -idna-uts46-hx@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-3.4.0.tgz#aa380e7c04d6bce4f5e26da742c613ea2996f470" - integrity sha512-b1I4qYTcJcX1TANn8OhOGrQUIWOfZUWrLKWDeKbV6posVLjp7OTqFKX3N20efrIMzQM1KhiphOEazBEEUFR9bg== - dependencies: - punycode "^2.1.1" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - 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.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - 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" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - 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.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -intl-messageformat-parser@6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.4.2.tgz#e2d28c3156c27961ead9d613ca55b6a155078d7d" - integrity sha512-IVNGy24lNEYr/KPWId5tF3KXRHFFbMgzIMI4kUonNa/ide2ywUYyBuOUro1IBGZJqjA2ncBVUyXdYKlMfzqpAA== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -intl-messageformat@9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.5.2.tgz#e72d32152c760b7411e413780e462909987c005a" - integrity sha512-sBGXcSQLyBuBA/kzAYhTpzhzkOGfSwGIau2W6FuwLZk0JE+VF3C+y0077FhVDOcRSi60iSfWzT8QC3Z7//dFxw== - dependencies: - fast-memoize "^2.5.2" - intl-messageformat-parser "6.4.2" - tslib "^2.1.0" - -invert-kv@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" - integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== - -ip-regex@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ipfs-core-utils@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.5.4.tgz#c7fa508562086be65cebb51feb13c58abbbd3d8d" - integrity sha512-V+OHCkqf/263jHU0Fc9Rx/uDuwlz3PHxl3qu6a5ka/mNi6gucbFuI53jWsevCrOOY9giWMLB29RINGmCV5dFeQ== - dependencies: - any-signal "^2.0.0" - blob-to-it "^1.0.1" - browser-readablestream-to-it "^1.0.1" - cids "^1.0.0" - err-code "^2.0.3" - ipfs-utils "^5.0.0" - it-all "^1.0.4" - it-map "^1.0.4" - it-peekable "^1.0.1" - multiaddr "^8.0.0" - multiaddr-to-uri "^6.0.0" - parse-duration "^0.4.4" - timeout-abort-controller "^1.1.1" - uint8arrays "^1.1.0" - -ipfs-http-client@48.1.3: - version "48.1.3" - resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-48.1.3.tgz#d9b91b1f65d54730de92290d3be5a11ef124b400" - integrity sha512-+JV4cdMaTvYN3vd4r6+mcVxV3LkJXzc4kn2ToVbObpVpdqmG34ePf1KlvFF8A9gjcel84WpiP5xCEV/IrisPBA== - dependencies: - any-signal "^2.0.0" - bignumber.js "^9.0.0" - cids "^1.0.0" - debug "^4.1.1" - form-data "^3.0.0" - ipfs-core-utils "^0.5.4" - ipfs-utils "^5.0.0" - ipld-block "^0.11.0" - ipld-dag-cbor "^0.17.0" - ipld-dag-pb "^0.20.0" - ipld-raw "^6.0.0" - it-last "^1.0.4" - it-map "^1.0.4" - it-tar "^1.2.2" - it-to-stream "^0.1.2" - merge-options "^2.0.0" - multiaddr "^8.0.0" - multibase "^3.0.0" - multicodec "^2.0.1" - multihashes "^3.0.1" - nanoid "^3.1.12" - native-abort-controller "~0.0.3" - parse-duration "^0.4.4" - stream-to-it "^0.2.2" - uint8arrays "^1.1.0" - -ipfs-utils@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-5.0.1.tgz#7c0053d5e77686f45577257a73905d4523e6b4f7" - integrity sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg== - dependencies: - abort-controller "^3.0.0" - any-signal "^2.1.0" - buffer "^6.0.1" - electron-fetch "^1.7.2" - err-code "^2.0.0" - fs-extra "^9.0.1" - is-electron "^2.2.0" - iso-url "^1.0.0" - it-glob "0.0.10" - it-to-stream "^0.1.2" - merge-options "^2.0.0" - nanoid "^3.1.3" - native-abort-controller "0.0.3" - native-fetch "^2.0.0" - node-fetch "^2.6.0" - stream-to-it "^0.2.0" - -ipld-block@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e" - integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw== - dependencies: - cids "^1.0.0" - -ipld-dag-cbor@^0.17.0: - version "0.17.1" - resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1" - integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw== - dependencies: - borc "^2.1.2" - cids "^1.0.0" - is-circular "^1.0.2" - multicodec "^3.0.1" - multihashing-async "^2.0.0" - uint8arrays "^2.1.3" - -ipld-dag-pb@^0.20.0: - version "0.20.0" - resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz#025c0343aafe6cb9db395dd1dc93c8c60a669360" - integrity sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg== - dependencies: - cids "^1.0.0" - class-is "^1.1.0" - multicodec "^2.0.0" - multihashing-async "^2.0.0" - protons "^2.0.0" - reset "^0.1.0" - run "^1.4.0" - stable "^0.1.8" - uint8arrays "^1.0.0" - -ipld-raw@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-6.0.0.tgz#74d947fcd2ce4e0e1d5bb650c1b5754ed8ea6da0" - integrity sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg== - dependencies: - cids "^1.0.0" - multicodec "^2.0.0" - multihashing-async "^2.0.0" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - 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-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-circular@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" - integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== - -is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-electron@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.1.tgz#751b1dd8a74907422faa5c35aaa0cf66d98086e9" - integrity sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - 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.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.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - 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-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-ip@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - -is-ipfs@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-ipfs/-/is-ipfs-1.0.3.tgz#4b8c4995c46beac38f0c05f8cecd77093dd6a6b3" - integrity sha512-7SAfhxp39rxMvr95qjHMtsle1xa7zXpIbhX/Q77iXKtMVnQ0Fr9AVpAUq+bl3HPXGXDpZJFP0hzWBZaMwD6vGg== - dependencies: - buffer "^5.6.0" - cids "~0.8.0" - iso-url "~0.4.7" - mafmt "^7.1.0" - multiaddr "^7.4.3" - multibase "~0.7.0" - multihashes "~0.4.19" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" - integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -iso-constants@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4" - integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ== - -iso-url@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" - integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== - -iso-url@~0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" - integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -it-all@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" - integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== - -it-concat@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-1.0.3.tgz#84db9376e4c77bf7bc1fd933bb90f184e7cef32b" - integrity sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA== - dependencies: - bl "^4.0.0" - -it-glob@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.10.tgz#4defd9286f693847c3ff483d2ff65f22e1359ad8" - integrity sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA== - dependencies: - fs-extra "^9.0.1" - minimatch "^3.0.4" - -it-last@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" - integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== - -it-map@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" - integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== - -it-peekable@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" - integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== - -it-reader@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-2.1.0.tgz#b1164be343f8538d8775e10fb0339f61ccf71b0f" - integrity sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw== - dependencies: - bl "^4.0.0" - -it-tar@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-1.2.2.tgz#8d79863dad27726c781a4bcc491f53c20f2866cf" - integrity sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA== - dependencies: - bl "^4.0.0" - buffer "^5.4.3" - iso-constants "^0.1.2" - it-concat "^1.0.0" - it-reader "^2.0.0" - p-defer "^3.0.0" - -it-to-stream@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-0.1.2.tgz#7163151f75b60445e86b8ab1a968666acaacfe7b" - integrity sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ== - dependencies: - buffer "^5.6.0" - fast-fifo "^1.0.0" - get-iterator "^1.0.2" - p-defer "^3.0.0" - p-fifo "^1.0.0" - readable-stream "^3.6.0" - -iterable-ndjson@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/iterable-ndjson/-/iterable-ndjson-1.1.0.tgz#36f7e8a5bb04fd087d384f29e44fc4280fc014fc" - integrity sha512-OOp1Lb0o3k5MkXHx1YaIY5Z0ELosZfTnBaas9f8opJVcZGBIONA2zY/6CYE+LKkqrSDooIneZbrBGgOZnHPkrg== - dependencies: - string_decoder "^1.2.0" - -jaeger-client@^3.15.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.19.0.tgz#9b5bd818ebd24e818616ee0f5cffe1722a53ae6e" - integrity sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw== - dependencies: - node-int64 "^0.4.0" - opentracing "^0.14.4" - thriftrw "^3.5.0" - uuid "^8.3.2" - xorshift "^1.1.1" - -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== - dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" - -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== - dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" - prompts "^2.0.1" - yargs "^15.4.1" - -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" - chalk "^4.0.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" - -jest-diff@^25.2.1: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" - integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== - dependencies: - chalk "^3.0.0" - diff-sequences "^25.2.6" - jest-get-type "^25.2.6" - pretty-format "^25.5.0" - -jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== - dependencies: - chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== - dependencies: - detect-newline "^3.0.0" - -jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" - -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" - -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -jest-get-type@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" - integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== - -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== - -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^26.6.2" - is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== - dependencies: - chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" - slash "^3.0.0" - stack-utils "^2.0.2" - -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== - dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" - -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" - slash "^3.0.0" - -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" - source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - cjs-module-lexer "^0.6.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^15.4.1" - -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" - chalk "^4.0.0" - expect "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - natural-compare "^1.4.0" - pretty-format "^26.6.2" - semver "^7.3.2" - -jest-util@^26.1.0, jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== - dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" - chalk "^4.0.0" - jest-get-type "^26.3.0" - leven "^3.1.0" - pretty-format "^26.6.2" - -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== - dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^26.6.2" - string-length "^4.0.1" - -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest@26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== - dependencies: - "@jest/core" "^26.6.3" - import-local "^3.0.2" - jest-cli "^26.6.3" - -js-sha3@0.8.0, js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.14.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - 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.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbi@^3.1.1: - version "3.2.5" - resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" - integrity sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ== - -jsdom@^16.4.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - 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.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-ref-parser@9.0.9: - version "9.0.9" - resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#66ea538e7450b12af342fa3d5b8458bc1e1e013f" - integrity sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q== - dependencies: - "@apidevtools/json-schema-ref-parser" "9.0.9" - -json-schema-traverse@^0.4.1: - version "0.4.1" - 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.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.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-text-sequence@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== - dependencies: - delimit-stream "0.1.0" - -json5@2.x, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonschema@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" - integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -lcid@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0" - integrity sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg== - dependencies: - invert-kv "^3.0.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - 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" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -line-column@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" - integrity sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww== - dependencies: - isarray "^1.0.0" - isobject "^2.0.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - 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" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.lowercase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.lowercase/-/lodash.lowercase-4.3.0.tgz#46515aced4acb0b7093133333af068e4c3b14e9d" - integrity sha512-UcvP1IZYyDKyEL64mmrwoA1AbFu5ahojhTtkOUr1K9dbuxzS9ev8i4TxMMGCqRC9TE8uDaSoufNAXxRPNTseVA== - -lodash.lowerfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz#de3c7b12e02c6524a0059c2f6cb7c5c52655a13d" - integrity sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.pad@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" - integrity sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg== - -lodash.padend@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - integrity sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw== - -lodash.padstart@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" - integrity sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw== - -lodash.repeat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.repeat/-/lodash.repeat-4.1.0.tgz#fc7de8131d8c8ac07e4b49f74ffe829d1f2bec44" - integrity sha512-eWsgQW89IewS95ZOcr15HHCX6FVDxq3f2PNUIng3fyzsPev9imFQxIYdFZ6crl8L56UR6ZlGDLcEb3RZsCSSqw== - -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - -lodash.trim@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.trim/-/lodash.trim-4.5.1.tgz#36425e7ee90be4aa5e27bcebb85b7d11ea47aa57" - integrity sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg== - -lodash.trimend@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.trimend/-/lodash.trimend-4.5.1.tgz#12804437286b98cad8996b79414e11300114082f" - integrity sha512-lsD+k73XztDsMBKPKvzHXRKFNMohTjoTKIIo4ADLn5dA65LZ1BqlAvSXhR2rPEC3BgAUQnzMnorqDtqn2z4IHA== - -lodash.trimstart@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz#8ff4dec532d82486af59573c39445914e944a7f1" - integrity sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash.uppercase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.uppercase/-/lodash.uppercase-4.3.0.tgz#c404abfd1469f93931f9bb24cf6cc7d57059bc73" - integrity sha512-+Nbnxkj7s8K5U8z6KnEYPGUOGp3woZbB7Ecs7v3LkkjLQSm2kP9SKIILitN1ktn2mB/tmM9oSlku06I+/lH7QA== - -lodash.upperfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" - integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== - -lodash@4.x, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -long@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" - integrity sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.0.tgz#2696dadf4b4da2ce3f6f6b89186085d94d52fd61" - integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== - -lru-cache@^6.0.0: - version "6.0.0" - 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" - -mafmt@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-7.1.0.tgz#4126f6d0eded070ace7dbbb6fb04977412d380b5" - integrity sha512-vpeo9S+hepT3k2h5iFxzEHvvR0GPBx9uKaErmnRzYNcaKb03DgOArjEMlgG4a9LcuZZ89a3I8xbeto487n26eA== - dependencies: - multiaddr "^7.3.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-age-cleaner@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -mem@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" - integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== - dependencies: - map-age-cleaner "^0.1.3" - mimic-fn "^2.1.0" - p-is-promise "^2.1.0" - -merge-options@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-2.0.0.tgz#36ca5038badfc3974dbde5e58ba89d3df80882c3" - integrity sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ== - dependencies: - is-plain-obj "^2.0.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - 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" - -mime-db@1.52.0: - version "1.52.0" - 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.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.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@*: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - 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.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@1.x, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -moo@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" - integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multiaddr-to-uri@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz#8f08a75c6eeb2370d5d24b77b8413e3f0fa9bcc0" - integrity sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A== - dependencies: - multiaddr "^8.0.0" - -multiaddr@^7.3.0, multiaddr@^7.4.3: - version "7.5.0" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-7.5.0.tgz#976c88e256e512263445ab03b3b68c003d5f485e" - integrity sha512-GvhHsIGDULh06jyb6ev+VfREH9evJCFIRnh3jUt9iEZ6XDbyoisZRFEI9bMvK/AiR6y66y6P+eoBw9mBYMhMvw== - dependencies: - buffer "^5.5.0" - cids "~0.8.0" - class-is "^1.1.0" - is-ip "^3.1.0" - multibase "^0.7.0" - varint "^5.0.0" - -multiaddr@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f" - integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ== - dependencies: - cids "^1.0.0" - class-is "^1.1.0" - dns-over-http-resolver "^1.0.0" - err-code "^2.0.3" - is-ip "^3.1.0" - multibase "^3.0.0" - uint8arrays "^1.1.0" - varint "^5.0.0" - -multibase@^0.7.0, multibase@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@^1.0.0, multibase@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-1.0.1.tgz#4adbe1de0be8a1ab0274328b653c3f1903476724" - integrity sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@^3.0.0, multibase@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f" - integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw== - dependencies: - "@multiformats/base-x" "^4.0.1" - web-encoding "^1.0.6" - -multibase@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" - integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== - dependencies: - "@multiformats/base-x" "^4.0.1" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0, multicodec@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multicodec@^2.0.0, multicodec@^2.0.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-2.1.3.tgz#b9850635ad4e2a285a933151b55b4a2294152a5d" - integrity sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA== - dependencies: - uint8arrays "1.1.0" - varint "^6.0.0" - -multicodec@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.2.1.tgz#82de3254a0fb163a107c1aab324f2a91ef51efb2" - integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== - dependencies: - uint8arrays "^3.0.0" - varint "^6.0.0" - -multiformats@9.7.0, multiformats@^9.4.2: - version "9.7.0" - resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.7.0.tgz#845799e8df70fbb6b15922500e45cb87cf12f7e5" - integrity sha512-uv/tcgwk0yN4DStopnBN4GTgvaAlYdy6KnZpuzEPFOYQd71DYFJjs0MN1ERElAflrZaYyGBWXyGxL5GgrxIx0Q== - -multihashes@^0.4.15, multihashes@~0.4.15, multihashes@~0.4.19: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -multihashes@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-1.0.1.tgz#a89415d68283cf6287c6e219e304e75ce7fb73fe" - integrity sha512-S27Tepg4i8atNiFaU5ZOm3+gl3KQlUanLs/jWcBxQHFttgq+5x1OgbQmf2d8axJ/48zYGBd/wT9d723USMFduw== - dependencies: - buffer "^5.6.0" - multibase "^1.0.1" - varint "^5.0.0" - -multihashes@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-3.1.2.tgz#ffa5e50497aceb7911f7b4a3b6cada9b9730edfc" - integrity sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ== - dependencies: - multibase "^3.1.0" - uint8arrays "^2.0.5" - varint "^6.0.0" - -multihashes@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - -multihashing-async@^2.0.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.4.tgz#26dce2ec7a40f0e7f9e732fc23ca5f564d693843" - integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== - dependencies: - blakejs "^1.1.0" - err-code "^3.0.0" - js-sha3 "^0.8.0" - multihashes "^4.0.1" - murmurhash3js-revisited "^3.0.0" - uint8arrays "^3.0.0" - -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== - -mustache@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2" - integrity sha512-yL5VE97+OXn4+Er3THSmTdCFCtx5hHWzrolvH+JObZnUYwuaG7XV+Ch4fR2cIrcYI0tFHxS7iyFYl14bW8y2sA== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nanoid@^3.1.12, nanoid@^3.1.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -native-abort-controller@0.0.3, native-abort-controller@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-0.0.3.tgz#4c528a6c9c7d3eafefdc2c196ac9deb1a5edf2f8" - integrity sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA== - dependencies: - globalthis "^1.0.1" - -native-abort-controller@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" - integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== - -native-fetch@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-2.0.1.tgz#319d53741a7040def92d5dc8ea5fe9416b1fad89" - integrity sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ== - dependencies: - globalthis "^1.0.1" - -native-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" - integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nearley@^2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" - integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== - dependencies: - commander "^2.19.0" - moo "^0.5.0" - railroad-diagrams "^1.0.0" - randexp "0.4.6" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== - -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-fetch@^2.6.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-notifier@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - -node-releases@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - -noms@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" - integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - 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.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" - integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.2" - 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.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - 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" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - -object.values@^1.1.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - 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.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -opentracing@^0.14.4: - version "0.14.7" - resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.7.tgz#25d472bd0296dc0b64d7b94cbc995219031428f5" - integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -ora@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.0.tgz#374c4ee8c5fb91b5dbcd82de199f188d3e8fd5ec" - integrity sha512-2RaV0LWJgpWEjvpsW57H8pnzdVQJrtAr4VGk9cIqn58ePx5k1b0H3h9DS2Qj4cL1Cm012JSeg+7AcVNsis6AVQ== - dependencies: - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-spinners "^2.2.0" - is-interactive "^1.0.0" - log-symbols "^3.0.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - -ora@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.1.1.tgz#566cc0348a15c36f5f0e979612842e02ba9dddbc" - integrity sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A== - dependencies: - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-spinners "^2.2.0" - is-interactive "^1.0.0" - log-symbols "^3.0.0" - mute-stream "0.0.8" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-locale@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-5.0.0.tgz#6d26c1d95b6597c5d5317bf5fba37eccec3672e0" - integrity sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA== - dependencies: - execa "^4.0.0" - lcid "^3.0.0" - mem "^5.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== - -p-defer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" - integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== - -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - -p-fifo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" - integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== - dependencies: - fast-fifo "^1.0.0" - p-defer "^3.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - -p-is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - 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.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.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.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-try@^1.0.0: - version "1.0.0" - 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.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - 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-duration@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" - integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-json@^5.0.0: - version "5.2.0" - 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" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-exists@^3.0.0: - version "3.0.0" - 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.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.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== - dependencies: - pify "^2.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - 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.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -polywrap@0.3.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/polywrap/-/polywrap-0.3.0.tgz#a01c705449ad764b69c8d79468f30cd704a42eb3" - integrity sha512-9B/zTjG64V4PomyIAd9XOY6lkE8FaNPAHfGIMqVrOK+ceLk/aZ/STHsg6hzqnS1+eqt0dSlKhr6S1s655+3VcA== - dependencies: - "@ethersproject/providers" "5.6.8" - "@ethersproject/wallet" "5.6.2" - "@formatjs/intl" "1.8.2" - "@polywrap/asyncify-js" "0.3.0" - "@polywrap/client-js" "0.3.0" - "@polywrap/core-js" "0.3.0" - "@polywrap/ens-resolver-plugin-js" "0.3.0" - "@polywrap/ethereum-plugin-js" "0.3.0" - "@polywrap/ipfs-plugin-js" "0.3.0" - "@polywrap/msgpack-js" "0.3.0" - "@polywrap/os-js" "0.3.0" - "@polywrap/polywrap-manifest-types-js" "0.3.0" - "@polywrap/schema-bind" "0.3.0" - "@polywrap/schema-compose" "0.3.0" - "@polywrap/schema-parse" "0.3.0" - "@polywrap/test-env-js" "0.3.0" - "@polywrap/wrap-manifest-types-js" "0.3.0" - assemblyscript "0.19.1" - axios "0.21.2" - chalk "4.1.0" - chokidar "3.5.1" - commander "9.2.0" - content-hash "2.5.2" - copyfiles "2.4.1" - docker-compose "0.23.17" - fs-extra "9.0.1" - gluegun "4.6.1" - graphql-tag "2.11.0" - ipfs-http-client "48.1.3" - js-yaml "3.14.0" - jsonschema "1.4.0" - mustache "4.0.1" - ora "4.0.0" - os-locale "5.0.0" - regex-parser "2.2.11" - rimraf "3.0.2" - typescript "4.0.7" - ws "7.3.1" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - 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.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" - integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== - -pretty-format@^25.2.1, pretty-format@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - -pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725" - integrity sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - -protons@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.3.tgz#94f45484d04b66dfedc43ad3abff1e8907994bb2" - integrity sha512-j6JikP/H7gNybNinZhAHMN07Vjr1i4lVupg598l4I9gSTjJqOvKnwjzYX2PzvBTSVf2eZ2nWv4vG+mtW8L6tpA== - dependencies: - protocol-buffers-schema "^3.3.1" - signed-varint "^2.0.1" - uint8arrays "^3.0.0" - varint "^5.0.0" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -pull-stream-to-async-iterator@^1.0.1, pull-stream-to-async-iterator@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pull-stream-to-async-iterator/-/pull-stream-to-async-iterator-1.0.2.tgz#5cc1a3a146ef6bbf01c17755647369b683b24986" - integrity sha512-c3KRs2EneuxP7b6pG9fvQTIjatf33RbIErhbQ75s5r2MI6E8R74NZC1nJgXc8kcmqiQxmr+TWY+WwK2mWaUnlA== - dependencies: - pull-stream "^3.6.9" - -pull-stream@^3.6.9: - version "3.6.14" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" - integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -railroad-diagrams@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" - integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A== - -ramda@^0.24.1: - version "0.24.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" - integrity sha512-HEm619G8PaZMfkqCa23qiOe7r3R0brPu7ZgOsgKUsnvLhd0qhc/vTjkUovomgPWa5ECBa08fJZixth9LaoBo5w== - -ramdasauce@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ramdasauce/-/ramdasauce-2.1.3.tgz#acb45ecc7e4fc4d6f39e19989b4a16dff383e9c2" - integrity sha512-Ml3CPim4SKwmg5g9UI77lnRSeKr/kQw7YhQ6rfdMcBYy6DMlwmkEwQqjygJ3OhxPR+NfFfpjKl3Tf8GXckaqqg== - dependencies: - ramda "^0.24.1" - -randexp@0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" - integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== - dependencies: - discontinuous-range "1.0.0" - ret "~0.1.10" - -react-is@^16.12.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - 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" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@~3.5.0: - version "3.5.0" - 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" - -receptacle@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" - integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== - dependencies: - ms "^2.1.1" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regex-parser@2.2.11: - version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-directory@^2.1.1: - version "2.1.1" - 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.2: - version "2.0.2" - 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.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -reset@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb" - integrity sha512-RF7bp2P2ODreUPA71FZ4DSK52gNLJJ8dSwA1nhOCoC0mI4KZ4D/W6zhd2nfBqX/JlR+QZ/iUqAYPjq1UQU8l0Q== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0: - version "1.22.1" - 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" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retimer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" - integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -run-parallel@^1.1.9: - version "1.2.0" - 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" - -run@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/run/-/run-1.4.0.tgz#e17d9e9043ab2fe17776cb299e1237f38f0b4ffa" - integrity sha512-962oBW07IjQ9SizyMHdoteVbDKt/e2nEsnTRZ0WjK/zs+jfQQICqH0qj0D5lqZNuy0JkbzfA6IOqw0Sk7C3DlQ== - dependencies: - minimatch "*" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@7.x, semver@^7.0.0, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - 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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signed-varint@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" - integrity sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw== - dependencies: - varint "~5.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.17, source-map-support@^0.5.20, source-map-support@^0.5.6: - version "0.5.21" - 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" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -spawn-command@0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-to-it@^0.2.0, stream-to-it@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" - integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== - dependencies: - get-iterator "^1.0.2" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-template@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" - integrity sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw== - -string-width@^2.1.1: - version "2.1.1" - 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" - strip-ansi "^4.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - 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" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string_decoder@^1.1.1, string_decoder@^1.2.0: - version "1.3.0" - 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" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^4.0.0: - version "4.0.0" - 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@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - 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.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - 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.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-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -table@^6.0.4, table@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thriftrw@^3.5.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/thriftrw/-/thriftrw-3.12.0.tgz#30857847755e7f036b2e0a79d11c9f55075539d9" - integrity sha512-4YZvR4DPEI41n4Opwr4jmrLGG4hndxr7387kzRFIIzxHQjarPusH4lGXrugvgb7TtPrfZVTpZCVe44/xUxowEw== - dependencies: - bufrw "^1.3.0" - error "7.0.2" - long "^2.4.0" - -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -timeout-abort-controller@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" - integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== - dependencies: - abort-controller "^3.0.0" - retimer "^2.0.0" - -tiny-invariant@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== - -tiny-warning@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - 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" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" - integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-invariant@^0.4.0: - version "0.4.4" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" - integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== - dependencies: - tslib "^1.9.3" - -ts-jest@26.5.4: - version "26.5.4" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.4.tgz#207f4c114812a9c6d5746dd4d1cdf899eafc9686" - integrity sha512-I5Qsddo+VTm94SukBJ4cPimOoFZsYTeElR2xy6H2TOVs+NsvgYglW8KuQgKoApOKuaU/Ix/vrF9ebFZlb5D2Pg== - dependencies: - bs-logger "0.x" - buffer-from "1.x" - fast-json-stable-stringify "2.x" - jest-util "^26.1.0" - json5 "2.x" - lodash "4.x" - make-error "1.x" - mkdirp "1.x" - semver "7.x" - yargs-parser "20.x" - -ts-mixer@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-5.4.1.tgz#b90db9ced48531aa17ce9184a2890d1e3c99b1e5" - integrity sha512-Zo9HgPCtNouDgJ+LGtrzVOjSg8+7WGQktIKLwAfaNrlOK1mWGlz1ejsAF/YqUEqAGjUTeB5fEg8gH9Aui6w9xA== - -ts-node@8.10.2: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== - dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -tsconfig-paths@^3.9.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0, tslib@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tsutils@^3.17.1: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - 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-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - 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.21.3: - version "0.21.3" - 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.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.7.tgz#7168032c43d2a2671c95c07812f69523c79590af" - integrity sha512-yi7M4y74SWvYbnazbn8/bmJmX4Zlej39ZOqwG/8dut/MYoSQ119GY9ZFbbGsD4PFZYWxqik/XsP3vk3+W5H3og== - -uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" - integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA== - dependencies: - multibase "^3.0.0" - web-encoding "^1.0.2" - -uint8arrays@^2.0.5, uint8arrays@^2.1.3: - version "2.1.10" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" - integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== - dependencies: - multiformats "^9.4.2" - -uint8arrays@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.0.0.tgz#260869efb8422418b6f04e3fac73a3908175c63b" - integrity sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA== - dependencies: - multiformats "^9.4.2" - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -update-browserslist-db@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" - integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.12.3: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - -uuid@8.3.2, uuid@^8.3.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -v8-to-istanbul@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - -visitor-as@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/visitor-as/-/visitor-as-0.6.0.tgz#b0cca3c918bd9d396545faf08529d2b9ba968a40" - integrity sha512-4WcnwCLXWjhNkwJj9gSqh46sdIv9CyIvnSuwr61OOfrGCtN2mKcW5KE828OeEr1rYjEy0Z/CIdPBJKJRLsUgDA== - dependencies: - lodash.clonedeep "^4.5.0" - ts-mixer "^5.4.1" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web-encoding@^1.0.2, web-encoding@^1.0.6: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which-typed-array@^1.1.2: - version "1.1.8" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" - integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.9" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.0, which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - 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" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - 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" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== - -ws@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== - -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@^7.4.6: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xorshift@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/xorshift/-/xorshift-1.2.0.tgz#30a4cdd8e9f8d09d959ed2a88c42a09c660e8148" - integrity sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g== - -xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - 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.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@20.x, 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@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" - integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^18.1.2: - version "18.1.3" - 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@^15.4.1: - version "15.4.1" - 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" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^16.1.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -zen-observable-ts@^0.8.21: - version "0.8.21" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" - integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== - dependencies: - tslib "^1.9.3" - zen-observable "^0.8.0" - -zen-observable@^0.8.0: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== - -zone.js@^0.11.0: - version "0.11.6" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.11.6.tgz#c7cacfc298fe24bb585329ca04a44d9e2e840e74" - integrity sha512-umJqFtKyZlPli669gB1gOrRE9hxUUGkZr7mo878z+NEBJZZixJkKeVYfnoLa7g25SseUDc92OZrMKKHySyJrFg== - dependencies: - tslib "^2.3.0" diff --git a/protocol/ethereum/uniswapv3/wrapper/.eslintrc.js b/protocol/ethereum/uniswapv3/wrapper/.eslintrc.js deleted file mode 100644 index 0cfc9e62c..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/.eslintrc.js +++ /dev/null @@ -1,73 +0,0 @@ -module.exports = { - root: true, - env: { - es6: true, - node: true, - mocha: true - }, - ignorePatterns: ["**/wrap/**/*.ts", "**/__tests__/**/*.*"], - parser: "@typescript-eslint/parser", - parserOptions: { - ecmaVersion: "es2019", - tsconfigRootDir: __dirname, - project: ['./tsconfig.json'], - }, - plugins: [ - "eslint-plugin-import", - "@typescript-eslint", - "prettier" - ], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - rules: { - "prettier/prettier": ["error"], - "@typescript-eslint/explicit-module-boundary-types": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-unused-vars": ["error", { - "varsIgnorePattern": "^_", - "argsIgnorePattern": "^_", - }], - "@typescript-eslint/no-floating-promises": "error", - "import/order": [ - "error", - { - "groups": [["index", "sibling", "parent", "internal"], ["external", "builtin"], "object"], - "newlines-between": "always" - } - ], - "import/no-extraneous-dependencies": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/member-ordering": "off", - "@typescript-eslint/naming-convention": ["error", - {selector: "default", format: ['camelCase']}, - {selector: ["objectLiteralProperty", "parameterProperty", "classMethod"], format: ['camelCase'], leadingUnderscore: "allow"}, - //variable must be in camel or upper case - {selector: ["classProperty", "variable"], format: ["camelCase", "UPPER_CASE"], leadingUnderscore: "allow"}, - //classes and types must be in PascalCase - {selector: ["typeLike", "enum"], format: ['PascalCase']}, - {selector: ["parameter"], format: ['snake_case', "camelCase"], leadingUnderscore: "allow"}, - {selector: "enumMember", format: null}, - {selector: "function", format: null, leadingUnderscore: "allowSingleOrDouble"}, - ], - }, - "overrides": [ - { - "files": ["**/__tests__/**/*.ts", "*.spec.ts"], - "rules": { - "import/no-extraneous-dependencies": "off" - } - }, - { - "files": ["*.d.ts"], - "rules": { - "@typescript-eslint/triple-slash-reference": "off" - } - } - ] -}; \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/.gitignore b/protocol/ethereum/uniswapv3/wrapper/.gitignore deleted file mode 100644 index 0d61db80a..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules -build -yarn-error.log -coverage -.vscode -*.log -wrap -.polywrap -.DS_Store -report.* -.env \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/.nvmrc b/protocol/ethereum/uniswapv3/wrapper/.nvmrc deleted file mode 100644 index 5dbac1ed0..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v16.13.0 \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/.prettierrc b/protocol/ethereum/uniswapv3/wrapper/.prettierrc deleted file mode 100644 index 91330bc78..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/.prettierrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "printWidth": 80, - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": false, - "quoteProps": "as-needed", - "trailingComma": "es5", - "bracketSpacing": true, - "arrowParens": "always", - "endOfLine": "auto" -} diff --git a/protocol/ethereum/uniswapv3/wrapper/README.md b/protocol/ethereum/uniswapv3/wrapper/README.md deleted file mode 100644 index 32f51fd2a..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/README.md +++ /dev/null @@ -1,386 +0,0 @@ -### How to add network support - -In the common case, adding support for a new chain is easy. -You will need the address of the chain's WETH contract. -1. Add network to ChainId enum in `src/schema.graphql` -2. Update `_getWeth` in `src/token/utils.ts` -3. If chain has its own native token, update `_getNative`, `_isNative`, and `_wrapToken` in `src/token/utils.ts` -4. Update tests in `src/__tests__/unit/utils/tokenUtils.spec.ts` - -# The Uniswap v3 Wrapper - -Reference documentation for the Uniswap v3 wrapper is located at https://docs.polywrap.io/uniswapv3/intro. - -The Uniswap v3 wrapper is a Polywrap-compatible API providing the same features as Uniswap's JavaScript SDK, plus more. The wrapper is written in AssemblyScript and compiled to Web Assembly (WASM). Polywrap's JavaScript Client makes interfacing with the wrapper as easy as interfacing with any ordinary JavaScript SDK. - -Polywrap wrappers are user-friendly, secure, scalable, and infinitely composable. They are designed to be seamlessly upgradeable and truly multi-platform. They are better SDK's. - -While the first Polywrap Client is written in JavaScript, future clients will be written for languages like Rust, Python, and Kotlin. Once written, a wrapper can be used with any Polywrap Client. - - -## The Polywrap Toolchain - -Polywrap's core toolchain consists of a development environment for writing API's and a Client to interface with them. - -The Polywrap Client handles URI resolution and API method invocations. It downloads and caches the API at runtime, loads a Web Assembly runtime, makes the requested API call, and returns the result in the Client's native language. All of this happens "under the hood". Users have a familiar development experience so they can focus on their applications. - -Polywrap wrappers are written in a supported language--currently AssemblyScript and Rust--and compiled to WASM. Wrappers can interact with each other seamlessly, irrespective of their source language. Wrapper calls are stateless and sandboxed for unprecedented security. And they are fast! - -Polywrap plugins are written in a Client's native language to extend the Client's functionality. Wrappers can interact with plugins as though they were wrappers, and the plugin development experience is similar to that of wrappers. However, plugins do not have wrappers' special qualities. Because WASM modules are sandboxed, wrappers cannot directly interact with the browser, the filesystem, or networks. Plugins were conceived to handle these tasks securely. - -Polywrap is a new paradigm. Integrating a WASM module into an application used to be a clunky and complex effort. Polywrap makes the WASM user experience *really good*. - -## From SDK to Wrapper with Uniswap v3 - -"Yeah, Poywrap is cool, but what about our traditional SDK?" - -If something like this crossed your mind, we've got you covered. Porting a JavaScript SDK to a wrapper is fairly straightforward. This section describes how we did it for Uniswap. - -When writing the Uniswap v3 wrapper, our goal was to provide the same user experience as the SDK. The wrapper provides feature-parity and the "business logic" is the same. We ported elements of the Uniswap SDK Core package as necessary to implement the v3 wrapper. - -### Project scaffolding - -The best way to set up a Polywrap project is to start with one of the project templates available in the Polywrap CLI. The `w3 create` command lets you bootstrap your project structure without effort. - -The initial project setup includes a `mutation` folder and a `query` folder within `src`, which correspond to the two types of modules a wrapper can have. - -It also includes a `web3api.yaml` manifest file, a `web3api.build.yaml` build manifest file, and a `web3api.meta.yaml` meta manaifest file. The `web3api.yaml` manifest tells the Polywrap CLI what language your wrapper is in, where your module schemas are located, and more. Our `web3api.yaml` looked like this: - -```yaml -format: 0.0.1-prealpha.5 -build: ./web3api.build.yaml -meta: ./web3api.meta.yaml -language: wasm/assemblyscript -modules: - mutation: - schema: ./src/mutation/schema.graphql - module: ./src/mutation/index.ts - query: - schema: ./src/query/schema.graphql - module: ./src/query/index.ts -``` - -The build manifest lets you customize the build process. The meta manifest lets you add meta-data to your project, like a description and a link to your repo. - -For the Uniswap v3 wrapper, we left the `web3api.yaml` manifest and the build manifest unchanged. We added detail to the meta manifest much later, when wrapper development was largely complete. - -### Writing the interface in a GraphQL Schema - -We started by reading through the entire Uniswap v3 JavaScript SDK repo on GitHub to record all the types and methods we would reproduce, and to take note of their interactions. The interface of a Polywrap API is declared in a GraphQL schema. We wrote a schema type for each externally-facing class in the SDK, with properties that matched those in the class with public access. We wrote a method declaration in the schema for each externally-facing function and class method in the SDK. We even copied over the SDK's inline documentation to fill the schema with context. - -```graphql -#An abridged look at our schema - -"""ERC20-compliant token or Ether""" -type Token { - """Id of chain where token exists""" - chainId: ChainId! - """Address of token's ERC20 contract""" - address: String! - """Token description""" - currency: Currency! -} - -type Query { - """Returns true if the tokens are equivalent, false otherwise""" - tokenEquals( - tokenA: Token! - tokenB: Token! - ): Boolean! - - """Returns true if the address of tokenA would precede the address of token B when sorted alphabetically""" - tokenSortsBefore( - tokenA: Token! - tokenB: Token! - ): Boolean! -} -``` - -A wrapper can have two modules: a `query` module and a `mutation` module. Each module has its own schema that, along with a an optional `common` schema for shared types, are combined at build time. The difference between mutations and queries is simple: mutations modify state--this typically means blockchain state in web3 applications--while queries do not. The Uniswap v3 SDK does not modify on-chain state, so all of its functionality was placed in the `query` module schema. - -The first draft of the Uniswap v3 wrapper's schema was written in just a few hours, though it was revised during development to fix mistakes and improve the user experience. - -### Implementing the first functions - -When porting an SDK, it's important to understand its project structure. The organization of the SDK's soure code can indicate how wrapper development should proceed. Development should allow for iterative changes and testing. - -The Unsiwap v3 SDK can be mentally modularized into a roughly linear set of dependent components. We can start with the concept of a `Token`, which is the component of a `CurrencyAmount` and a `Pool`. A `Route` is a set of pools and currencies. A `Trade` is constructed from two currency amounts and one or more routes. Based on this pattern, it made sense for us to start with `Token`. - -In Uniswap's JavaScript SDK, Token has properties like `chainId` and `address`, as well as two class methods: `equals` and `sortsBefore`. -```typescript -// Methods found in the Token class in Uniswap's SDK Core package - -public equals(other: Currency): boolean { - return other.isToken && this.chainId === other.chainId && this.address === other.address -} - -public sortsBefore(other: Token): boolean { - invariant(this.chainId === other.chainId, 'CHAIN_IDS') - invariant(this.address !== other.address, 'ADDRESSES') - return this.address.toLowerCase() < other.address.toLowerCase() -} -``` - -Using the Polywrap CLI's `codegen` command, we generated AssemblyScript classes corresponding to each type we defined in the schema. This was as simple as typing `w3 codegen`. The classes work like TypeScript interfaces (statically typed JavaScript objects) that include some boilerplate serialization logic. When you declare a function in your schema that returns a custom type or accepts one as an argument, these generated classes are used as the AssemblyScript analogs. - -The `codegen` command simulatenously generates another flavor of AssemblyScript class: function inputs. An `Input_*` class is generated for each function, where `*` is the name of the function. The classes have properties corresponding to the arguments defined in the schema. These `Input_*` classes are used as inputs to the functions declared in the GraphQL schema. - -The Polywrap CLI places the generated files in directories named `w3`, which can be found within each module folder (as declared in your `web3api.yaml` manifest). From there you can implement and use them. - -Once we generated the classes, we imported the generated types and implemented the functions just as we found them in the Uniswap SDK. The function signatures match the schema definitions we declared earlier. - - -```typescript -// An abridged copy of src/query/token.ts in the Uniswap v3 wrapper - -import { - Input_tokenEquals, - Input_tokenSortsBefore, - Token, -} from "./w3"; - -// Checks if the current instance is equal to another (has an identical chainId and address). -export function tokenEquals(input: Input_tokenEquals): boolean { - const tokenA: Token = input.tokenA; - const tokenB: Token = input.tokenB; - return tokenA.chainId == tokenB.chainId && tokenA.address == tokenB.address; -} - -// Checks if the current instance sorts before another, by address. -export function tokenSortsBefore(input: Input_tokenSortsBefore): boolean { - const tokenA: Token = input.tokenA; - const tokenB: Token = input.tokenB; - const tokenAddress: string = tokenA.address.toLowerCase(); - const otherAddress: string = tokenB.address.toLowerCase(); - return tokenAddress.localeCompare(otherAddress) < 0; -} -``` - -After implementing the token functions, it was possible to build the project (after commenting out methods in the schema that had not yet been implemented) and write the first automated tests. - -### Importing plugins and wrappers - -The Uniswap v3 wrapper imports external dependencies to help it with certain tasks. A wrapper can import other wrappers or plugins. - -One of the most important dependencies we used is Polywrap's Ethereum plugin. The Ethereum plugin is based on the popular `ethers.js` package. It can be used to prepare and send Ethereum transactions in much the same way. - -Although the Uniswap v3 JavaScript SDK does not include methods that mutate state on the Ethereum blockchain, several of its functions do return encoded Ethereum transaction calldata that can be sent to Uniswap's on-chain smart contracts. The SDK uses `ethers.js` to encode calldata. We can do the same with the Ethereum plugin. - -Our `src/query/schema.graphql` schema declares several imports at the top of the file. Among these is the Ethereum plugin, which is included in the Polywrap client by default. - -```graphql -#import { Query } into Ethereum from "w3://ens/ethereum.web3api.eth" -#import { Query } into SHA3 from "w3://ens/sha3.web3api.eth" -#import { Query } into ERC20 from "w3://ipfs/QmeiPWHe2ixfitcgjRwP5AaJD5R7DbsGhQNQwT4rFNyxx8" -#import { Query } into Subgraph from "w3://ipfs/QmcnrHegojMFqHkRhixazY67Zb9mSbMLv6sSxyDpUtnrQS" -#import { ChainId, TradeType, Currency, Token, Price, TokenAmount, Tick, Pool, FeeAmount, Route, TradeSwap, Trade, BestTradeOptions, Position, PermitOptions, FeeOptions, SwapOptions, MethodParameters, MintAmounts } from "../common/schema.graphql" -``` - -Wrappers and plugins are queried at URIs. When a user wants to call an API function with the Polywrap Client, they use a URI to tell the Client which API they are calling. The URI's are also used to import wrapper dependencies. Even though the Ethereum plugin is a JavaScript package that gets loaded into memory, it is still queried at a URI that is redirected and resolved to the in-memory instance. - -Once imports are declared, we can run the `codegen` command of the Polywrap CLI to generate imported modules and types. The imported module class includes all of the methods declared in its own GraphQL schema. If we want to know what's in it, we might look there first. - -We used the Ethereum plugin's `encodeFunction` method to encode calldata for Uniswap's Multicall smart contract. -```typescript -// An abridged copy of src/query/routerUtils.ts in the Uniswap v3 wrapper - -import { - Ethereum_Query, - Input_encodeMulticall, -} from "./w3"; - -export function encodeMulticall(input: Input_encodeMulticall): string { - const calldatas: string[] = input.calldatas; - return calldatas.length == 1 - ? calldatas[0] - : Ethereum_Query.encodeFunction({ - method: - "function multicall(bytes[] calldata data) external payable returns (bytes[] memory results)", - args: ['["' + calldatas.join('", "') + '"]'], - }).unwrap(); -} -``` - -### Using base schema types - -Polywrap schemas support additional default types beyond those found in standard GraphQL. The `BigInt` type is used in the Uniswap v3 wrapper to represent integers larger than 32 bits. Since Ethereum supports unsigned integers as large as 256 bits, we needed to support them as well. - -```graphql -"""An amount of a token""" -type TokenAmount { - """Token""" - token: Token! - """Raw amount of the token, not adjusted for the token's decimals""" - amount: BigInt! -} -``` - -The `BigInt` type looks like a standard GraphQL type in the schema. In AssemblyScript, the type is received as an instance of the `BigInt` class from in the [as-bigint](https://github.com/polywrap/as-bigint) AssemblyScript package. - -```typescript -// compares two TokenAmount types for equality, returning true if they have the -// same token and same amount -export function tokenAmountEquals(input: Input_tokenAmountEquals): boolean { - const amtA: TokenAmount = input.tokenAmountA; - const amtB: TokenAmount = input.tokenAmountB; - return ( - tokenEquals({ tokenA: amtA.token, tokenB: amtB.token }) && - amtA.amount.eq(amtB.amount) - ); -} -``` - -Other base schema types include `BigNumber`, `JSON`, and `Map`. These types, along with `BigInt`, can be imported directly into AssemblyScript modules from the `web3api/wasm` package. - -### Testing - -We adapted all of the tests in Uniswap's SDK to work with the wrapper. This ensured that the wrapper met at least the same standards of quality the Uniswap team expected of their SDK. The Uniswap team tested their SDK with artificial data that allowed them to calculate the expected results and compare those results to the outputs of their code. We used the same test cases and expected the same results from our wrapper. - -We also wrote tests based on real-world data, using a fork of the Ethereum Mainnet network, to compare the results of our wrapper queries with results produced by the SDK. This helped us test the wrapper with input of greater complexity. - -We wrote automated tests using two different testing frameworks: `as-pect` and `jest`. - -#### AssemblyScript tests with as-pect - -`as-pect` is an AssemblyScript testing framework, and that is why we used it. Unit tests written in the native language of the wrapper can be used to test classes and functions that are written to support the main wrapper code. This reduces the layers of complexity that would be associated with testing only the functions declared in our GraphQL schema. - -For example, we wrote a `PriorityQueue` class to sort trades for the `bestTradeExactIn` and `bestTradeExactOut` functions. We used `as-pect` to test it. This simplified testing and debugging for`bestTradeExactIn` and `bestTradeExactOut`. - -We wrote many of our other tests in `as-pect` as well, in part because it was straightforward to copy and paste test scripts from the Uniswap v3 SDK repo and adapt the syntax. - -One quirk with `as-pect` is that the following must be added to its configuration file to get it working with Polywrap. - -```json -imports: { - w3: { - __w3_invoke_args: () => {}, - __w3_invoke_result: () => {}, - __w3_invoke_error: () => {}, - __w3_subinvoke: () => {}, - __w3_subinvoke_result: () => {}, - __w3_subinvoke_result_len: () => {}, - __w3_subinvoke_error: () => {}, - __w3_subinvoke_error_len: () => {}, - __w3_abort: () => {}, - } -}, -``` - -#### End-to-end tests in JavaScript with Jest - -Not all tests can be written in the wrapper's native language, nor should they be. Code that depends on other wrappers or plugins must be tested by making calls to the Polywrap Client. The Client coordinates inter-API communication. - -We wrote many of our most important tests in the popular JavaScript framework `jest`. Were we to write the Uniswap v3 wrapper again, we would actually use a lot less `as-pect` and a lot more `jest`. - -One advantage of testing with `jest` is that it requires developers to make calls in the same way users of their wrappers are likely to make them. A disadvantage is that it requires developers to set up the Polywrap client and a test environment, which is easy but takes more time. - -#### Setting up a Polywrap test environment in JavaScript - -Setting up the Client is easy if you only need the default plugins and plan to use a standard Polywrap test environment. - -The `@web3api/test-env-js` package includes functions for starting and stopping a Polywrap test environment programmatically. The test environment has the following: -* A standard Ganache Ethereum test chain at "http://localhost:8545" -* A Ganache Ethereum mainnet fork test chain at "http://localhost:8546" -* An IPFS node at * A Ganache Ethereum test chain at "http://localhost:5001" - -It also sets up an ENS contract at initialization so you can build wrappers and deploy them to an ENS URI on your locally hosted testnet. - -We created a helper function that takes some network information as inputs and returns a Client config. - -```typescript -export function getPlugins(ethereum: string, ipfs: string, ensAddress: string): ClientConfig { - return { - redirects: [], - plugins: [ - { - uri: "w3://ens/ipfs.web3api.eth", - plugin: ipfsPlugin({ provider: ipfs }), - }, - { - uri: "w3://ens/ens.web3api.eth", - plugin: ensPlugin({ addresses: { testnet: ensAddress } }), - }, - { - uri: "w3://ens/ethereum.web3api.eth", - plugin: ethereumPlugin({ - networks: { - testnet: { - provider: ethereum - }, - MAINNET: { - provider: "http://localhost:8546" // Ganache mainnet fork - }, - }, - defaultNetwork: "testnet" - }), - }, - ], - }; -} -``` - -And then we put some boilerplate code in each of our `jest` test files to start the test environment, intantiate the client, build the api, and deploy it to the test environment's IPFS/ENS infrastructure. - -```typescript -import { ClientConfig, Web3ApiClient } from "@web3api/client-js"; -import { buildAndDeployApi, initTestEnvironment, stopTestEnvironment } from "@web3api/test-env-js"; -import { getPlugins } from "../testUtils"; - -describe('Wrapper Test', () => { - - let client: Web3ApiClient; - let ensUri: string; - - beforeAll(async () => { - // initialize test environment - const { ethereum: testEnvEtherem, ensAddress, ipfs } = await initTestEnvironment(); - // get client - const config: ClientConfig = getPlugins(testEnvEtherem, ipfs, ensAddress); - client = new Web3ApiClient(config); - // deploy api - const apiPath: string = path.resolve(__dirname + "/../../../../"); - const api = await buildAndDeployApi(apiPath, ipfs, ensAddress); - ensUri = `ens/testnet/${api.ensDomain}`; - }); - - afterAll(async () => { - await stopTestEnvironment(); - }); -``` - -#### Other tips for testing in JavaScript - -The Polywrap CLI can automatically generate TypeScript types using the `w3 app` command. The types mirror those declared in your GraphQL schema. - -If you love brevity, we can also recommend writing functions that "wrap" your wrapper calls. This can make your tests a bit easier to read. - -```typescript -// This function lets us call the createRoute function in the Uniswap v3 wrapper with one line of code -export async function createRoute(client: Web3ApiClient, ensUri: string, pools: Pool[], inToken: Token, outToken: Token): Promise { - const query = await client.invoke({ - uri: ensUri, - module: "query", - method: "createRoute", - input: { - pools, - inToken, - outToken, - }, - }); - if (query.error) { - throw query.error; - } - return query.data!; -} - -// example usage -const route_0_1: Route = await createRoute(client, ensUri, [pool_0_1], token0, token1); -``` -### Documentation - -As a final touch, we generated ample documentation for the Uniswap v3 wrapper. - -Polywrap's GraphQL parser can read documentation comments (comments with triple quotes) from the wrapper's GraphQL schema. Using this capability, Polywrap built a tool to help developers create documentation for their wrappers. - -The Polywrap CLI will soon be able to use GraphQL schemas to automatically generate markdown that is compatible with popular documentation tools like Docusaurus. We tested the tool to generate the reference documentation found at https://docs.polywrap.io/uniswapv3/intro. - diff --git a/protocol/ethereum/uniswapv3/wrapper/as-pect.config.js b/protocol/ethereum/uniswapv3/wrapper/as-pect.config.js deleted file mode 100644 index f9ba0bdda..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/as-pect.config.js +++ /dev/null @@ -1,73 +0,0 @@ -module.exports = { - /** - * A set of globs passed to the glob package that qualify typescript files for testing. - */ - include: ["src/__tests__/unit/**/*.spec.ts"], - /** - * A set of globs passed to the glob package that qualify files to be added to each test. - */ - add: ["src/__tests__/unit/**/*.include.ts"], - /** - * A set of regexp that will disclude source files from testing. - */ - disclude: [/node_modules|e2e|.polywrap/], - /** - * All the compiler flags needed for this test suite. Make sure that a binary file is output. - */ - flags: { - // "--debug": [], - /** This is required. Do not change this. The filename is ignored, but required by the compiler. */ - "--binaryFile": ["output.wasm"], - /** To enable wat file output, use the following flag. The filename is ignored, but required by the compiler. */ - // "--textFile": ["output.wat"], - "--runtime": ["stub"], // Acceptable values are: full, half, stub (arena), and none, - "--baseDir": process.cwd() - }, - /** Output the binary wasm file: [testname].spec.wasm */ - outputBinary: false, - /** - * Add your required AssemblyScript imports here. - */ - imports: { - wrap: { - __wrap_invoke_args: () => {}, - __wrap_invoke_result: () => {}, - __wrap_invoke_error: () => {}, - __wrap_subinvoke: () => {}, - __wrap_subinvoke_result: () => {}, - __wrap_subinvoke_result_len: () => {}, - __wrap_subinvoke_error: () => {}, - __wrap_subinvoke_error_len: () => {}, - __wrap_abort: () => {}, - } - }, - /** - * All performance statistics reporting can be configured here. - */ - performance: { - /** Enable performance statistics gathering. */ - enabled: true, - /** Set the maximum number of samples to run for each test. */ - maxSamples: 10000, - /** Set the maximum test run time in milliseconds. */ - maxTestRunTime: 2000, - /** Set the number of decimal places to round to. */ - roundDecimalPlaces: 3, - /** Report the median time in the default reporter. */ - reportMedian: true, - /** Report the average time in milliseconds. */ - reportAverage: true, - /** Report the standard deviation. */ - reportStandardDeviation: false, - /** Report the maximum run time in milliseconds. */ - reportMax: false, - /** Report the minimum run time in milliseconds. */ - reportMin: false, - /** Report the variance. */ - reportVariance: false, - }, - /** - * To create your own custom reporter, please check out the Core API. - */ - // reporter: new CustomReporter(), -}; diff --git a/protocol/ethereum/uniswapv3/wrapper/config.ts b/protocol/ethereum/uniswapv3/wrapper/config.ts deleted file mode 100644 index 296c823be..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { PolywrapClientConfig } from '@polywrap/client-js' - -export async function getClientConfig(_: Partial): Promise> { - return { - envs: [ - { - uri: "wrap://ens/ipfs.polywrap.eth", - env:{ - provider: "https://ipfs.wrappers.io", - fallbackProviders: ["https://ipfs.io", "http://localhost:48084", "http://127.0.0.1:45005"], - }, - }, - ], - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/docker-compose.yaml b/protocol/ethereum/uniswapv3/wrapper/docker-compose.yaml deleted file mode 100644 index f6a921835..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/docker-compose.yaml +++ /dev/null @@ -1,7 +0,0 @@ -version: '3' -services: - mainnet-fork: - image: 'trufflesuite/ganache-cli:v6.12.2' - ports: - - '8546:8545' - command: -l 8000000 --deterministic --hostname=0.0.0.0 --chainId 1 --fork https://mainnet.infura.io/v3/d119148113c047ca90f0311ed729c466 \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/jest.config.js b/protocol/ethereum/uniswapv3/wrapper/jest.config.js deleted file mode 100644 index 194ea004b..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/jest.config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - collectCoverage: true, - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ["**/__tests__/e2e/**/?(*.)+(spec|test).[jt]s?(x)"], - testPathIgnorePatterns: ["/node_modules/", "/.polywrap/"], - globals: { - 'ts-jest': { - tsconfig: "tsconfig.ts.json", - diagnostics: false - } - } -}; diff --git a/protocol/ethereum/uniswapv3/wrapper/meta/imgs/polywrap-horizontal.svg b/protocol/ethereum/uniswapv3/wrapper/meta/imgs/polywrap-horizontal.svg deleted file mode 100644 index 6be89135d..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/meta/imgs/polywrap-horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/protocol/ethereum/uniswapv3/wrapper/meta/imgs/uniswap-pink.svg b/protocol/ethereum/uniswapv3/wrapper/meta/imgs/uniswap-pink.svg deleted file mode 100644 index d131f6c78..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/meta/imgs/uniswap-pink.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/protocol/ethereum/uniswapv3/wrapper/package.json b/protocol/ethereum/uniswapv3/wrapper/package.json deleted file mode 100644 index 699083840..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "@polywrap/uniswap-v3", - "description": "Polywrap Uniswap V3 Wasm Wrapper", - "private": true, - "version": "0.3.0", - "scripts": { - "reset": "yarn clean && yarn && yarn build", - "clean": "rimraf ./node_modules ./build ./coverage ./.polywrap ./**/wrap", - "build": "npx polywrap build -c ./config.ts -s image", - "deploy": "npx polywrap deploy", - "codegen": "npx polywrap codegen", - "test:e2e:replication": "jest --passWithNoTests --runInBand --verbose src/__tests__/e2e/sdk-test-replications", - "test:e2e:fork": "jest --passWithNoTests --runInBand --verbose src/__tests__/e2e/mainnet-fork-tests", - "test:e2e": "yarn test:e2e:replication && yarn test:e2e:fork", - "test:unit": "asp --verbose", - "test": "yarn test:unit && yarn test:e2e", - "test:ci": "yarn test:unit && yarn test:e2e", - "lint": "yarn eslint src", - "lint:fix": "yarn eslint src --fix" - }, - "dependencies": { - "@polywrap/wasm-as": "0.9.4" - }, - "devDependencies": { - "@as-pect/cli": "6.2.4", - "@types/jest": "26.0.24", - "@types/node": "12.6.9", - "@typescript-eslint/eslint-plugin": "4.11.1", - "@typescript-eslint/parser": "4.11.1", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "1.3.0", - "@uniswap/v3-sdk": "3.6.2", - "polywrap": "0.9.4", - "@polywrap/client-js": "0.9.4", - "@polywrap/test-env-js": "0.9.4", - "assemblyscript": "0.19.23", - "eslint": "7.16.0", - "eslint-config-prettier": "7.1.0", - "eslint-plugin-import": "2.22.1", - "eslint-plugin-prettier": "3.3.0", - "ethers": "5.0.7", - "graphql": "16.2.0", - "graphql-request": "3.7.0", - "jest": "26.6.3", - "prettier": "2.2.1", - "rimraf": "3.0.2", - "solc": "0.8.3", - "ts-jest": "26.5.6", - "ts-node": "8.10.2", - "typescript": "4.1.6" - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/polywrap.build.yaml b/protocol/ethereum/uniswapv3/wrapper/polywrap.build.yaml deleted file mode 100644 index 79369c7ea..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/polywrap.build.yaml +++ /dev/null @@ -1,18 +0,0 @@ -format: 0.1.0 -docker: - name: uniswap-v3-wrapper-build -config: - node_version: "16.13.0" - include: - - ./package.json - - src/pool - - src/position - - src/route - - src/router - - src/swap - - src/tickList - - src/token - - src/trade - - src/utils - - src/index.ts - - src/schema.graphql diff --git a/protocol/ethereum/uniswapv3/wrapper/polywrap.deploy.yaml b/protocol/ethereum/uniswapv3/wrapper/polywrap.deploy.yaml deleted file mode 100644 index 042a7e5be..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/polywrap.deploy.yaml +++ /dev/null @@ -1,12 +0,0 @@ -format: 0.1.0 -stages: - ipfs_deploy: - package: ipfs - uri: fs/./build - config: - gatewayUri: 'https://ipfs.wrappers.io' - ipfs_local_deploy: - package: ipfs - uri: fs/./build - config: - gatewayUri: 'http://127.0.0.1:45005' \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/polywrap.infra.yaml b/protocol/ethereum/uniswapv3/wrapper/polywrap.infra.yaml deleted file mode 100644 index d5c7d1d7e..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/polywrap.infra.yaml +++ /dev/null @@ -1,4 +0,0 @@ -format: 0.1.0 -modules: - mainnet: - path: ./docker-compose.yaml \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/polywrap.meta.yaml b/protocol/ethereum/uniswapv3/wrapper/polywrap.meta.yaml deleted file mode 100644 index bcbd79c52..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/polywrap.meta.yaml +++ /dev/null @@ -1,18 +0,0 @@ -format: 0.1.0 -displayName: Uniswap v3 -subtext: Uniswap v3 SDK->Wrapper -description: Wrapper that provides all the functionality of the Uniswap v3 JavaScript SDK, and more! -repository: https://github.com/polywrap/integrations/tree/main/uniswapv3/wrapper -icon: ./meta/imgs/uniswap-pink.svg -tags: - - uniswap - - defi - - demo - - sdk -links: - - name: Polywrap - icon: ./meta/imgs/polywrap-horizontal.svg - url: https://polywrap.io - - name: Uniswap - icon: ./meta/imgs/uniswap-pink.svg - url: https://uniswap.org/ diff --git a/protocol/ethereum/uniswapv3/wrapper/polywrap.yaml b/protocol/ethereum/uniswapv3/wrapper/polywrap.yaml deleted file mode 100644 index f07a70aab..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/polywrap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -format: 0.2.0 -project: - name: uniswap-v3 - type: wasm/assemblyscript -source: - schema: ./src/schema.graphql - module: ./src/index.ts -extensions: - build: ./polywrap.build.yaml - deploy: ./polywrap.deploy.yaml - meta: ./polywrap.meta.yaml \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/index.ts deleted file mode 100644 index 8c9aff200..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./infraUtils" -export * from "./testUtils" -export * from "./uniswapCreatePool" -export * from "./wrappedInvocations" -export * from "./types" \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/infraUtils.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/infraUtils.ts deleted file mode 100644 index ad5d7bf45..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/infraUtils.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { buildWrapper, runCLI } from "@polywrap/test-env-js"; -import axios from "axios"; -import { ClientConfig } from "@polywrap/client-js"; -import { ethereumPlugin, Connections, Connection } from "@polywrap/ethereum-plugin-js"; -import path from "path"; - -export async function buildDependencies(): Promise<{ sha3Uri: string, graphUri: string }> { - const relSystemWrappersPath = path.join(__dirname, "../../../../../../../../system"); - const systemsWrappersPath = path.resolve(relSystemWrappersPath); - const sha3Path = path.join(systemsWrappersPath, "sha3", "wrapper"); - const graphNodePath = path.join(systemsWrappersPath, "graph-node", "wrapper"); - await buildWrapper(sha3Path); - await buildWrapper(graphNodePath); - const sha3Uri = `wrap://fs/${sha3Path}/build`; - const graphUri = `wrap://fs/${graphNodePath}/build`; - return { sha3Uri, graphUri }; -} - -export function getConfig(sha3Uri: string, graphUri: string): Partial { - return { - envs: [ - { - uri: "wrap://ens/graph-node.polywrap.eth", - env: { - provider: "https://api.thegraph.com", - }, - }, - { - uri: "wrap://ens/ipfs.polywrap.eth", - env:{ - provider: "https://ipfs.wrappers.io", - fallbackProviders: ["https://ipfs.io", "http://localhost:48084", "http://127.0.0.1:45005"], - }, - }, - ], - redirects: [ - { - from: "wrap://ens/sha3.polywrap.eth", - to: sha3Uri, - }, - { - from: "wrap://ens/graph-node.polywrap.eth", - to: graphUri, - }, - ], - plugins: [ - { - uri: "wrap://ens/ethereum.polywrap.eth", - plugin: ethereumPlugin({ - connections: new Connections({ - networks: { - mainnet: new Connection({ provider: "http://localhost:8546" }), - }, - defaultNetwork: "mainnet", - }), - }), - }, - ] - }; -} - -export async function initInfra(): Promise { - const { exitCode, stderr, stdout } = await runCLI({ - args: ["infra", "up", "--verbose"] - }); - - if (exitCode) { - throw Error( - `initInfra failed to start test environment.\nExit Code: ${exitCode}\nStdErr: ${stderr}\nStdOut: ${stdout}` - ); - } - - const success = await awaitResponse( - `http://localhost:8546`, - '"jsonrpc":', - "post", - 2000, - 20000, - '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' - ); - if (!success) { - throw Error("initInfra: Ganache failed to start"); - } - - return Promise.resolve(); -} - -export async function stopInfra(): Promise { - const { exitCode, stderr, stdout } = await runCLI({ - args: ["infra", "down", "--verbose"] - }); - - if (exitCode) { - throw Error( - `initInfra failed to stop test environment.\nExit Code: ${exitCode}\nStdErr: ${stderr}\nStdOut: ${stdout}` - ); - } - - return Promise.resolve(); -} - -async function awaitResponse( - url: string, - expectedRes: string, - getPost: "get" | "post", - timeout: number, - maxTimeout: number, - data?: string -) { - let time = 0; - - while (time < maxTimeout) { - const request = getPost === "get" ? axios.get(url) : axios.post(url, data); - const success = await request - .then(function (response) { - const responseData = JSON.stringify(response.data); - return responseData.indexOf(expectedRes) > -1; - }) - .catch(function () { - return false; - }); - - if (success) { - return true; - } - - await new Promise(function (resolve) { - setTimeout(() => resolve(), timeout); - }); - - time += timeout; - } - - return false; -} \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/testUtils.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/testUtils.ts deleted file mode 100644 index 71c3938a3..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/testUtils.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { Token, Pool, FeeAmountEnum, FeeAmount, ChainIdEnum, ChainId } from "./types"; -import { PolywrapClient } from "@polywrap/client-js"; -import poolList from "../testData/poolList.json"; -import { getUniswapPool } from "./uniswapCreatePool"; -import { ethers } from "ethers"; -import * as uni from "@uniswap/v3-sdk"; -import * as uniCore from "@uniswap/sdk-core"; - -export function getTokens(pools: Pool[]): Token[] { - return pools - .map((pool: Pool): Token[] => [pool.token0, pool.token1]) // get tokens - .reduce((accum: Token[], current: Token[]) => accum.concat(current), []) // flatten array - .filter((val: Token, i: number, arr: Token[]) => arr.indexOf(val) === i); // remove duplicates -} - -export async function getPools(client: PolywrapClient, ensUri: string, fetchTicks?: boolean, sliceStart?: number, sliceEnd?: number): Promise { - const pools: Promise[] = poolList - .slice(sliceStart, sliceEnd) - .map((address: string) => getPoolFromAddress(client, ensUri, address, fetchTicks)); - return Promise.all(pools); -} - -export async function getUniPools(provider: ethers.providers.BaseProvider, fetchTicks?: boolean, sliceStart?: number, sliceEnd?: number, useTicks?: uni.Tick[][]): Promise { - const pools: Promise[] = poolList - .slice(sliceStart, sliceEnd) - .map((address: string, i: number) => getUniswapPool(provider, address, fetchTicks, useTicks?.[i])) - return Promise.all(pools); -} - -export async function getPoolFromAddress(client: PolywrapClient, ensUri: string, address: string, fetchTicks?: boolean): Promise { - const poolData = await client.query<{ - fetchPoolFromAddress: Pool; - }>({ - uri: ensUri, - query: ` - query { - fetchPoolFromAddress( - chainId: $chainId - address: $address - fetchTicks: $fetchTicks - ) - } - `, - variables: { - chainId: ChainIdEnum.MAINNET, - address: address, - fetchTicks: fetchTicks ?? false, - }, - }); - if (poolData.errors) { - throw poolData.errors; - } - return poolData.data!.fetchPoolFromAddress; -} - -export function toUniToken(token: Token): uniCore.Token { - return new uniCore.Token( - toUniChainId(token.chainId), - token.address, - token.currency.decimals, - token.currency.symbol ?? undefined, - token.currency.name ?? undefined - ); -} - -export function toUniChainId(input: ChainId): number { - switch (input) { - case ChainIdEnum.MAINNET: - case "MAINNET": - return 1; - case ChainIdEnum.ROPSTEN: - case "ROPSTEN": - return 3; - case ChainIdEnum.RINKEBY: - case "RINKEBY": - return 4; - case ChainIdEnum.GOERLI: - case "GOERLI": - return 5; - case ChainIdEnum.KOVAN: - case "KOVAN": - return 42; - default: - throw new Error('Unknown chain ID. This should never happen.') - } -} - -export function getFeeAmount(feeAmount: FeeAmount): number { - switch (feeAmount) { - case FeeAmountEnum.LOWEST: - case "LOWEST": - return 100; - case FeeAmountEnum.LOW: - case "LOW": - return 500; - case FeeAmountEnum.MEDIUM: - case "MEDIUM": - return 3000; - case FeeAmountEnum.HIGH: - case "HIGH": - return 10000; - default: - throw new Error("Unknown FeeAmount"); - } -} - -export function isDefined(t: T | undefined): t is T { - return !!t; -} - -export const getFakeTestToken = (i: number): Token => { - return { - chainId: ChainIdEnum.MAINNET, - address: "0x000000000000000000000000000000000000000" + (i + 1).toString(), - currency: { - decimals: 18, - symbol: "t" + i.toString(), - name: "token" + i.toString(), - } - }; -}; \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/types.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/types.ts deleted file mode 100644 index 7986bccc8..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/types.ts +++ /dev/null @@ -1,443 +0,0 @@ -// NOTE: This is generated by 'w3 codegen', DO NOT MODIFY - -export type UInt = number; -export type UInt8 = number; -export type UInt16 = number; -export type UInt32 = number; -export type Int = number; -export type Int8 = number; -export type Int16 = number; -export type Int32 = number; -export type Bytes = Uint8Array; -export type BigInt = string; -export type Json = string; -export type String = string; -export type Boolean = boolean; - -export interface SwapArgs { - tokenIn: Token; - tokenOut: Token; - amount: BigInt; - tradeType: TradeType; -} - -export interface Currency { - decimals: UInt8; - symbol?: String | null; - name?: String | null; -} - -export interface Token { - chainId: ChainId; - address: String; - currency: Currency; -} - -export interface Price { - baseToken: Token; - quoteToken: Token; - denominator: BigInt; - numerator: BigInt; - price: string; -} - -export interface Fraction { - denominator: BigInt; - numerator: BigInt; - quotient: string; -} - -export interface Route { - pools: Array; - path: Array; - input: Token; - output: Token; - midPrice: Price; -} - -export interface Tick { - index: Int32; - liquidityGross: BigInt; - liquidityNet: BigInt; -} - -export interface Pool { - token0: Token; - token1: Token; - fee: FeeAmount; - sqrtRatioX96: BigInt; - liquidity: BigInt; - tickCurrent: Int32; - tickDataProvider: Tick[]; - token0Price: Price; - token1Price: Price; -} - -export interface Trade { - swaps: Array; - tradeType: TradeType; - inputAmount: TokenAmount; - outputAmount: TokenAmount; -} - -export interface TokenAmount { - token: Token; - amount: BigInt; -} - -export interface TradeSwap { - route: Route; - inputAmount: TokenAmount; - outputAmount: TokenAmount; -} - -export interface SwapOptions { - slippageTolerance: String; - recipient: String; - deadline: BigInt; - inputTokenPermit?: PermitOptions | null; - sqrtPriceLimitX96?: BigInt | null; - fee?: FeeOptions | null; -} - -export interface PermitOptions { - v: PermitV; - r: String; - s: String; - amount?: BigInt | null; - deadline?: BigInt | null; - nonce?: BigInt | null; - expiry?: BigInt | null; -} - -export interface FeeOptions { - fee: String; - recipient: String; -} - -export interface MethodParameters { - calldata: String; - value: String; -} - -export interface GasOptions { - gasPrice?: BigInt | null; - gasLimit?: BigInt | null; -} - -export interface NextTickResult { - index: Int32; - found: Boolean; -} - -export interface PoolChangeResult { - amount: TokenAmount; - nextPool: Pool; -} - -export interface TradeRoute { - route: Route; - amount: TokenAmount; -} - -export interface UncheckedTradeRoute { - route: Route; - inputAmount: TokenAmount; - outputAmount: TokenAmount; -} - -export interface SimulatedSwapResult { - amountCalculated: BigInt; - sqrtRatioX96: BigInt; - liquidity: BigInt; - tickCurrent: Int32; -} - -export interface SwapStepResult { - sqrtRatioNextX96: BigInt; - amountIn: BigInt; - amountOut: BigInt; - feeAmount: BigInt; -} - -export interface IncentiveKey { - rewardToken: Token; - pool: Pool; - startTime: BigInt; - endTime: BigInt; - refundee: String; -} - -export interface ClaimOptions { - tokenId: BigInt; - recipient: String; - amount?: BigInt | null; -} - -export interface FullWithdrawOptions { - owner: String; - data?: String | null; - tokenId: BigInt; - recipient: String; - amount?: BigInt | null; -} - -export interface QuoteOptions { - sqrtPriceLimitX96?: BigInt | null; -} - -export interface CommonAddLiquidityOptions { - slippageTolerance: String; - deadline: BigInt; - useNative?: Token | null; - token0Permit?: PermitOptions | null; - token1Permit?: PermitOptions | null; -} - -export interface AddLiquidityOptions { - recipient?: String | null; - createPool?: Boolean | null; - tokenId?: BigInt | null; - slippageTolerance: String; - deadline: BigInt; - useNative?: Token | null; - token0Permit?: PermitOptions | null; - token1Permit?: PermitOptions | null; -} - -export interface SafeTransferOptions { - sender: String; - recipient: String; - tokenId: BigInt; - data?: String | null; -} - -export interface CollectOptions { - tokenId: BigInt; - expectedCurrencyOwed0: TokenAmount; - expectedCurrencyOwed1: TokenAmount; - recipient: String; -} - -export interface NFTPermitOptions { - v: PermitV; - r: String; - s: String; - deadline: BigInt; - spender: String; -} - -export interface RemoveLiquidityOptions { - tokenId: BigInt; - liquidityPercentage: String; - slippageTolerance: String; - deadline: BigInt; - burnToken?: Boolean | null; - permit?: NFTPermitOptions | null; - collectOptions: CollectOptions; -} - -export interface BestTradeOptions { - maxNumResults?: UInt32 | null; - maxHops?: UInt32 | null; -} - -export interface Position { - pool: Pool; - tickLower: UInt32; - tickUpper: UInt32; - liquidity: BigInt; - token0Amount: TokenAmount; - token1Amount: TokenAmount; - mintAmounts: MintAmounts; - token0PriceLower: Price; - token0PriceUpper: Price; -} - -export interface MintAmounts { - amount0: BigInt; - amount1: BigInt; -} - -export enum ChainIdEnum { - MAINNET, - ROPSTEN, - RINKEBY, - GOERLI, - KOVAN, -} - -export type ChainIdString = - | "MAINNET" - | "ROPSTEN" - | "RINKEBY" - | "GOERLI" - | "KOVAN" - -export type ChainId = ChainIdEnum | ChainIdString; - -export enum FeeAmountEnum { - LOWEST, - LOW, - MEDIUM, - HIGH, -} - -export type FeeAmountString = - | "LOWEST" - | "LOW" - | "MEDIUM" - | "HIGH" - -export type FeeAmount = FeeAmountEnum | FeeAmountString; - -export enum TradeTypeEnum { - EXACT_INPUT, - EXACT_OUTPUT, -} - -export type TradeTypeString = - | "EXACT_INPUT" - | "EXACT_OUTPUT" - -export type TradeType = TradeTypeEnum | TradeTypeString; - -export enum PermitVEnum { - v_0, - v_1, - v_27, - v_28, -} - -export type PermitVString = - | "v_0" - | "v_1" - | "v_27" - | "v_28" - -export type PermitV = PermitVEnum | PermitVString; - -export enum RoundingEnum { - ROUND_DOWN, - ROUND_HALF_UP, - ROUND_UP, -} - -export type RoundingString = - | "ROUND_DOWN" - | "ROUND_HALF_UP" - | "ROUND_UP" - -export type Rounding = RoundingEnum | RoundingString; - -/// Imported Objects START /// - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_Connection { - node?: String | null; - networkNameOrChainId?: String | null; -} - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_TxOverrides { - gasLimit?: BigInt | null; - gasPrice?: BigInt | null; - value?: BigInt | null; -} - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_TxResponse { - hash: String; - to?: String | null; - from: String; - nonce: UInt32; - gasLimit: BigInt; - gasPrice?: BigInt | null; - data: String; - value: BigInt; - chainId: UInt32; - blockNumber?: BigInt | null; - blockHash?: String | null; - timestamp?: UInt32 | null; - confirmations: UInt32; - raw?: String | null; - r?: String | null; - s?: String | null; - v?: UInt32 | null; - type?: UInt32 | null; - accessList?: Array | null; -} - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_Access { - address: String; - storageKeys: Array; -} - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_TxReceipt { - to: String; - from: String; - contractAddress: String; - transactionIndex: UInt32; - root?: String | null; - gasUsed: BigInt; - logsBloom: String; - transactionHash: String; - logs: Array; - blockNumber: BigInt; - blockHash: String; - confirmations: UInt32; - cumulativeGasUsed: BigInt; - effectiveGasPrice: BigInt; - byzantium: Boolean; - type: UInt32; - status?: UInt32 | null; -} - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_Log { - blockNumber: BigInt; - blockHash: String; - transactionIndex: UInt32; - removed: Boolean; - address: String; - data: String; - topics: Array; - transactionHash: String; - logIndex: UInt32; -} - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_TxRequest { - to?: String | null; - from?: String | null; - nonce?: UInt32 | null; - gasLimit?: BigInt | null; - gasPrice?: BigInt | null; - data?: String | null; - value?: BigInt | null; - chainId?: UInt32 | null; - type?: UInt32 | null; -} - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_StaticTxResult { - result: String; - error: Boolean; -} - -/* URI: "w3://ens/ethereum.web3api.eth" */ -export interface Ethereum_EventNotification { - data: String; - address: String; - log: Ethereum_Log; -} - -/* URI: "w3://ipfs/QmeiPWHe2ixfitcgjRwP5AaJD5R7DbsGhQNQwT4rFNyxx8" */ -export interface ERC20_Ethereum_Connection { - node?: String | null; - networkNameOrChainId?: String | null; -} - -/// Imported Objects END /// diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/uniswapCreatePool.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/uniswapCreatePool.ts deleted file mode 100644 index ece733999..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/uniswapCreatePool.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { ethers } from "ethers"; -import { Pool, Tick } from "@uniswap/v3-sdk"; -import { Token } from "@uniswap/sdk-core"; -import { abi as IUniswapV3PoolABI } from "@uniswap/v3-core/artifacts/contracts/interfaces/IUniswapV3Pool.sol/IUniswapV3Pool.json"; -import { request } from 'graphql-request'; - -const ERC20ABI = [ - "function decimals() external pure returns (uint8)", - "function symbol() external pure returns (string memory)", - "function name() external pure returns (string memory)", -]; - -interface Immutables { - token0: string; - token1: string; - fee: number; - tickSpacing: number; -} - -interface State { - liquidity: ethers.BigNumber; - sqrtPriceX96: ethers.BigNumber; - tick: number; -} - -async function getPoolImmutables(poolContract: ethers.Contract): Promise { - const [token0, token1, fee, tickSpacing] = - await Promise.all([ - poolContract.token0(), - poolContract.token1(), - poolContract.fee(), - poolContract.tickSpacing(), - ]); - - return { - token0, - token1, - fee, - tickSpacing, - }; -} - -async function getPoolState(poolContract: ethers.Contract): Promise { - const [liquidity, slot] = await Promise.all([ - poolContract.liquidity(), - poolContract.slot0(), - ]); - return { - liquidity, - sqrtPriceX96: slot[0], - tick: slot[1], - }; -} - -async function getPoolTicks(address: string, skip: number = 0): Promise { - const APIURL = 'https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3'; - const tokensQuery = ` - query { - ticks(first: 1000, skip: ${skip}, where: { poolAddress: "${address}" }, orderBy: tickIdx) { - tickIdx - liquidityGross - liquidityNet - } - }`; - const query = await request(APIURL, tokensQuery); - - return query.ticks.map((v: Record) => ({ - index: parseInt(v.tickIdx), - liquidityGross: v.liquidityGross, - liquidityNet: v.liquidityNet, - })); -} - -async function getAllPoolTicks(address: string): Promise { - let skip: number = 0; - let ticks: Tick[] = await getPoolTicks(address, skip); - while (ticks.length % 1000 === 0) { - skip += 1000; - const query = await getPoolTicks(address, skip); - ticks = ticks.concat(query); - } - return ticks; -} - -async function getToken(tokenContract: ethers.Contract): Promise { - const [decimals, symbol, name] = await Promise.all([ - tokenContract.decimals(), - tokenContract.symbol(), - tokenContract.name(), - ]); - return new Token(1, tokenContract.address, decimals, symbol, name); -} - -export async function getUniswapPool(provider: ethers.providers.Provider, poolAddress: string, fetchTicks?: boolean, useTicks?: Tick[]): Promise { - - const poolContract: ethers.Contract = new ethers.Contract( - poolAddress, - IUniswapV3PoolABI, - provider - ); - - const immutables: Immutables = await getPoolImmutables(poolContract); - - const tokenContractA: ethers.Contract = new ethers.Contract(immutables.token0, ERC20ABI, provider); - const tokenContractB: ethers.Contract = new ethers.Contract(immutables.token1, ERC20ABI, provider); - - const [state, tokenA, tokenB] = await Promise.all([ - getPoolState(poolContract), - getToken(tokenContractA), - getToken(tokenContractB), - ]); - - let ticks: Tick[] | undefined; - if (fetchTicks && !useTicks) { - ticks = await getAllPoolTicks(poolAddress); - } else { - ticks = useTicks; - } - - return new Pool( - tokenA, - tokenB, - immutables.fee, - state.sqrtPriceX96.toString(), - state.liquidity.toString(), - state.tick, - ticks - ); -} \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/wrappedInvocations.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/wrappedInvocations.ts deleted file mode 100644 index 851330357..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/helpers/wrappedInvocations.ts +++ /dev/null @@ -1,406 +0,0 @@ - import { PolywrapClient } from "@polywrap/client-js"; -import { - AddLiquidityOptions, BestTradeOptions, - BigInt, ChainId, ChainIdEnum, ClaimOptions, CollectOptions, - FeeAmount, - FeeAmountEnum, - FeeOptions, FullWithdrawOptions, IncentiveKey, - Int32, MethodParameters, - Pool, Position, QuoteOptions, RemoveLiquidityOptions, - Route, SafeTransferOptions, SwapOptions, - Tick, - Token, TokenAmount, Trade, - TradeRoute, - TradeType, TradeTypeEnum -} from "./types"; - -type BigIntish = BigInt | number; - -export async function constant(client: PolywrapClient, uri: string, method: string): Promise { - const invocation = await client.invoke({ - uri: uri, - method: method, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function createPool(client: PolywrapClient, uri: string, tokenA: Token, tokenB: Token, fee: FeeAmount, sqrtRatioX96: BigIntish, liquidity: BigIntish, tickCurrent: Int32, ticks: Tick[]): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "createPool", - args: { - tokenA, - tokenB, - fee: typeof fee === "string" ? fee : FeeAmountEnum[fee], - sqrtRatioX96: sqrtRatioX96.toString(), - liquidity: liquidity.toString(), - tickCurrent, - ticks, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function encodeSqrtRatioX96(client: PolywrapClient, uri: string, amount1: BigIntish, amount0: BigIntish): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "encodeSqrtRatioX96", - args: { - amount1: amount1.toString(), - amount0: amount0.toString(), - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function createRoute(client: PolywrapClient, uri: string, pools: Pool[], inToken: Token, outToken: Token): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "createRoute", - args: { - pools, - inToken, - outToken, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function encodeRouteToPath(client: PolywrapClient, uri: string, route: Route, exactOutput: boolean): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "encodeRouteToPath", - args: { - route, - exactOutput, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function encodeUnwrapWETH9(client: PolywrapClient, uri: string, amountMinimum: BigIntish, recipient: string, feeOptions?: FeeOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "encodeUnwrapWETH9", - args: { - amountMinimum: amountMinimum.toString(), - recipient, - feeOptions: feeOptions ?? null, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function encodeSweepToken(client: PolywrapClient, uri: string, token: Token, amountMinimum: BigIntish, recipient: string, feeOptions?: FeeOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "encodeSweepToken", - args: { - token, - amountMinimum: amountMinimum.toString(), - recipient, - feeOptions: feeOptions ?? null, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function encodeRefundETH(client: PolywrapClient, uri: string): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "encodeRefundETH", - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function encodeMulticall(client: PolywrapClient, uri: string, calldatas: string[]): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "encodeMulticall", - args: { - calldatas, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function getTickAtSqrtRatio(client: PolywrapClient, uri: string, sqrtRatioX96: BigIntish): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "getTickAtSqrtRatio", - args: { - sqrtRatioX96: sqrtRatioX96.toString(), - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function nearestUsableTick(client: PolywrapClient, uri: string, tick: number, tickSpacing: number): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "nearestUsableTick", - args: { - tick, - tickSpacing, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function getSqrtRatioAtTick(client: PolywrapClient, uri: string, tick: number): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "getSqrtRatioAtTick", - args: { - tick, - }, - }); - if (invocation.ok == false) throw invocation.error - return invocation.value; -} - -export async function feeAmountToTickSpacing(client: PolywrapClient, uri: string, feeAmount: FeeAmount): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "feeAmountToTickSpacing", - args: { - feeAmount: typeof feeAmount === "string" ? feeAmount : FeeAmountEnum[feeAmount], - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function createTradeFromRoute(client: PolywrapClient, uri: string, tradeRoute: TradeRoute, tradeType: TradeType): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "createTradeFromRoute", - args: { - tradeRoute, - tradeType, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function createTradeFromRoutes(client: PolywrapClient, uri: string, tradeRoutes: TradeRoute[], tradeType: TradeType): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "createTradeFromRoutes", - args: { - tradeRoutes, - tradeType, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function swapCallParameters(client: PolywrapClient, uri: string, trades: Trade[], options: SwapOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "swapCallParameters", - args: { - trades, - options, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function quoteCallParameters(client: PolywrapClient, uri: string, route: Route, amount: TokenAmount, tradeType: TradeType, options?: QuoteOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "quoteCallParameters", - args: { - route, - amount, - tradeType: typeof tradeType === "string" ? tradeType : TradeTypeEnum[tradeType], - options: options ?? null, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function collectRewards(client: PolywrapClient, uri: string, incentiveKeys: IncentiveKey[], options: ClaimOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "collectRewards", - args: { - incentiveKeys, - options, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function withdrawToken(client: PolywrapClient, uri: string, incentiveKeys: IncentiveKey[], options: FullWithdrawOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "withdrawToken", - args: { - incentiveKeys, - options, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function encodeDeposit(client: PolywrapClient, uri: string, incentiveKeys: IncentiveKey[]): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "encodeDeposit", - args: { - incentiveKeys, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function safeTransferFromParameters(client: PolywrapClient, uri: string, options: SafeTransferOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "safeTransferFromParameters", - args: { - options, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function createCallParameters(client: PolywrapClient, uri: string, pool: Pool): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "createCallParameters", - args: { - pool - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function addCallParameters(client: PolywrapClient, uri: string, position: Position, options: AddLiquidityOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "addCallParameters", - args: { - position, - options, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function collectCallParameters(client: PolywrapClient, uri: string, options: CollectOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "collectCallParameters", - args: { - options - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function removeCallParameters(client: PolywrapClient, uri: string, position: Position, options: RemoveLiquidityOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "removeCallParameters", - args: { - position, - options, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function createPosition(client: PolywrapClient, uri: string, pool: Pool, tickLower: number, tickUpper: number, liquidity: BigIntish): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "createPosition", - args: { - pool, - tickLower, - tickUpper, - liquidity: liquidity.toString(), - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function bestTradeExactIn(client: PolywrapClient, uri: string, pools: Pool[], amountIn: TokenAmount, tokenOut: Token, options?: BestTradeOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "bestTradeExactIn", - args: { - pools, - amountIn, - tokenOut, - options, - }, - }); - if (invocation.ok == false) throw invocation.error; - return invocation.value; -} - -export async function bestTradeExactOut(client: PolywrapClient, uri: string, pools: Pool[], tokenIn: Token, amountOut: TokenAmount, options?: BestTradeOptions): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "bestTradeExactOut", - args: { - pools, - tokenIn, - amountOut, - options, - }, - }); - if (invocation.ok == false) throw invocation.error - return invocation.value; -} - -export async function getNative(client: PolywrapClient, uri: string, chainId: ChainId): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "getNative", - args: { - chainId: typeof chainId === "string" ? chainId : ChainIdEnum[chainId], - }, - }); - if (invocation.ok == false) throw invocation.error - return invocation.value; -} - -export async function getWrappedNative(client: PolywrapClient, uri: string, chainId: ChainId): Promise { - const invocation = await client.invoke({ - uri: uri, - method: "getWrappedNative", - args: { - chainId: typeof chainId === "string" ? chainId : ChainIdEnum[chainId], - }, - }); - if (invocation.ok == false) throw invocation.error - return invocation.value; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/call_mainnetFork.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/call_mainnetFork.spec.ts deleted file mode 100644 index 6c008cdeb..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/call_mainnetFork.spec.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - ChainIdEnum, - Ethereum_TxResponse, - MethodParameters, - Pool, - Token, - TokenAmount, - Trade, - getPoolFromAddress, getPools, getTokens, - bestTradeExactOut, getNative, swapCallParameters, - getConfig, initInfra, stopInfra, buildDependencies -} from "../helpers"; -import path from "path"; -import * as ethers from "ethers"; -import erc20ABI from "../testData/erc20ABI.json"; - -jest.setTimeout(360000); - -describe("Call (mainnet fork)", () => { - - const ROUTER_ADDRESS = "0xE592427A0AEce92De3Edee1F18E0157C05861564"; - const USDC_ETH_03_ADDRESS = "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8"; - - let client: PolywrapClient; - let fsUri: string; - let ethersProvider: ethers.providers.JsonRpcProvider; - let recipient: string; - - beforeAll(async () => { - await initInfra(); - // get client - const { sha3Uri, graphUri } = await buildDependencies(); - const config = getConfig(sha3Uri, graphUri); - client = new PolywrapClient(config); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up ethers provider - ethersProvider = new ethers.providers.JsonRpcProvider("http://localhost:8546"); - recipient = await ethersProvider.getSigner().getAddress(); - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("successfully approves token transfers", async () => { - const tokens: Token[] = getTokens(await getPools(client, fsUri)); - for (const token of tokens) { - if (token.currency.symbol === "USDT") continue; // TODO: why does USDT fail on the approve call? - const txResponse = await client.invoke({ - uri: fsUri, - method: "approve", - args: { token }, - }); - if (txResponse.ok == false) fail(txResponse.error); - - const approve: string = txResponse.value.hash; - const approveTx = await ethersProvider.getTransaction(approve); - const receipt = await approveTx.wait(); - expect(receipt.status).toBeTruthy(); - } - }); - - it("execCall: swap eth -> usdc", async () => { - const pools: Pool[] = [await getPoolFromAddress(client, fsUri, USDC_ETH_03_ADDRESS, true)]; - const tokens: Token[] = getTokens(pools); - - // approve token transfers - for (const token of tokens) { - const txResponse = await client.invoke({ - uri: fsUri, - method: "approve", - args: { token }, - }); - if (txResponse.ok == false) fail(txResponse.error); - const approve: string = txResponse.value.hash; - const approveTx = await ethersProvider.getTransaction(approve); - await approveTx.wait(); - } - - const ETH: Token = await getNative(client, fsUri, ChainIdEnum.MAINNET); - const USDC: Token = tokens.find(token => token.currency.symbol === "USDC") as Token; - - // eth -> usdc preparation - const usdcOut: TokenAmount = { token: USDC, amount: "10000000000" } - const ethUsdcTrade: Trade = (await bestTradeExactOut(client, fsUri, pools, ETH, usdcOut))[0]; - const ethUsdcParams: MethodParameters = await swapCallParameters(client, fsUri, [ethUsdcTrade], { - slippageTolerance: "0.1", - recipient, - deadline: (new Date().getTime() / 1000 + 1800).toFixed(0), - }); - - // execCall eth -> usdc - const ethUsdcQuery = await client.invoke({ - uri: fsUri, - method: "execCall", - args: { - parameters: ethUsdcParams, - address: ROUTER_ADDRESS, - chainId: ChainIdEnum[ChainIdEnum.MAINNET], - }, - }); - if (ethUsdcQuery.ok == false) fail(ethUsdcQuery.error); - - const ethUsdcHash: string = ethUsdcQuery.value.hash ?? ""; - const ethUsdcTx = await ethersProvider.getTransaction(ethUsdcHash); - const ethUsdcTxResponse = await ethUsdcTx.wait(); - expect(ethUsdcTxResponse.status).toBeTruthy(); - - const usdcContract = new ethers.Contract(USDC.address, erc20ABI, ethersProvider); - const usdcBalance: ethers.BigNumber = await usdcContract.balanceOf(recipient); - expect(usdcBalance.eq(usdcOut.amount)).toBeTruthy(); - }); -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/deployPool_mainnetFork.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/deployPool_mainnetFork.spec.ts deleted file mode 100644 index 6a4ce6802..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/deployPool_mainnetFork.spec.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - ChainIdEnum, Ethereum_TxResponse, FeeAmountEnum, Token, Pool, - getPoolFromAddress, - getWrappedNative, - initInfra, - getConfig, - stopInfra, buildDependencies -} from "../helpers"; -import path from "path"; -import * as ethers from "ethers"; - -jest.setTimeout(360000); - -describe("Deploy pool (mainnet fork)", () => { - - let client: PolywrapClient; - let fsUri: string; - let ethersProvider: ethers.providers.JsonRpcProvider; - - beforeAll(async () => { - await initInfra(); - // get client - const { sha3Uri, graphUri } = await buildDependencies(); - const config = getConfig(sha3Uri, graphUri); - client = new PolywrapClient(config); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up ethers provider - ethersProvider = new ethers.providers.JsonRpcProvider("http://localhost:8546"); - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("successfully deploys pool from tokens", async () => { - const WRAP: Token = { - chainId: ChainIdEnum.MAINNET, - address: "0xECCac17265D5b6daEBafb9c94430f3E1Cc41431d", - currency: { - name: "WRAP-IOU", - symbol: "WRAP-IOU", - decimals: 18 - } - }; - const WETH: Token = await getWrappedNative(client, fsUri, ChainIdEnum.MAINNET); - - const txResponse = await client.invoke({ - uri: fsUri, - method: "deployPoolFromTokens", - args: { - tokenA: WRAP, - tokenB: WETH, - fee: FeeAmountEnum.MEDIUM, - }, - }); - if (txResponse.ok == false) fail(txResponse.error); - - const txHash: string = txResponse.value.hash; - const tx = await ethersProvider.getTransaction(txHash); - const receipt = await tx.wait(); - expect(receipt.status).toBeTruthy(); - - const addressQuery = await client.invoke({ - uri: fsUri, - method: "getPoolAddress", - args: { - tokenA: WRAP, - tokenB: WETH, - fee: FeeAmountEnum.MEDIUM, - }, - }); - if (addressQuery.ok == false) fail(addressQuery.error); - - const pool: Pool = await getPoolFromAddress(client, fsUri, addressQuery.value); - expect(pool.token0).toStrictEqual(WETH); - expect(pool.token1).toStrictEqual(WRAP); - expect(pool.fee).toEqual(FeeAmountEnum.MEDIUM); - expect(pool.liquidity).toEqual("0"); - expect(pool.tickCurrent).toEqual(0); - }); - -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/fetch_mainnetFork.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/fetch_mainnetFork.spec.ts deleted file mode 100644 index a7eb0b3c7..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/fetch_mainnetFork.spec.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - ChainIdEnum, Pool, Token, - getConfig, initInfra, stopInfra, - getFeeAmount, getPools, getTokens, getUniPools, - getUniswapPool, buildDependencies, Tick -} from "../helpers"; -import path from "path"; -import * as uni from "@uniswap/v3-sdk"; -import poolList from "../testData/poolList.json"; -import * as ethers from "ethers"; - -jest.setTimeout(360000); - -describe("Fetch (mainnet fork)", () => { - - let client: PolywrapClient; - let fsUri: string; - let poolAddresses: string[] = poolList; - let uniPools: uni.Pool[]; - let ethersProvider: ethers.providers.BaseProvider; - - beforeAll(async () => { - await initInfra(); - // get client - const { sha3Uri, graphUri } = await buildDependencies(); - const config = getConfig(sha3Uri, graphUri); - client = new PolywrapClient(config); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up ethers provider - ethersProvider = ethers.providers.getDefaultProvider("http://localhost:8546"); - // get uni pools - uniPools = await getUniPools(ethersProvider); - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("fetchTickList", async () => { - const uniPool: uni.Pool = await getUniswapPool(ethersProvider, poolAddresses[0], true); - const tickListQuery = await client.invoke({ - uri: fsUri, - method: "fetchTickList", - args: { - chainId: ChainIdEnum[ChainIdEnum.MAINNET], - address: poolAddresses[0], - }, - }); - if (tickListQuery.ok == false) fail(tickListQuery.error); - - const tickList = tickListQuery.value; - for (let i = 0; i < tickList.length; i++) { - const tick = tickList[i]; - // @ts-ignore - const uniTick: uni.Tick = await uniPool.tickDataProvider.getTick(tick.index); - expect(tick.index).toEqual(uniTick.index); - expect(tick.liquidityNet.toString()).toEqual(uniTick.liquidityNet.toString()); - expect(tick.liquidityGross.toString()).toEqual(uniTick.liquidityGross.toString()); - } - }); - - it("fetchPoolFromAddress", async () => { - for (let i = 0; i < 3; i++) { - // fetch pool - const poolData = await client.invoke({ - uri: fsUri, - method: "fetchPoolFromAddress", - args: { - chainId: ChainIdEnum[ChainIdEnum.MAINNET], - address: poolAddresses[i], - fetchTicks: false, - }, - }); - if (poolData.ok == false) fail(poolData.error); - - const pool = poolData.value; - const uniPool: uni.Pool = uniPools[i]; - - expect(pool.token0.address).toEqual(uniPool.token0.address); - expect(pool.token1.address).toEqual(uniPool.token1.address); - expect(getFeeAmount(pool.fee)).toEqual(uniPool.fee.valueOf()); - expect(pool.sqrtRatioX96).toEqual(uniPool.sqrtRatioX96.toString()); - expect(pool.liquidity).toEqual(uniPool.liquidity.toString()); - expect(pool.tickCurrent).toEqual(uniPool.tickCurrent); - } - }); - - it("fetchToken", async () => { - const pools: Pool[] = await getPools(client, fsUri, false, 3, 6); - const tokens: Token[] = getTokens(pools); - for (let i = 0; i < tokens.length; i++) { - // fetch token - const tokenData = await client.invoke({ - uri: fsUri, - method: "fetchToken", - args: { - chainId: ChainIdEnum[tokens[i].chainId], - address: tokens[i].address, - }, - }); - // compare results - if (tokenData.ok == false) fail(tokenData.error); - expect(tokenData.value.currency.decimals).toEqual(tokens[i].currency.decimals); - expect(tokenData.value.currency.symbol).toEqual(tokens[i].currency.symbol); - expect(tokenData.value.currency.name).toEqual(tokens[i].currency.name); - } - }); - - it("fetchPoolFromTokens", async () => { - const pools: Pool[] = await getPools(client, fsUri, false, 6, 9); - for (let i = 0; i < pools.length; i++) { - // fetch pool - const poolData = await client.invoke({ - uri: fsUri, - method: "fetchPoolFromTokens", - args: { - tokenA: pools[i].token0, - tokenB: pools[i].token1, - fee: pools[i].fee, - fetchTicks: false, - }, - }); - if (poolData.ok == false) fail(poolData.error); - - const pool = poolData.value; - const expectedPool: Pool = pools[i]; - expect(pool).toStrictEqual(expectedPool); - } - }); -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/pool_mainnetFork.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/pool_mainnetFork.spec.ts deleted file mode 100644 index bc784b91d..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/pool_mainnetFork.spec.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - Pool, TokenAmount, PoolChangeResult, - getConfig, initInfra, stopInfra, - getUniswapPool, - getPoolFromAddress, getPools, buildDependencies -} from "../helpers"; -import path from "path"; -import * as uni from "@uniswap/v3-sdk"; -import * as uniCore from "@uniswap/sdk-core"; -import * as ethers from "ethers"; -import poolList from "../testData/poolList.json"; - -jest.setTimeout(360000); - -describe("Pool (mainnet fork)", () => { - - let client: PolywrapClient; - let fsUri: string; - const addresses: string[] = poolList; - let pools: Pool[]; - let pool0: Pool; - let uniPool0: uni.Pool; - let ethersProvider: ethers.providers.BaseProvider; - - beforeAll(async () => { - await initInfra(); - // get client - const { sha3Uri, graphUri } = await buildDependencies(); - const config = getConfig(sha3Uri, graphUri); - client = new PolywrapClient(config); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up ethers provider - ethersProvider = ethers.providers.getDefaultProvider("http://localhost:8546"); - // set up test case data - pools = await getPools(client, fsUri); - pool0 = await getPoolFromAddress(client, fsUri, addresses[0], true); - uniPool0 = await getUniswapPool(ethersProvider, addresses[0], true); - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("Gets pool address", async () => { - for (let i = 0; i < pools.length; i++) { - const invocation = await client.invoke({ - uri: fsUri, - method: "getPoolAddress", - args: { - tokenA: pools[i].token0, - tokenB: pools[i].token1, - fee: pools[i].fee, - }, - }); - if (invocation.ok == false) fail(invocation.error); - expect(invocation.value.toLowerCase()).toEqual(addresses[i].toLowerCase()); - } - }); - - it("getPoolOutputAmount", async () => { - // const pool0 = (await getPools(client, fsUri, true, 0, 1))[0]; - // const uniPool0 = (await getUniPools(ethersProvider, true, 0, 1))[0]; - const inputAmount: TokenAmount = { - token: pool0.token0, - amount: "1000000000000000000", - } - const invocation = await client.invoke({ - uri: fsUri, - method: "getPoolOutputAmount", - args: { - pool: pool0, - inputAmount: inputAmount, - sqrtPriceLimitX96: null, - }, - }); - if (invocation.ok == false) fail(invocation.error); - - const uniInputAmount = uniCore.CurrencyAmount.fromRawAmount(uniPool0.token0, inputAmount.amount); - const [uniCurrencyAmount, uniPool] = await uniPool0.getOutputAmount(uniInputAmount); - - // output amount - expect(invocation.value.amount.token.address).toEqual(uniCurrencyAmount.currency.address); - expect(invocation.value.amount.amount).toEqual(uniCurrencyAmount.numerator.toString()); - // pool state - expect(invocation.value.nextPool.sqrtRatioX96).toEqual(uniPool.sqrtRatioX96.toString()); - expect(invocation.value.nextPool.liquidity).toEqual(uniPool.liquidity.toString()); - expect(invocation.value.nextPool.tickCurrent).toEqual(uniPool.tickCurrent); - }); - - it("getPoolInputAmount", async () => { - // const pool0 = (await getPools(client, fsUri, true, 0, 1))[0]; - // const uniPool0 = (await getUniPools(ethersProvider, true, 0, 1))[0]; - const outputAmount: TokenAmount = { - token: pool0.token0, - amount: "1000000000000000000", - } - const invocation = await client.invoke({ - uri: fsUri, - method: "getPoolInputAmount", - args: { - pool: pool0, - outputAmount: outputAmount, - sqrtPriceLimitX96: null, - }, - }); - if (invocation.ok == false) fail(invocation.error); - - const unitOutputAmount = uniCore.CurrencyAmount.fromRawAmount(uniPool0.token0, outputAmount.amount); - const [uniCurrencyAmount, uniPool] = await uniPool0.getInputAmount(unitOutputAmount); - - // input amount - expect(invocation.value.amount.token.address).toEqual(uniCurrencyAmount.currency.address); - expect(invocation.value.amount.amount).toEqual(uniCurrencyAmount.numerator.toString()); - // pool state - expect(invocation.value.nextPool.sqrtRatioX96).toEqual(uniPool.sqrtRatioX96.toString()); - expect(invocation.value.nextPool.liquidity).toEqual(uniPool.liquidity.toString()); - expect(invocation.value.nextPool.tickCurrent).toEqual(uniPool.tickCurrent); - }); -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/route_mainnetFork.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/route_mainnetFork.spec.ts deleted file mode 100644 index c0c3b160f..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/route_mainnetFork.spec.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import path from "path"; -import * as uni from "@uniswap/v3-sdk"; -import * as uniCore from "@uniswap/sdk-core"; -import * as ethers from "ethers"; -import { - initInfra, stopInfra, getConfig, - getUniswapPool, getPoolFromAddress, getTokens, isDefined, toUniToken, - Pool, Route, Token, Price, buildDependencies -} from "../helpers"; - -jest.setTimeout(360000); - -describe("Route (mainnet fork)", () => { - - const DAI_WETH_address = "0xc2e9f25be6257c210d7adf0d4cd6e3e881ba25f8"; - const DAI_USDC_address = "0x6c6bc977e13df9b0de53b251522280bb72383700"; - const USDC_USDT_address = "0x3416cf6c708da44db2624d63ea0aaef7113527c6"; - - let client: PolywrapClient; - let fsUri: string; - let tokens: Token[]; - let pools: Pool[]; - let uniPools: uni.Pool[]; - let ethersProvider: ethers.providers.BaseProvider; - - beforeAll(async () => { - await initInfra(); - // get client - const { sha3Uri, graphUri } = await buildDependencies(); - const config = getConfig(sha3Uri, graphUri); - client = new PolywrapClient(config); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - pools = [ - await getPoolFromAddress(client, fsUri, DAI_WETH_address, false), - await getPoolFromAddress(client, fsUri, DAI_USDC_address, false), - await getPoolFromAddress(client, fsUri, USDC_USDT_address, false), - ].filter(isDefined); - tokens = getTokens(pools); - // set up ethers provider - ethersProvider = ethers.providers.getDefaultProvider("http://localhost:8546"); - // get uni pools - uniPools = [ - await getUniswapPool(ethersProvider, DAI_WETH_address, false), - await getUniswapPool(ethersProvider, DAI_USDC_address, false), - await getUniswapPool(ethersProvider, USDC_USDT_address, false), - ].filter(isDefined); - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("Route mid price", async () => { - const [inToken, outToken]: Token[] = [ - tokens.find((token: Token) => token.currency.symbol === "WETH"), - tokens.find((token: Token) => token.currency.symbol === "USDT"), - ].filter(isDefined); - - const routeQuery = await client.query<{ - createRoute: Route; - }>({ - uri: fsUri, - query: ` - query { - createRoute( - pools: $pools - inToken: $inToken - outToken: $outToken - ) - } - `, - variables: { - pools: pools, - inToken: inToken, - outToken: outToken, - }, - }); - expect(routeQuery.errors).toBeFalsy(); - expect(routeQuery.data?.createRoute).toBeTruthy(); - - const route: Route = routeQuery.data!.createRoute; - const uniRoute: uni.Route = new uni.Route(uniPools, toUniToken(inToken), toUniToken(outToken)); - - const midPriceInvocation = await client.invoke({ - uri: fsUri, - method: "routeMidPrice", - args: { - pools: pools, - inToken: inToken, - outToken: outToken, - }, - }); - if (midPriceInvocation.ok == false) fail(midPriceInvocation.error); - - const price = midPriceInvocation.value; - const uniPrice: uniCore.Price = uniRoute.midPrice; - expect(price?.price).toEqual(uniPrice.toFixed(18)); - expect(price).toStrictEqual(route.midPrice); - }); -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/router_mainnetFork.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/router_mainnetFork.spec.ts deleted file mode 100644 index 8eb7e84f3..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/router_mainnetFork.spec.ts +++ /dev/null @@ -1,315 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - MethodParameters, Pool, Tick, Token, TokenAmount, Trade, - getPools, getTokens, getUniPools, - getConfig, initInfra, stopInfra, buildDependencies -} from "../helpers"; -import path from "path"; -import * as uni from "@uniswap/v3-sdk"; -import * as uniCore from "@uniswap/sdk-core"; -import * as ethers from "ethers"; - -jest.setTimeout(360000); - -describe("SwapRouter (mainnet fork)", () => { - - let client: PolywrapClient; - let fsUri: string; - let tokens: Token[]; - let pools: Pool[]; - let uniPools: uni.Pool[]; - let ethersProvider: ethers.providers.BaseProvider; - - beforeAll(async () => { - await initInfra(); - // get client - const { sha3Uri, graphUri } = await buildDependencies(); - const config = getConfig(sha3Uri, graphUri); - client = new PolywrapClient(config); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - const sliceStart = 0; - const sliceEnd = 3; - pools = await getPools(client, fsUri, true, sliceStart, sliceEnd); - tokens = getTokens(pools); - // set up ethers provider - ethersProvider = ethers.providers.getDefaultProvider("http://localhost:8546"); - // get uni pools - const ticks: Tick[][] = pools.map((pool: Pool): Tick[] => pool.tickDataProvider); - const uniTicks: uni.Tick[][] = ticks.map(tickArr => tickArr.map(tick => new uni.Tick({ ...tick }))); - uniPools = await getUniPools(ethersProvider, true, sliceStart, sliceEnd, uniTicks); - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("successfully constructs method parameters with exactIn trades", async () => { - for (let i = 0; i < tokens.length; i++) { - for (let j = 0; j < tokens.length; j++) { - if (tokens[i] === tokens[j]) { - continue; - } - // get trade - const amountIn: TokenAmount = { - token: tokens[i], - amount: "10000000000" - } - const tokenOut = tokens[j]; - const query = await client.invoke({ - uri: fsUri, - method: "bestTradeExactIn", - args: { - pools: pools, - amountIn: amountIn, - tokenOut: tokenOut, - options: null, - }, - }); - if (query.ok == false) fail(query.error); - const bestTrades: Trade[] = query.value; - - // get expected best trades - const uniTokenIn: uniCore.Token = amountIn.token.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - amountIn.token.address, - amountIn.token.currency.decimals, - amountIn.token.currency.symbol || "", - amountIn.token.currency.name || "" - ); - const uniAmountIn: uniCore.CurrencyAmount = uniCore.CurrencyAmount.fromRawAmount(uniTokenIn, amountIn.amount); - const uniTokenOut: uniCore.Token = tokenOut.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - tokenOut.address, - tokenOut.currency.decimals, - tokenOut.currency.symbol || "", - tokenOut.currency.name || "" - ); - const uniBestTrades: uni.Trade[] = await uni.Trade.bestTradeExactIn(uniPools, uniAmountIn, uniTokenOut); - - expect(bestTrades.length).toStrictEqual(uniBestTrades.length); - if (bestTrades.length === 0) { - continue; - } - - // get method parameters - const routerQuery = await client.invoke({ - uri: fsUri, - method: "swapCallParameters", - args: { - trades: bestTrades, - options: { - slippageTolerance: "0.01", - recipient: '0x0000000000000000000000000000000000000003', - deadline: "123", - inputTokenPermit: null, - sqrtPriceLimitX96: null, - fee: null - } - } - }); - if (routerQuery.ok == false) fail(routerQuery.error); - const methodParameters: MethodParameters = routerQuery.value; - - // get uni method parameters - const uniMethodParameters: uni.MethodParameters = uni.SwapRouter.swapCallParameters(uniBestTrades, { - slippageTolerance: new uniCore.Percent(1, 100), - recipient: '0x0000000000000000000000000000000000000003', - deadline: "123", - }); - - // compare results - // if (methodParameters.calldata !== uniMethodParameters.calldata) { - // const acutalPaths = bestTrades.map(trade => trade.swaps.map(swap => swap.route.path.map(token => token.currency.symbol))); - // console.log("received: " + JSON.stringify(acutalPaths, null, 2)); - // const expectedPaths = uniBestTrades.map(trade => trade.swaps.map(swap => swap.route.tokenPath.map(token => token.symbol))); - // console.log("expected: " + JSON.stringify(expectedPaths, null, 2)); - // } - expect(methodParameters).toStrictEqual(uniMethodParameters); - } - } - }); - - it("successfully constructs method parameters with exactOut trades", async () => { - for (let i = 0; i < tokens.length; i++) { - for (let j = 0; j < tokens.length; j++) { - if (tokens[i] === tokens[j]) { - continue; - } - // get best trades - const tokenIn = tokens[i]; - const amountOut: TokenAmount = { - token: tokens[j], - amount: "10000000000" - } - const query = await client.invoke({ - uri: fsUri, - method: "bestTradeExactOut", - args: { - pools: pools, - tokenIn: tokenIn, - amountOut: amountOut, - options: null, - }, - }); - if (query.ok == false) fail(query.error); - const bestTrades: Trade[] = query.value; - - // get expected best trades - const uniTokenIn: uniCore.Token = tokenIn.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - tokenIn.address, - tokenIn.currency.decimals, - tokenIn.currency.symbol || "", - tokenIn.currency.name || "" - ); - const uniTokenOut: uniCore.Token = amountOut.token.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - amountOut.token.address, - amountOut.token.currency.decimals, - amountOut.token.currency.symbol || "", - amountOut.token.currency.name || "" - ); - const uniAmountOut: uniCore.CurrencyAmount = uniCore.CurrencyAmount.fromRawAmount( - uniTokenOut, amountOut.amount); - const uniBestTrades: uni.Trade[] = await uni.Trade.bestTradeExactOut(uniPools, uniTokenIn, uniAmountOut); - - expect(bestTrades.length).toStrictEqual(uniBestTrades.length); - if (bestTrades.length === 0) { - continue; - } - - // get method parameters - const routerQuery = await client.invoke({ - uri: fsUri, - method: "swapCallParameters", - args: { - trades: bestTrades, - options: { - slippageTolerance: "0.01", - recipient: '0x0000000000000000000000000000000000000003', - deadline: "123", - inputTokenPermit: null, - sqrtPriceLimitX96: null, - fee: null - } - } - }); - if (routerQuery.ok == false) fail(routerQuery.error); - const methodParameters: MethodParameters = routerQuery.value; - - // get uni method parameters - const uniMethodParameters: uni.MethodParameters = uni.SwapRouter.swapCallParameters(uniBestTrades, { - slippageTolerance: new uniCore.Percent(1, 100), - recipient: '0x0000000000000000000000000000000000000003', - deadline: "123", - }); - - // compare results - expect(methodParameters).toStrictEqual(uniMethodParameters); - } - } - }); - - it("successfully constructs method parameters with fee option", async () => { - for (let i = 0; i < tokens.length; i++) { - for (let j = 0; j < tokens.length; j++) { - if (tokens[i] === tokens[j]) { - continue; - } - // get trade - const amountIn: TokenAmount = { - token: tokens[i], - amount: "10000000000" - } - const tokenOut = tokens[j]; - const query = await client.invoke({ - uri: fsUri, - method: "bestTradeExactIn", - args: { - pools: pools, - amountIn: amountIn, - tokenOut: tokenOut, - options: null, - }, - }); - if (query.ok == false) fail(query.error); - const bestTrades: Trade[] = query.value; - - // get expected best trades - const uniTokenIn: uniCore.Token = amountIn.token.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - amountIn.token.address, - amountIn.token.currency.decimals, - amountIn.token.currency.symbol || "", - amountIn.token.currency.name || "" - ); - const uniAmountIn: uniCore.CurrencyAmount = uniCore.CurrencyAmount.fromRawAmount(uniTokenIn, amountIn.amount); - const uniTokenOut: uniCore.Token = tokenOut.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - tokenOut.address, - tokenOut.currency.decimals, - tokenOut.currency.symbol || "", - tokenOut.currency.name || "" - ); - const uniBestTrades: uni.Trade[] = await uni.Trade.bestTradeExactIn(uniPools, uniAmountIn, uniTokenOut); - - expect(bestTrades.length).toStrictEqual(uniBestTrades.length); - if (bestTrades.length === 0) { - continue; - } - - // get method parameters - const routerQuery = await client.invoke({ - uri: fsUri, - method: "swapCallParameters", - args: { - trades: bestTrades, - options: { - slippageTolerance: "0.01", - recipient: '0x0000000000000000000000000000000000000003', - deadline: "123", - inputTokenPermit: null, - sqrtPriceLimitX96: null, - fee: { - fee: "0.05", - recipient: '0x0000000000000000000000000000000000000003' - } - } - } - }); - if (routerQuery.ok == false) fail(routerQuery.error); - const methodParameters: MethodParameters = routerQuery.value; - - // get uni method parameters - const uniMethodParameters: uni.MethodParameters = uni.SwapRouter.swapCallParameters(uniBestTrades, { - slippageTolerance: new uniCore.Percent(1, 100), - recipient: '0x0000000000000000000000000000000000000003', - deadline: "123", - fee: { - fee: new uniCore.Percent(5, 100), - recipient: '0x0000000000000000000000000000000000000003' - } - }); - - // compare results - expect(methodParameters).toStrictEqual(uniMethodParameters); - } - } - }); - -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/swap_mainnetFork.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/swap_mainnetFork.spec.ts deleted file mode 100644 index 768878458..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/swap_mainnetFork.spec.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - ChainIdEnum, - Ethereum_TxResponse, FeeAmountEnum, - Pool, - SwapOptions, - Token, - TokenAmount, - Trade, TradeTypeEnum, - getPoolFromAddress, getTokens, - bestTradeExactOut, bestTradeExactIn, getNative, - getConfig, initInfra, stopInfra, buildDependencies -} from "../helpers"; -import path from "path"; -import * as ethers from "ethers"; -import erc20ABI from "../testData/erc20ABI.json"; - -jest.setTimeout(360000); - -describe("Swap (mainnet fork)", () => { - - const getSwapParams = (recipient: string): SwapOptions => ({ - slippageTolerance: "0.1", - recipient, - deadline: (new Date().getTime() / 1000 + 1800).toFixed(0), - }); - - const USDC_ETH_03_ADDRESS = "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8"; - const WBTC_USDC_03_ADDRESS = "0x99ac8cA7087fA4A2A1FB6357269965A2014ABc35"; - - let client: PolywrapClient; - let fsUri: string; - let tokens: Token[]; - let pools: Pool[]; - let ethersProvider: ethers.providers.JsonRpcProvider; - - beforeAll(async () => { - await initInfra(); - // get client - const { sha3Uri, graphUri } = await buildDependencies(); - const config = getConfig(sha3Uri, graphUri); - client = new PolywrapClient(config); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - pools = await Promise.all([ - getPoolFromAddress(client, fsUri, USDC_ETH_03_ADDRESS, true), - getPoolFromAddress(client, fsUri, WBTC_USDC_03_ADDRESS, true), - ]); - tokens = getTokens(pools); - // set up ethers provider - ethersProvider = new ethers.providers.JsonRpcProvider("http://localhost:8546"); - // approve token transfers - for (const token of tokens) { - const txResponse = await client.invoke({ - uri: fsUri, - method: "approve", - args: { token }, - }); - if (txResponse.ok == false) throw txResponse.error; - const approve: string = txResponse.value.hash; - const approveTx = await ethersProvider.getTransaction(approve); - await approveTx.wait(); - } - }); - - afterAll(async () => { - await stopInfra(); - }); - - it("execSwap: eth -> usdc -> wbtc -> eth", async () => { - const recipient = await ethersProvider.getSigner(0).getAddress(); - - const ETH: Token = await getNative(client, fsUri, ChainIdEnum.MAINNET); - const USDC: Token = tokens.find(token => token.currency.symbol === "USDC") as Token; - const WBTC: Token = tokens.find(token => token.currency.symbol === "WBTC") as Token; - - // eth -> usdc preparation - const usdcOut: TokenAmount = { token: USDC, amount: "10000000000" } - const ethUsdcTrade: Trade = (await bestTradeExactOut(client, fsUri, pools, ETH, usdcOut))[0]; - - // execSwap eth -> usdc - const ethUsdcQuery = await client.invoke({ - uri: fsUri, - method: "execSwap", - args: { - trades: [ethUsdcTrade], - swapOptions: getSwapParams(recipient), - }, - }); - if (ethUsdcQuery.ok == false) fail(ethUsdcQuery.error); - - const ethUsdcHash: string = ethUsdcQuery.value.hash ?? ""; - const ethUsdcTx = await ethersProvider.getTransaction(ethUsdcHash); - const ethUsdcTxResponse = await ethUsdcTx.wait(); - expect(ethUsdcTxResponse.status).toBeTruthy(); - - const usdcContract = new ethers.Contract(USDC.address, erc20ABI, ethersProvider); - const usdcBalance: ethers.BigNumber = await usdcContract.balanceOf(recipient); - expect(usdcBalance.eq(usdcOut.amount)).toBeTruthy(); - - // usdc -> wbtc preparation - const wbtcOut: TokenAmount = { token: WBTC, amount: "1000000" } - const usdcWbtcTrade: Trade = (await bestTradeExactOut(client, fsUri, pools, USDC, wbtcOut))[0]; - - // execSwap usdc -> wbtc - const usdcWbtcQuery = await client.invoke({ - uri: fsUri, - method: "execSwap", - args: { - trades: [usdcWbtcTrade], - swapOptions: getSwapParams(recipient), - }, - }); - if (usdcWbtcQuery.ok == false) fail(usdcWbtcQuery.error) - - const usdcWbtcHash: string = usdcWbtcQuery.value.hash ?? ""; - const usdcWbtcTx = await ethersProvider.getTransaction(usdcWbtcHash); - const usdcWbtcTxResponse = await usdcWbtcTx.wait(); - expect(usdcWbtcTxResponse.status).toBeTruthy(); - - const wbtcContract = new ethers.Contract(WBTC.address, erc20ABI, ethersProvider); - const wbtcBalance: ethers.BigNumber = await wbtcContract.balanceOf(recipient); - expect(wbtcBalance.eq(wbtcOut.amount)).toBeTruthy(); - - // wbtc -> eth preparation - const wbtcIn: TokenAmount = { token: WBTC, amount: wbtcOut.amount } - const wbtcEthTrade: Trade = (await bestTradeExactIn(client, fsUri, pools, wbtcIn, ETH))[0]; - - // execSwap wbtc -> eth - const wbtcEthQuery = await client.invoke({ - uri: fsUri, - method: "execSwap", - args: { - trades: [wbtcEthTrade], - swapOptions: getSwapParams(recipient), - }, - }); - if (wbtcEthQuery.ok == false) fail(wbtcEthQuery.error); - - const wbtcEthHash: string = wbtcEthQuery.value.hash ?? ""; - const wbtcEthTx = await ethersProvider.getTransaction(wbtcEthHash); - const wbtcEthTxResponse = await wbtcEthTx.wait(); - expect(wbtcEthTxResponse.status).toBeTruthy(); - - const finalWbtcBalance: ethers.BigNumber = await wbtcContract.balanceOf(recipient); - expect(finalWbtcBalance.eq(0)).toBeTruthy(); - }); - - it("swap: eth -> usdc", async () => { - const recipient = await ethersProvider.getSigner(1).getAddress(); - - const ETH: Token = await getNative(client, fsUri, ChainIdEnum.MAINNET); - const USDC: Token = tokens.find(token => token.currency.symbol === "USDC") as Token; - - const ethUsdcQuery = await client.invoke({ - uri: fsUri, - method: "swap", - args: { - inToken: ETH, - outToken: USDC, - fee: FeeAmountEnum.MEDIUM, - amount: "1000000000", - tradeType: TradeTypeEnum.EXACT_OUTPUT, - swapOptions: getSwapParams(recipient), - }, - }); - if (ethUsdcQuery.ok == false) fail (ethUsdcQuery.error); - - const ethUsdcHash: string = ethUsdcQuery.value.hash ?? ""; - const ethUsdcTx = await ethersProvider.getTransaction(ethUsdcHash); - const ethUsdcTxResponse = await ethUsdcTx.wait(); - expect(ethUsdcTxResponse.status).toBeTruthy(); - - const usdcContract = new ethers.Contract(USDC.address, erc20ABI, ethersProvider); - const usdcBalance: ethers.BigNumber = await usdcContract.balanceOf(recipient); - expect(usdcBalance.eq("1000000000")).toBeTruthy(); - }); - - it("swap: eth -> usdc; swapWithPool: usdc -> wbtc", async () => { - const recipient = await ethersProvider.getSigner().getAddress(); - - const ETH: Token = await getNative(client, fsUri, ChainIdEnum.MAINNET); - const USDC: Token = tokens.find(token => token.currency.symbol === "USDC") as Token; - const WBTC: Token = tokens.find(token => token.currency.symbol === "WBTC") as Token; - - const usdcContract = new ethers.Contract(USDC.address, erc20ABI, ethersProvider.getSigner(2)); - const startUsdcBalance: ethers.BigNumber = await usdcContract.balanceOf(recipient); - - const wbtcContract = new ethers.Contract(WBTC.address, erc20ABI, ethersProvider); - const startWbtcBalance: ethers.BigNumber = await wbtcContract.balanceOf(recipient); - expect(startWbtcBalance.eq(0)).toBeTruthy() - - const usdcOut = "1000000000"; - - // swap eth -> usdc - const ethUsdcQuery = await client.invoke({ - uri: fsUri, - method: "swap", - args: { - inToken: ETH, - outToken: USDC, - fee: FeeAmountEnum.MEDIUM, - amount: usdcOut, - tradeType: TradeTypeEnum.EXACT_OUTPUT, - swapOptions: getSwapParams(recipient), - }, - }); - if (ethUsdcQuery.ok == false) fail(ethUsdcQuery.error); - - const ethUsdcHash: string = ethUsdcQuery.value.hash ?? ""; - const ethUsdcTx = await ethersProvider.getTransaction(ethUsdcHash); - const ethUsdcTxResponse = await ethUsdcTx.wait(); - expect(ethUsdcTxResponse.status).toBeTruthy(); - - const usdcBalance: ethers.BigNumber = await usdcContract.balanceOf(recipient); - expect(usdcBalance.sub(usdcOut).eq(startUsdcBalance)).toBeTruthy(); - - // swapWithPool usdc -> wbtc - const usdcIn: TokenAmount = { token: USDC, amount: usdcBalance.toString() } - const usdcWbtcQuery = await client.invoke({ - uri: fsUri, - method: "swapWithPool", - args: { - address: WBTC_USDC_03_ADDRESS, - amount: usdcIn, - tradeType: TradeTypeEnum.EXACT_INPUT, - swapOptions: getSwapParams(recipient), - }, - }); - if (usdcWbtcQuery.ok == false) fail(usdcWbtcQuery.error); - - const usdcWbtcHash: string = usdcWbtcQuery.value.hash ?? ""; - const usdcWbtcTx = await ethersProvider.getTransaction(usdcWbtcHash); - const usdcWbtcTxResponse = await usdcWbtcTx.wait(); - expect(usdcWbtcTxResponse.status).toBeTruthy(); - - const endUsdcBalance: ethers.BigNumber = await usdcContract.balanceOf(recipient); - expect(endUsdcBalance.eq(0)).toBeTruthy(); - const endWbtcBalance: ethers.BigNumber = await wbtcContract.balanceOf(recipient); - expect(endWbtcBalance.gt(0)).toBeTruthy(); - }); -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/trade_mainnetFork.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/trade_mainnetFork.spec.ts deleted file mode 100644 index 948cad2de..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/mainnet-fork-tests/trade_mainnetFork.spec.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - ChainIdEnum, Pool, Tick, Token, TokenAmount, Trade, - getPools, getTokens, getUniPools, - getConfig, initInfra, stopInfra, buildDependencies -} from "../helpers"; -import path from "path"; -import * as uni from "@uniswap/v3-sdk"; -import * as uniCore from "@uniswap/sdk-core"; -import * as ethers from "ethers"; - -jest.setTimeout(360000); - -describe("Trade (mainnet fork)", () => { - - let client: PolywrapClient; - let fsUri: string; - let tokens: Token[]; - let pools: Pool[]; - let uniPools: uni.Pool[]; - let ethersProvider: ethers.providers.BaseProvider; - - beforeAll(async () => { - await initInfra(); - // get client - const { sha3Uri, graphUri } = await buildDependencies(); - const config = getConfig(sha3Uri, graphUri); - client = new PolywrapClient(config); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - const sliceStart = 0; - const sliceEnd = 3; - pools = await getPools(client, fsUri, true, sliceStart, sliceEnd); - tokens = getTokens(pools); - tokens.push({ - chainId: ChainIdEnum.MAINNET, - address: "", - currency: { - decimals: 18, - name: "Ether", - symbol: "ETH", - }, - }); - // set up ethers provider - ethersProvider = ethers.providers.getDefaultProvider("http://localhost:8546"); - // get uni pools - const ticks: Tick[][] = pools.map((pool: Pool): Tick[] => pool.tickDataProvider); - const uniTicks: uni.Tick[][] = ticks.map(tickArr => tickArr.map(tick => new uni.Tick({ ...tick }))); - uniPools = await getUniPools(ethersProvider, true, sliceStart, sliceEnd, uniTicks); - }); - - afterAll(async () => { - await stopInfra(); - }); - - it('finds the best trade for exact input (default options)', async () => { - for (let i = 0; i < tokens.length; i++) { - for (let j = 0; j < tokens.length; j++) { - if (tokens[i] === tokens[j]) { - continue; - } - // get best trades - const amountIn: TokenAmount = { - token: tokens[i], - amount: "10000000000" - } - const tokenOut = tokens[j]; - const query = await client.invoke({ - uri: fsUri, - method: "bestTradeExactIn", - args: { - pools: pools, - amountIn: amountIn, - tokenOut: tokenOut, - options: null, - }, - }); - if (query.ok == false) fail(query.error); - const actualTrades: Trade[] = query.value!; - - // get expected best trades - const uniTokenIn: uniCore.Token = amountIn.token.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - amountIn.token.address, - amountIn.token.currency.decimals, - amountIn.token.currency.symbol || "", - amountIn.token.currency.name || "" - ); - const uniAmountIn: uniCore.CurrencyAmount = uniCore.CurrencyAmount.fromRawAmount(uniTokenIn, amountIn.amount); - const uniTokenOut: uniCore.Token = tokenOut.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - tokenOut.address, - tokenOut.currency.decimals, - tokenOut.currency.symbol || "", - tokenOut.currency.name || "" - ); - const expectedTrades: uni.Trade[] = await uni.Trade.bestTradeExactIn(uniPools, uniAmountIn, uniTokenOut); - - // compare trade route paths - expect(actualTrades.length).toStrictEqual(expectedTrades.length); - for (let k = 0; k < actualTrades.length; k++) { - const actualTrade = actualTrades[k]; - const expectedTrade = expectedTrades[k]; - expect(actualTrade.swaps.length).toStrictEqual(expectedTrade.swaps.length); - for (let m = 0; m < actualTrade.swaps.length; m++) { - const actualRoutePath: string[] = actualTrade.swaps[m].route.path.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedTrade.swaps[m].route.tokenPath.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - } - // compare result amounts - for (let k = 0; k < actualTrades.length; k++) { - expect(actualTrades[k].outputAmount.amount).toStrictEqual(expectedTrades[k].outputAmount.numerator.toString()); - } - } - } - }); - - it('finds the best trade for exact output (default options)', async () => { - for (let i = 0; i < tokens.length; i++) { - for (let j = 0; j < tokens.length; j++) { - if (tokens[i] === tokens[j]) { - continue; - } - // get best trades - const tokenIn = tokens[i]; - const amountOut: TokenAmount = { - token: tokens[j], - amount: "10000000000" - } - const query = await client.invoke({ - uri: fsUri, - method: "bestTradeExactOut", - args: { - pools: pools, - tokenIn: tokenIn, - amountOut: amountOut, - options: null, - }, - }); - if (query.ok == false) fail(query.error); - const actualTrades: Trade[] = query.value!; - - // get expected best trades - const uniTokenIn: uniCore.Token = tokenIn.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - tokenIn.address, - tokenIn.currency.decimals, - tokenIn.currency.symbol || "", - tokenIn.currency.name || "" - ); - const uniTokenOut: uniCore.Token = amountOut.token.address === "" - ? uniCore.WETH9[1] - : new uniCore.Token( - 1, - amountOut.token.address, - amountOut.token.currency.decimals, - amountOut.token.currency.symbol || "", - amountOut.token.currency.name || "" - ); - const uniAmountOut: uniCore.CurrencyAmount = uniCore.CurrencyAmount.fromRawAmount( - uniTokenOut, amountOut.amount); - const expectedTrades: uni.Trade[] = await uni.Trade.bestTradeExactOut(uniPools, uniTokenIn, uniAmountOut); - - // compare trade route paths - // if (actualTrades.length !== expectedTrades.length) { - // const acutalPaths = actualTrades.map(trade => trade.swaps.map(swap => swap.route.path.map(token => token.currency.symbol))); - // console.log("received: " + JSON.stringify(acutalPaths, null, 2)); - // const expectedPaths = expectedTrades.map(trade => trade.swaps.map(swap => swap.route.tokenPath.map(token => token.symbol))); - // console.log("expected: " + JSON.stringify(expectedPaths, null, 2)); - // } - expect(actualTrades.length).toStrictEqual(expectedTrades.length); - for (let k = 0; k < actualTrades.length; k++) { - const actualTrade = actualTrades[k]; - const expectedTrade = expectedTrades[k]; - expect(actualTrade.swaps.length).toStrictEqual(expectedTrade.swaps.length); - for (let m = 0; m < actualTrade.swaps.length; m++) { - const actualRoutePath: string[] = actualTrade.swaps[m].route.path.map(token => token.address) ?? []; - const expectedRoutePath: string[] = expectedTrade.swaps[m].route.tokenPath.map(token => token.address); - expect(actualRoutePath).toStrictEqual(expectedRoutePath); - } - } - // compare result amounts - for (let k = 0; k < actualTrades.length; k++) { - expect(actualTrades[k].inputAmount.amount).toStrictEqual(expectedTrades[k].inputAmount.numerator.toString()); - } - } - } - }); - -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/encodeRouteToPath.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/encodeRouteToPath.spec.ts deleted file mode 100644 index 081d1ca96..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/encodeRouteToPath.spec.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - ChainIdEnum, - FeeAmountEnum, - Pool, - Route, - Token, - createPool, - encodeSqrtRatioX96, - createRoute, - encodeRouteToPath, - getFakeTestToken, -} from "../helpers"; -import path from "path"; - -jest.setTimeout(120000); - -describe('encodeRouteToPath (SDK test replication)', () => { - - const ETHER: Token = { - chainId: ChainIdEnum.MAINNET, - address: "", - currency: { - decimals: 18, - name: "Ether", - symbol: "ETH", - }, - } - const weth: Token = { - chainId: ChainIdEnum.MAINNET, - address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, - } - let token0: Token; - let token1: Token; - let token2: Token; - let pool_0_1_medium: Pool; - let pool_1_2_low: Pool; - let pool_0_weth: Pool; - let pool_1_weth: Pool; - let route_0_1: Route; - let route_0_1_2: Route; - let route_0_weth: Route; - let route_0_1_weth: Route; - let route_weth_0: Route; - let route_weth_0_1: Route; - - let client: PolywrapClient; - let fsUri: string; - - beforeAll(async () => { - // get client - client = new PolywrapClient(); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - token0 = getFakeTestToken(0); - token1 = getFakeTestToken(1); - token2 = getFakeTestToken(2); - pool_0_1_medium = await createPool(client, fsUri, token0, token1, FeeAmountEnum.MEDIUM, await encodeSqrtRatioX96(client, fsUri,1, 1), 0, 0, []); - pool_1_2_low = await createPool(client, fsUri, token1, token2, FeeAmountEnum.LOW, await encodeSqrtRatioX96(client, fsUri,1, 1), 0, 0, []); - pool_0_weth = await createPool(client, fsUri, token0, weth, FeeAmountEnum.MEDIUM, await encodeSqrtRatioX96(client, fsUri,1, 1), 0, 0, []); - pool_1_weth = await createPool(client, fsUri, token1, weth, FeeAmountEnum.MEDIUM, await encodeSqrtRatioX96(client, fsUri,1, 1), 0, 0, []); - route_0_1 = await createRoute(client, fsUri, [pool_0_1_medium], token0, token1); - route_0_1_2 = await createRoute(client, fsUri, [pool_0_1_medium, pool_1_2_low], token0, token2); - route_0_weth = await createRoute(client, fsUri, [pool_0_weth], token0, ETHER); - route_0_1_weth = await createRoute(client, fsUri, [pool_0_1_medium, pool_1_weth], token0, ETHER); - route_weth_0 = await createRoute(client, fsUri, [pool_0_weth], ETHER, token0); - route_weth_0_1 = await createRoute(client, fsUri, [pool_0_weth, pool_0_1_medium], ETHER, token1); - }); - - it('packs them for exact input single hop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_0_1, false)).toEqual( - '0x0000000000000000000000000000000000000001000bb80000000000000000000000000000000000000002' - ) - }) - - it('packs them correctly for exact output single hop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_0_1, true)).toEqual( - '0x0000000000000000000000000000000000000002000bb80000000000000000000000000000000000000001' - ) - }) - - it('packs them correctly for multihop exact input', async () => { - expect(await encodeRouteToPath(client, fsUri, route_0_1_2, false)).toEqual( - '0x0000000000000000000000000000000000000001000bb800000000000000000000000000000000000000020001f40000000000000000000000000000000000000003' - ) - }) - - it('packs them correctly for multihop exact output', async () => { - expect(await encodeRouteToPath(client, fsUri, route_0_1_2, true)).toEqual( - '0x00000000000000000000000000000000000000030001f40000000000000000000000000000000000000002000bb80000000000000000000000000000000000000001' - ) - }) - - it('wraps ether input for exact input single hop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_weth_0, false)).toEqual( - '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000001' - ) - }) - it('wraps ether input for exact output single hop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_weth_0, true)).toEqual( - '0x0000000000000000000000000000000000000001000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' - ) - }) - it('wraps ether input for exact input multihop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_weth_0_1, false)).toEqual( - '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000001000bb80000000000000000000000000000000000000002' - ) - }) - it('wraps ether input for exact output multihop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_weth_0_1, true)).toEqual( - '0x0000000000000000000000000000000000000002000bb80000000000000000000000000000000000000001000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' - ) - }) - - it('wraps ether output for exact input single hop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_0_weth, false)).toEqual( - '0x0000000000000000000000000000000000000001000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' - ) - }) - it('wraps ether output for exact output single hop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_0_weth, true)).toEqual( - '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000001' - ) - }) - it('wraps ether output for exact input multihop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_0_1_weth, false)).toEqual( - '0x0000000000000000000000000000000000000001000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' - ) - }) - it('wraps ether output for exact output multihop', async () => { - expect(await encodeRouteToPath(client, fsUri, route_0_1_weth, true)).toEqual( - '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000001' - ) - }) -}) diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/multicall.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/multicall.spec.ts deleted file mode 100644 index 44015e7b2..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/multicall.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import path from "path"; -import { encodeMulticall } from "../helpers"; - -jest.setTimeout(120000); - -describe('Multicall (SDK test replication)', () => { - - let client: PolywrapClient; - let fsUri: string; - - beforeAll(async () => { - // get client - client = new PolywrapClient(); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - }); - - describe('encodeMulticall', () => { - it('works for string array with length 1', async () => { - const calldata = await encodeMulticall(client, fsUri, ['0x01']); - expect(calldata).toBe('0x01'); - }); - - it('works for string array with length >1', async () => { - const calldata = await encodeMulticall(client, fsUri, [ - '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' - ]); - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000000000020bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' - ); - }); - }); -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/nfpm.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/nfpm.spec.ts deleted file mode 100644 index a8b39f74b..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/nfpm.spec.ts +++ /dev/null @@ -1,449 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import path from "path"; -import { - createPool, - encodeSqrtRatioX96, - createCallParameters, - addCallParameters, - collectCallParameters, - removeCallParameters, - safeTransferFromParameters, - feeAmountToTickSpacing, - createPosition, - ChainIdEnum, - FeeAmountEnum, - Pool, - SafeTransferOptions, - Token, - TokenAmount, - getFakeTestToken -} from "../helpers"; - -jest.setTimeout(120000); - -describe('NonfungiblePositionManager (SDK test replication)', () => { - const recipient = '0x0000000000000000000000000000000000000003'; - const sender = '0x0000000000000000000000000000000000000004'; - const tokenId = "1"; - const slippageTolerance = "0.01"; - const deadline = "123"; - - const ETHER: Token = { - chainId: ChainIdEnum.MAINNET, - address: "", - currency: { - decimals: 18, - name: "Ether", - symbol: "ETH", - }, - } - const weth: Token = { - chainId: ChainIdEnum.MAINNET, - address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, - }; - - let token0: Token; - let token1: Token; - let pool_0_1: Pool; - let pool_1_weth: Pool; - - let client: PolywrapClient; - let fsUri: string; - - beforeAll(async () => { - // get client - client = new PolywrapClient(); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - token0 = getFakeTestToken(0); - token1 = getFakeTestToken(1); - const sqrtRatioX96: string = await encodeSqrtRatioX96(client, fsUri, 1, 1); - pool_0_1 = await createPool(client, fsUri, token0, token1, FeeAmountEnum.MEDIUM, sqrtRatioX96, 0, 0, []); - pool_1_weth = await createPool(client, fsUri, token1, weth, FeeAmountEnum.MEDIUM, sqrtRatioX96, 0, 0, []); - }); - - describe('createCallParameters', () => { - it('succeeds', async () => { - const { calldata, value } = await createCallParameters(client, fsUri, pool_0_1); - - expect(calldata).toEqual( - '0x13ead562000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000001000000000000000000000000' - ) - expect(value).toEqual('0x00') - }) - }) - - describe('addCallParameters', () => { - it('throws if liquidity is 0', async () => { - await expect( - addCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 0 - ), - { recipient, slippageTolerance, deadline } - ) - ).rejects.toThrow("ZERO_LIQUIDITY: position liquidity must exceed zero"); - }); - - it('throws if pool does not involve ether and useNative is true', async () => { - await expect( - addCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 1 - ), - { recipient, slippageTolerance, deadline, useNative: ETHER } - ) - ).rejects.toThrow("NO_WETH: the native token provided with the useNative option must be involved in the position pool"); - }); - - it('succeeds for mint', async () => { - const { calldata, value } = await addCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 1 - ), - { recipient, slippageTolerance, deadline } - ); - - expect(calldata).toEqual( - '0x88316456000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b' - ); - expect(value).toEqual('0x00'); - }); - - it('succeeds for increase', async () => { - const { calldata, value } = await addCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 1 - ), - { tokenId, slippageTolerance, deadline } - ); - - expect(calldata).toEqual( - '0x219f5d1700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b' - ); - expect(value).toEqual('0x00'); - }); - - it('createPool', async () => { - const { calldata, value } = await addCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 1 - ), - { recipient, slippageTolerance, deadline, createPool: true } - ); - - expect(calldata).toEqual( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000008413ead562000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016488316456000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000' - ); - expect(value).toEqual('0x00'); - }); - - it('useNative', async () => { - const { calldata, value } = await addCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_1_weth, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 1 - ), - { recipient, slippageTolerance, deadline, useNative: ETHER } - ); - - expect(calldata).toEqual( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000164883164560000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a00000000000000000000000000000000000000000000000000000000' - ); - expect(value).toEqual('0x01'); - }); - }); - - describe('collectCallParameters', () => { - it('works', async () => { - const { calldata, value } = await collectCallParameters(client, fsUri, { - tokenId, - expectedCurrencyOwed0: { token: token0, amount: "0" }, - expectedCurrencyOwed1: { token: token1, amount: "0" }, - recipient - }); - - expect(calldata).toEqual( - '0xfc6f78650000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff' - ); - expect(value).toEqual('0x00'); - }); - - it('works with eth', async () => { - const { calldata, value } = await collectCallParameters(client, fsUri, { - tokenId, - expectedCurrencyOwed0: { token: token1, amount: "0" }, - expectedCurrencyOwed1: { token: ETHER, amount: "0" }, - recipient - }); - - expect(calldata).toEqual( - '0xac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000084fc6f78650000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064df2ab5bb00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ); - expect(value).toEqual('0x00'); - }); - }); - - describe('removeCallParameters', () => { - it('throws for 0 liquidity', async () => { - await expect(async () => - removeCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 0 - ), - { - tokenId, - liquidityPercentage: "1", - slippageTolerance, - deadline, - collectOptions: { - tokenId, - expectedCurrencyOwed0: { token: token0, amount: "0" }, - expectedCurrencyOwed1: { token: token1, amount: "0" }, - recipient - } - } - ) - ).rejects.toThrow('ZERO_LIQUIDITY'); - }); - - it('throws for 0 liquidity from small percentage', async () => { - await expect(async () => - removeCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 50 - ), - { - tokenId, - liquidityPercentage: "0.01", - slippageTolerance, - deadline, - collectOptions: { - tokenId, - expectedCurrencyOwed0: { token: token0, amount: "0" }, - expectedCurrencyOwed1: { token: token1, amount: "0" }, - recipient - } - } - ) - ).rejects.toThrow('ZERO_LIQUIDITY'); - }); - - it('throws for bad burn', async () => { - await expect(async () => - removeCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 50 - ), - { - tokenId, - liquidityPercentage: "0.99", - slippageTolerance, - deadline, - burnToken: true, - collectOptions: { - tokenId, - expectedCurrencyOwed0: { token: token0, amount: "0" }, - expectedCurrencyOwed1: { token: token1, amount: "0" }, - recipient - } - } - ) - ).rejects.toThrow('CANNOT_BURN'); - }); - - it('works', async () => { - const { calldata, value } = await removeCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 100 - ), - { - tokenId, - liquidityPercentage: "1", - slippageTolerance, - deadline, - collectOptions: { - tokenId, - expectedCurrencyOwed0: { token: token0, amount: "0" }, - expectedCurrencyOwed1: { token: token1, amount: "0" }, - recipient - } - } - ); - - expect(calldata).toEqual( - '0xac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a40c49ccbe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f78650000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000' - ); - expect(value).toEqual('0x00'); - }); - - it('works for partial', async () => { - const { calldata, value } = await removeCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_0_1, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 100 - ), - { - tokenId, - liquidityPercentage: "0.5", - slippageTolerance, - deadline, - collectOptions: { - tokenId, - expectedCurrencyOwed0: { token: token0, amount: "0" }, - expectedCurrencyOwed1: { token: token1, amount: "0" }, - recipient - } - } - ); - - expect(calldata).toEqual( - '0xac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a40c49ccbe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f78650000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000' - ); - expect(value).toEqual('0x00'); - }); - - it('works with eth', async () => { - const ethAmount: TokenAmount = { - token: ETHER, - amount: "0", - } - const tokenAmount: TokenAmount = { - token: token1, - amount: "0", - } - const { calldata, value } = await removeCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_1_weth, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 100 - ), - { - tokenId, - liquidityPercentage: "1", - slippageTolerance, - deadline, - collectOptions: { - tokenId, - expectedCurrencyOwed0: pool_1_weth.token0.address === token1.address ? tokenAmount : ethAmount, - expectedCurrencyOwed1: pool_1_weth.token0.address === token1.address ? ethAmount : tokenAmount, - recipient - } - } - ); - - expect(calldata).toEqual( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000a40c49ccbe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f78650000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064df2ab5bb00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ); - expect(value).toEqual('0x00'); - }); - - it('works for partial with eth', async () => { - const ethAmount: TokenAmount = { - token: ETHER, - amount: "0", - }; - const tokenAmount: TokenAmount = { - token: token1, - amount: "0", - }; - - const { calldata, value } = await removeCallParameters(client, fsUri, - await createPosition(client, fsUri, - pool_1_weth, - -(await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM)), - await feeAmountToTickSpacing(client, fsUri, FeeAmountEnum.MEDIUM), - 100 - ), - { - tokenId, - liquidityPercentage: "0.5", - slippageTolerance, - deadline, - collectOptions: { - tokenId, - expectedCurrencyOwed0: pool_1_weth.token0.address === token1.address ? tokenAmount : ethAmount, - expectedCurrencyOwed1: pool_1_weth.token0.address === token1.address ? ethAmount : tokenAmount, - recipient - } - } - ); - - expect(calldata).toEqual( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000a40c49ccbe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084fc6f78650000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064df2ab5bb00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ); - expect(value).toEqual('0x00') - }); - }); - - describe('safeTransferFromParameters', () => { - it('succeeds no data param', async () => { - const options: SafeTransferOptions = { - sender, - recipient, - tokenId - }; - const { calldata, value } = await safeTransferFromParameters(client, fsUri, options); - - expect(calldata).toEqual( - '0x42842e0e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001' - ); - expect(value).toEqual('0x00') - }); - - it('succeeds data param', async () => { - const data = '0x0000000000000000000000000000000000009004'; - const options: SafeTransferOptions = { - sender, - recipient, - tokenId, - data - } - const { calldata, value } = await safeTransferFromParameters(client, fsUri, options); - - expect(calldata).toEqual( - '0xb88d4fde000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000009004000000000000000000000000' - ); - expect(value).toEqual('0x00') - }); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/payments.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/payments.spec.ts deleted file mode 100644 index 681c5dbf8..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/payments.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { - FeeOptions, - Token, - encodeUnwrapWETH9, - encodeSweepToken, - encodeRefundETH, - getFakeTestToken -} from "../helpers"; -import { PolywrapClient } from "@polywrap/client-js"; -import path from "path"; - -jest.setTimeout(120000); - -describe('Payments (SDK test replication)', () => { - - const recipient = '0x0000000000000000000000000000000000000003'; - const amount = 123; - const feeOptions: FeeOptions = { - fee: "0.001", - recipient: '0x0000000000000000000000000000000000000009', - } - - let token: Token; - - let client: PolywrapClient; - let fsUri: string; - - beforeAll(async () => { - // get client - client = new PolywrapClient(); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - token = getFakeTestToken(0); - }); - - - describe('encodeUnwrapWETH9', () => { - it('works without feeOptions', async () => { - const calldata: string = await encodeUnwrapWETH9(client, fsUri, amount, recipient); - expect(calldata).toBe( - '0x49404b7c000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000003' - ) - }) - - it('works with feeOptions', async () => { - const calldata: string = await encodeUnwrapWETH9(client, fsUri, amount, recipient, feeOptions) - expect(calldata).toBe( - '0x9b2c0a37000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009' - ) - }) - }) - - describe('encodeSweepToken', () => { - it('works without feeOptions', async () => { - const calldata: string = await encodeSweepToken(client, fsUri, token, amount, recipient) - expect(calldata).toBe( - '0xdf2ab5bb0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000003' - ) - }) - - it('works with feeOptions', async () => { - const calldata: string = await encodeSweepToken(client, fsUri, token, amount, recipient, feeOptions) - expect(calldata).toBe( - '0xe0e189a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009' - ) - }) - }) - - it('encodeRefundETH', async () => { - const calldata: string = await encodeRefundETH(client, fsUri); - expect(calldata).toBe('0x12210e8a') - }) -}) diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/quoter.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/quoter.spec.ts deleted file mode 100644 index e30f66f57..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/quoter.spec.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { - encodeSqrtRatioX96, - createPool, - createTradeFromRoute, - getTickAtSqrtRatio, - nearestUsableTick, - feeAmountToTickSpacing, - constant, - createRoute, - quoteCallParameters, - Token, ChainIdEnum, FeeAmountEnum, Pool, Trade, TradeTypeEnum, MethodParameters -} from "../helpers"; -import { PolywrapClient } from "@polywrap/client-js"; -import path from "path"; - -jest.setTimeout(120000); - -const makePool = async (client: PolywrapClient, fsUri: string, token0: Token, token1: Token) => { - const feeAmount = FeeAmountEnum.MEDIUM; - const liquidity = 1_000_000; - const tickSpacing = await feeAmountToTickSpacing(client, fsUri, feeAmount); - const tickIndex0 = await nearestUsableTick(client, fsUri, await constant(client, fsUri, "MIN_TICK"), tickSpacing); - const tickIndex1 = await nearestUsableTick(client, fsUri, await constant(client, fsUri, "MAX_TICK"), tickSpacing); - const sqrtRatioX96 = await encodeSqrtRatioX96(client, fsUri, 1, 1); - const tickCurrent = await getTickAtSqrtRatio(client, fsUri, sqrtRatioX96); - return createPool(client, fsUri, token0, token1, feeAmount, sqrtRatioX96, liquidity, tickCurrent, [ - { - index: tickIndex0, - liquidityNet: liquidity.toString(), - liquidityGross: liquidity.toString() - }, - { - index: tickIndex1, - liquidityNet: (-liquidity).toString(), - liquidityGross: liquidity.toString() - } - ]); -}; - -const token0: Token = { - chainId: ChainIdEnum.MAINNET, - address: "0x0000000000000000000000000000000000000001", - currency: { - decimals: 18, - symbol: "t0", - name: "token0", - } -} -const token1: Token = { - chainId: ChainIdEnum.MAINNET, - address: "0x0000000000000000000000000000000000000002", - currency: { - decimals: 18, - symbol: "t1", - name: "token1", - } -} -const WETH: Token = { - chainId: ChainIdEnum.MAINNET, - address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, -}; -let pool_0_1: Pool; -let pool_1_weth: Pool; - -describe('SwapQuoter (SDK test replication)', () => { - - - let client: PolywrapClient; - let fsUri: string; - - beforeAll(async () => { - // get client - client = new PolywrapClient(); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - pool_0_1 = await makePool(client, fsUri, token0, token1); - pool_1_weth = await makePool(client, fsUri, token1, WETH); - }); - - describe('quoter swapCallParameters', () => { - describe('single trade input', () => { - it('single-hop exact input', async () => { - const trade: Trade = await createTradeFromRoute(client, fsUri,{ - route: await createRoute(client, fsUri, [pool_0_1], token0, token1 ), - amount: { - token: token0, - amount: "100", - } - }, - TradeTypeEnum.EXACT_INPUT - ); - const params: MethodParameters = await quoteCallParameters(client, fsUri, - trade.swaps[0].route, - trade.inputAmount, - trade.tradeType - ); - - expect(params.calldata).toStrictEqual( - '0xf7729d43000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb800000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000000' - ); - expect(params.value).toStrictEqual('0x00'); - }); - - it('single-hop exact output', async () => { - const trade: Trade = await createTradeFromRoute(client, fsUri,{ - route: await createRoute(client, fsUri, [pool_0_1], token0, token1 ), - amount: { - token: token1, - amount: "100", - } - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const params: MethodParameters = await quoteCallParameters(client, fsUri, - trade.swaps[0].route, - trade.outputAmount, - trade.tradeType - ); - - expect(params.calldata).toBe( - '0x30d07f21000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb800000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000000' - ); - expect(params.value).toBe('0x00'); - }); - - it('multi-hop exact input', async () => { - const trade: Trade = await createTradeFromRoute(client, fsUri,{ - route: await createRoute(client, fsUri, [pool_0_1, pool_1_weth], token0, WETH ), - amount: { - token: token0, - amount: "100", - } - }, - TradeTypeEnum.EXACT_INPUT - ); - const params: MethodParameters = await quoteCallParameters(client, fsUri, - trade.swaps[0].route, - trade.inputAmount, - trade.tradeType - ); - - expect(params.calldata).toBe( - '0xcdca17530000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000' - ); - expect(params.value).toBe('0x00'); - }); - - it('multi-hop exact output', async () => { - const trade: Trade = await createTradeFromRoute(client, fsUri,{ - route: await createRoute(client, fsUri, [pool_0_1, pool_1_weth], token0, WETH ), - amount: { - token: WETH, - amount: "100", - } - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const params: MethodParameters = await quoteCallParameters(client, fsUri, - trade.swaps[0].route, - trade.outputAmount, - trade.tradeType - ); - - expect(params.calldata).toBe( - '0x2f80bb1d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000042c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000' - ); - expect(params.value).toBe('0x00'); - }); - - it('sqrtPriceLimitX96', async () => { - const trade: Trade = await createTradeFromRoute(client, fsUri,{ - route: await createRoute(client, fsUri, [pool_0_1], token0, token1 ), - amount: { - token: token0, - amount: "100", - } - }, - TradeTypeEnum.EXACT_INPUT - ); - const params: MethodParameters = await quoteCallParameters(client, fsUri, - trade.swaps[0].route, - trade.inputAmount, - trade.tradeType, - { - sqrtPriceLimitX96: "340282366920938463463374607431768211456", - }, - ); - - expect(params.calldata).toBe( - '0xf7729d43000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb800000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000100000000000000000000000000000000' - ); - expect(params.value).toBe('0x00'); - }); - }); - }); -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/router.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/router.spec.ts deleted file mode 100644 index 92d9d3f5a..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/router.spec.ts +++ /dev/null @@ -1,1277 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import path from "path"; -import { - createPool, - encodeSqrtRatioX96, - getTickAtSqrtRatio, - nearestUsableTick, - constant, - feeAmountToTickSpacing, createTradeFromRoute, createTradeFromRoutes, createRoute, swapCallParameters, - getFakeTestToken, - ChainIdEnum, FeeAmountEnum, Pool, Token, Trade, TradeTypeEnum -} from "../helpers"; - -jest.setTimeout(120000); - -const twoPow128: string = "340282366920938463463374607431768211456"; - -describe('SwapRouter (SDK test replication)', () => { - - const makePool = async (token0: Token, token1: Token) => { - const feeAmount = FeeAmountEnum.MEDIUM; - const liquidity = 1_000_000; - const tickSpacing = await feeAmountToTickSpacing(client, fsUri, feeAmount); - const tickIndex0 = await nearestUsableTick(client, fsUri, await constant(client, fsUri, "MIN_TICK"), tickSpacing); - const tickIndex1 = await nearestUsableTick(client, fsUri, await constant(client, fsUri, "MAX_TICK"), tickSpacing); - const sqrtRatioX96 = await encodeSqrtRatioX96(client, fsUri, 1, 1); - const tickCurrent = await getTickAtSqrtRatio(client, fsUri, sqrtRatioX96); - return createPool(client, fsUri, token0, token1, feeAmount, sqrtRatioX96, liquidity, tickCurrent, [ - { - index: tickIndex0, - liquidityNet: liquidity.toString(), - liquidityGross: liquidity.toString() - }, - { - index: tickIndex1, - liquidityNet: (-liquidity).toString(), - liquidityGross: liquidity.toString() - } - ]); - }; - - const slippageTolerance = "0.01"; - const recipient = '0x0000000000000000000000000000000000000003'; - const deadline = 123; - - const ETHER: Token = { - chainId: ChainIdEnum.MAINNET, - address: "", - currency: { - decimals: 18, - name: "Ether", - symbol: "ETH", - }, - }; - const WETH: Token = { - chainId: ChainIdEnum.MAINNET, - address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - currency: { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", - }, - }; - let token0: Token; - let token1: Token; - let token2: Token; - let token3: Token; - - let pool_0_1: Pool; - let pool_1_weth: Pool; - let pool_0_2: Pool; - let pool_0_3: Pool; - let pool_2_3: Pool; - let pool_3_weth: Pool; - let pool_1_3: Pool; - - let client: PolywrapClient; - let fsUri: string; - - beforeAll(async () => { - // get client - client = new PolywrapClient(); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - token0 = getFakeTestToken(0); - token1 = getFakeTestToken(1); - token2 = getFakeTestToken(2); - token3 = getFakeTestToken(3); - pool_0_1 = await makePool(token0, token1); - pool_1_weth = await makePool(token1, WETH); - pool_0_2 = await makePool(token0, token2); - pool_0_3 = await makePool(token0, token3); - pool_2_3 = await makePool(token2, token3); - pool_3_weth = await makePool(token3, WETH); - pool_1_3 = await makePool(token3, token1); - }); - - describe('swapCallParameters', () => { - describe('single trade input', () => { - it('single-hop exact input', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString() - }); - - expect(calldata).toBe( - '0x414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000000' - ); - expect(value).toBe('0x00'); - }); - - it('single-hop exact output', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token1, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString() - }); - - expect(calldata).toBe( - '0xdb3e2198000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000000' - ); - expect(value).toBe('0x00'); - }); - - it('multi-hop exact input', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1, pool_1_weth], token0, WETH), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString() - }); - - expect(calldata).toBe( - '0xc04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('multi-hop exact output', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1, pool_1_weth], token0, WETH), - amount: { - token: WETH, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString() - }); - - expect(calldata).toBe( - '0xf28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000042c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('ETH in exact input', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth], ETHER, token1), - amount: { - token: ETHER, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString() - }); - - expect(calldata).toBe( - '0x414bf389000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x64') - }) - - it('ETH in exact output', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth], ETHER, token1), - amount: { - token: token1, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString() - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a00000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x67') - }) - - it('ETH out exact input', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth], token1, ETHER), - amount: { - token: token1, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString() - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf3890000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c0000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('ETH out exact output', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth], token1, ETHER), - amount: { - token: ETHER, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString() - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104db3e21980000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('sqrtPriceLimitX96', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - sqrtPriceLimitX96: twoPow128, - }); - - expect(calldata).toBe( - '0x414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000100000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('fee with eth out', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth], token1, ETHER), - amount: { - token: token1, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - fee: { - fee: "0.005", - recipient - } - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf3890000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000849b2c0a37000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('fee with eth in using exact output', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth], ETHER, token1), - amount: { - token: token1, - amount: "10", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - fee: { - fee: "0.005", - recipient - } - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4e0e189a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a00000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x0c') - }) - - it('fee', async () => { - const trade: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - fee: { - fee: "0.005", - recipient - } - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4e0e189a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - }) - }) - - describe('multiple trade input', () => { - it('two single-hop exact input', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('one single-hop one multi-hop exact input', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000003000bb8000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('two multi-hop exact input', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1, pool_1_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000003000bb8000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('ETH in exact input', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth, pool_1_3], ETHER, token3), - amount: { - token: ETHER, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_3_weth], ETHER, token3), - amount: { - token: ETHER, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000042c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0xc8') - }) - - it('ETH in exact output', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth, pool_1_3], ETHER, token3), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_3_weth], ETHER, token3), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a00000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0xd0') - }) - - it('ETH out exact input', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_3, pool_1_weth], token3, ETHER), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_3_weth], token3, ETHER), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104414bf3890000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('ETH out exact output', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_3, pool_1_weth], token3, ETHER), - amount: { - token: ETHER, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_3_weth], token3, ETHER), - amount: { - token: ETHER, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000042c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104db3e21980000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('two single-hop exact output', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token1, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token1, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('one single-hop one multi-hop exact output', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_3], token0, token3), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000003000bb8000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('two multi-hop exact output', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1, pool_1_3], token0, token3), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000003000bb8000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('different token in fails ', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_2_3], token2, token3), - amount: { - token: token2, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - - await expect(() => - swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }) - ).rejects.toThrow("TOKEN_IN_DIFF: the input token of the trades must match") - }) - - it('different token out fails ', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1, pool_1_weth], token0, WETH), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - - await expect(() => - swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }) - ).rejects.toThrow("TOKEN_OUT_DIFF: the output token of the trades must match") - }) - - it('sqrtPriceLimitX96', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1], token0, token1), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - sqrtPriceLimitX96: twoPow128, - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('fee with eth out', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_3, pool_1_weth], token3, ETHER), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_3_weth], token3, ETHER), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - fee: { - fee: "0.005", - recipient - } - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104414bf3890000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000849b2c0a3700000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('fee with eth in using exact output', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_1_weth, pool_1_3], ETHER, token3), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_3_weth], ETHER, token3), - amount: { - token: token3, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - fee: { - fee: "0.005", - recipient - } - }); - - expect(calldata).toBe( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4e0e189a0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a00000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0xd0') - }) - - it('fee', async () => { - const trade1: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_1, pool_1_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const trade2: Trade = await createTradeFromRoute( - client, - fsUri, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade1, trade2], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - fee: { - fee: "0.005", - recipient - } - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000003000bb800000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4e0e189a0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - }) - - describe('trade with multiple routes', () => { - it('one single-hop one multi-hop exact input', async () => { - const trade: Trade = await createTradeFromRoutes( - client, - fsUri, - [{ - route: await createRoute(client, fsUri, [pool_0_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }], - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000003000bb8000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('two multi-hop exact input', async () => { - const trade: Trade = await createTradeFromRoutes( - client, - fsUri, - [{ - route: await createRoute(client, fsUri, [pool_0_1, pool_1_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token0, - amount: "100", - }, - }], - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000001000bb80000000000000000000000000000000000000003000bb8000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('ETH in exact input', async () => { - const trade: Trade = await createTradeFromRoutes( - client, - fsUri, - [{ - route: await createRoute(client, fsUri, [pool_1_weth, pool_1_3], ETHER, token3), - amount: { - token: ETHER, - amount: "100", - }, - }, - { - route: await createRoute(client, fsUri, [pool_3_weth], ETHER, token3), - amount: { - token: ETHER, - amount: "100", - }, - }], - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000042c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0xc8') - }) - - it('ETH in exact output', async () => { - const trade: Trade = await createTradeFromRoutes( - client, - fsUri, - [{ - route: await createRoute(client, fsUri, [pool_1_weth, pool_1_3], ETHER, token3), - amount: { - token: token3, - amount: "100", - }, - }, - { - route: await createRoute(client, fsUri, [pool_3_weth], ETHER, token3), - amount: { - token: token3, - amount: "100", - }, - }], - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a00000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0xd0') - }) - - it('ETH out exact input', async () => { - const trade: Trade = await createTradeFromRoutes( - client, - fsUri, - [{ - route: await createRoute(client, fsUri, [pool_1_3, pool_1_weth], token3, ETHER), - amount: { - token: token3, - amount: "100", - }, - }, - { - route: await createRoute(client, fsUri, [pool_3_weth], token3, ETHER), - amount: { - token: token3, - amount: "100", - }, - }], - TradeTypeEnum.EXACT_INPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000144c04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000002000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104414bf3890000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('ETH out exact output', async () => { - const trade: Trade = await createTradeFromRoutes( - client, - fsUri, - [{ - route: await createRoute(client, fsUri, [pool_1_3, pool_1_weth], token3, ETHER), - amount: { - token: ETHER, - amount: "100", - }, - }, - { - route: await createRoute(client, fsUri, [pool_3_weth], token3, ETHER), - amount: { - token: ETHER, - amount: "100", - }, - }], - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000042c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104db3e21980000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('one single-hop one multi-hop exact output', async () => { - const trade: Trade = await createTradeFromRoutes( - client, - fsUri, - [{ - route: await createRoute(client, fsUri, [pool_0_3], token0, token3), - amount: { - token: token3, - amount: "100", - }, - }, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token3, - amount: "100", - }, - }], - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104db3e2198000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000003000bb8000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - - it('two multi-hop exact output', async () => { - const trade: Trade = await createTradeFromRoutes( - client, - fsUri, - [{ - route: await createRoute(client, fsUri, [pool_0_1, pool_1_3], token0, token3), - amount: { - token: token3, - amount: "100", - }, - }, - { - route: await createRoute(client, fsUri, [pool_0_2, pool_2_3], token0, token3), - amount: { - token: token3, - amount: "100", - }, - }], - TradeTypeEnum.EXACT_OUTPUT - ); - const { calldata, value } = await swapCallParameters(client, fsUri, [trade], { - slippageTolerance, - recipient, - deadline: deadline.toString(), - }); - - expect(calldata).toBe( - '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000002000bb80000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f28c0498000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000004000bb80000000000000000000000000000000000000003000bb8000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toBe('0x00') - }) - }) -}) \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/staker.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/staker.spec.ts deleted file mode 100644 index 569caac6d..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/sdk-test-replications/staker.spec.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { PolywrapClient } from "@polywrap/client-js"; -import { - getFakeTestToken, - ChainIdEnum, FeeAmountEnum, IncentiveKey, Pool, Token, - createPool, encodeSqrtRatioX96, collectRewards, withdrawToken, encodeDeposit, safeTransferFromParameters, -} from "../helpers"; -import path from "path"; - -jest.setTimeout(120000); - -describe('Staker (SDK test replication)', () => { - - const recipient = '0x0000000000000000000000000000000000000003'; - const sender = '0x0000000000000000000000000000000000000004'; - const tokenId = "1"; - const reward: Token = { - chainId: ChainIdEnum.MAINNET, - address:'0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', - currency: { - decimals: 18, - symbol: 'r', - name: 'reward', - }, - }; - - let token0: Token; - let token1: Token; - let pool_0_1: Pool; - let incentiveKey: IncentiveKey; - let incentiveKeys: IncentiveKey[]; - - let client: PolywrapClient; - let fsUri: string; - - beforeAll(async () => { - // get client - client = new PolywrapClient(); - // get uri - const wrapperAbsPath: string = path.resolve(__dirname + "/../../../../"); - fsUri = "fs/" + wrapperAbsPath + '/build'; - // set up test case data - token0 = getFakeTestToken(0); - token1 = getFakeTestToken(1); - pool_0_1 = await createPool(client, fsUri, token0, token1, FeeAmountEnum.MEDIUM, await encodeSqrtRatioX96(client, fsUri, 1, 1), 0, 0, []); - incentiveKey = { - rewardToken: reward, - pool: pool_0_1, - startTime: "100", - endTime: "200", - refundee: '0x0000000000000000000000000000000000000001' - }; - incentiveKeys = [incentiveKey]; - incentiveKeys.push({ - rewardToken: reward, - pool: pool_0_1, - startTime: "50", - endTime: "100", - refundee: '0x0000000000000000000000000000000000000089' - }); - }); - - describe('collectRewards', () => { - it('succeeds with amount', async () => { - const { calldata, value } = await collectRewards(client, fsUri, [incentiveKey], { - tokenId: tokenId, - recipient: recipient, - amount: "1" - }) - - expect(calldata).toEqual( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c4f549ab420000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642f2d783d0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4f2d2909b0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000' - ) - expect(value).toEqual('0x00') - }) - - it('succeeds no amount', async () => { - const { calldata, value } = await collectRewards(client, fsUri, [incentiveKey], { - tokenId: tokenId, - recipient: recipient, - }) - - expect(calldata).toEqual( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c4f549ab420000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642f2d783d0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4f2d2909b0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000' - ) - expect(value).toEqual('0x00') - }) - - it('succeeds multiple keys', async () => { - const { calldata, value } = await collectRewards(client, fsUri, incentiveKeys, { - tokenId: tokenId, - recipient: recipient, - }) - - expect(calldata).toEqual( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000c4f549ab420000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642f2d783d0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4f2d2909b0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4f549ab420000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642f2d783d0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4f2d2909b0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000' - ) - expect(value).toEqual('0x00') - }) - }) - - describe('withdrawToken', () => { - it('succeeds with one keys', async () => { - const { calldata, value } = await withdrawToken(client, fsUri, [incentiveKey], { - tokenId: tokenId, - recipient: recipient, - amount: "0", - owner: sender, - data: '0x0000000000000000000000000000000000000008' - }) - - expect(calldata).toEqual( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c4f549ab420000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642f2d783d0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43c423f0b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toEqual('0x00') - }) - - it('succeeds with multiple keys', async () => { - const { calldata, value } = await withdrawToken(client, fsUri, incentiveKeys, { - tokenId: tokenId, - recipient: recipient, - amount: "0", - owner: sender, - data: '0x0000000000000000000000000000000000000008' - }) - - expect(calldata).toEqual( - '0xac9650d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000000c4f549ab420000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642f2d783d0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4f549ab420000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642f2d783d0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43c423f0b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000' - ) - expect(value).toEqual('0x00') - }) - }) - - describe('encodeDeposit', () => { - it('succeeds single key', async () => { - const deposit: string = await encodeDeposit(client, fsUri, [incentiveKey]); - - expect(deposit).toEqual( - '0x0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000001' - ) - }) - - it('succeeds multiple keys', async () => { - const deposit: string = await encodeDeposit(client, fsUri, incentiveKeys); - - expect(deposit).toEqual( - '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000010000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000089' - ) - }) - }) - - describe('safeTransferFrom with correct data for staker', () => { - it('succeeds', async () => { - const data = await encodeDeposit(client, fsUri, [incentiveKey]); - - const options = { - sender, - recipient, - tokenId, - data - } - const { calldata, value } = await safeTransferFromParameters(client, fsUri, options); - - expect(calldata).toEqual( - '0xb88d4fde000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000004fa63b0dea87d2cd519f3b67a5ddb145779b7bd2000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000001' - ) - expect(value).toEqual('0x00') - }) - }) -}) \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/testData/erc20ABI.json b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/testData/erc20ABI.json deleted file mode 100644 index adb9174b9..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/testData/erc20ABI.json +++ /dev/null @@ -1,224 +0,0 @@ -[ - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - } -] diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/testData/poolList.json b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/testData/poolList.json deleted file mode 100644 index 727d34ff0..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/e2e/testData/poolList.json +++ /dev/null @@ -1,17 +0,0 @@ -[ - "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8", - "0xcbcdf9626bc03e24f779434178a73a0b4bad62ed", - "0x6c6bc977e13df9b0de53b251522280bb72383700", - "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", - "0x4e68ccd3e89f51c3074ca5072bbac773960dfa36", - "0xc63b0708e2f7e69cb8a1df0e1389a98c35a76d52", - "0x4585fe77225b41b697c938b018e2ac67ac5a20c0", - "0x3416cf6c708da44db2624d63ea0aaef7113527c6", - "0x99ac8ca7087fa4a2a1fb6357269965a2014abc35", - "0x7379e81228514a1d2a6cf7559203998e20598346", - "0xc2e9f25be6257c210d7adf0d4cd6e3e881ba25f8", - "0x60594a405d53811d3bc4766596efd80fd545a270", - "0x1d42064fc4beb5f8aaf85f4617ae8b3b5b8bd801", - "0x94981f69f7483af3ae218cbfe65233cc3c60d93a", - "0xd35efae4097d005720608eaf37e42a5936c94b44" -] \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/as-pect.d.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/as-pect.d.ts deleted file mode 100644 index 6101ea23c..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/as-pect.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/constants.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/constants.spec.ts deleted file mode 100644 index c9e8f41ec..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/constants.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - FACTORY_ADDRESS, - MAX_SQRT_RATIO, - MAX_TICK, - MIN_SQRT_RATIO, - MIN_TICK, - POOL_INIT_CODE_HASH, -} from "../../../utils"; - -describe('Invokable constants', () => { - it('FACTORY_ADDRESS', () => { - expect(FACTORY_ADDRESS({})).toStrictEqual("0x1F98431c8aD98523631AE4a59f267346ea31F984"); - }); - - it('POOL_INIT_CODE_HASH', () => { - expect(POOL_INIT_CODE_HASH({})).toStrictEqual( "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54"); - }); - - it('MIN_TICK', () => { - expect(MIN_TICK({})).toStrictEqual(-887272); - }); - - it('MAX_TICK', () => { - expect(MAX_TICK({})).toStrictEqual(887272); - }); - - it('MIN_SQRT_RATIO', () => { - expect(MIN_SQRT_RATIO({}).toString()).toStrictEqual("4295128739"); - }); - - it('MAX_SQRT_RATIO', () => { - expect(MAX_SQRT_RATIO({}).toString()).toStrictEqual("1461446703485210103287273052203988822378723970342"); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/encodeSqrtRatioX96.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/encodeSqrtRatioX96.spec.ts deleted file mode 100644 index 108b277c5..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/encodeSqrtRatioX96.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { encodeSqrtRatioX96 } from "../../.."; -import { Args_encodeSqrtRatioX96 } from "../../../wrap"; -import { BigInt } from "@polywrap/wasm-as"; -import { Q96 } from "../../../utils/constants"; - -describe('encodeSqrtRatioX96', () => { - it('1/1', () => { - const input: Args_encodeSqrtRatioX96 = { amount1: BigInt.ONE, amount0: BigInt.ONE }; - expect(encodeSqrtRatioX96(input)).toStrictEqual(Q96); - }); - - it('100/1', () => { - const input: Args_encodeSqrtRatioX96 = { amount1: BigInt.fromUInt16(100), amount0: BigInt.ONE }; - expect(encodeSqrtRatioX96(input)).toStrictEqual(BigInt.fromString('792281625142643375935439503360')); - }); - - it('1/100', () => { - const input: Args_encodeSqrtRatioX96 = { amount1: BigInt.ONE, amount0: BigInt.fromUInt16(100) }; - expect(encodeSqrtRatioX96(input)).toStrictEqual(BigInt.fromString('7922816251426433759354395033')); - }); - - it('111/333', () => { - const input: Args_encodeSqrtRatioX96 = { amount1: BigInt.fromUInt16(111), amount0: BigInt.fromUInt16(333) }; - expect(encodeSqrtRatioX96(input)).toStrictEqual(BigInt.fromString('45742400955009932534161870629')); - }); - - it('333/111', () => { - const input: Args_encodeSqrtRatioX96 = { amount1: BigInt.fromUInt16(333), amount0: BigInt.fromUInt16(111) }; - expect(encodeSqrtRatioX96(input)).toStrictEqual(BigInt.fromString('137227202865029797602485611888')); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/liquidityMath.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/liquidityMath.spec.ts deleted file mode 100644 index 4661c90e3..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/liquidityMath.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { BigInt } from "@polywrap/wasm-as"; -import { addDelta } from "../../.."; - -const x: BigInt = BigInt.fromUInt16(10); -const y: BigInt = BigInt.fromUInt16(5); - -describe('Liquidity Math', () => { - describe('addDelta', () => { - it('adds positive integers', () => { - const result: BigInt = addDelta({ x, y }); - expect(result.toString()).toStrictEqual("15"); - }); - - it('adds negative integers', () => { - const result: BigInt = addDelta({ x: x.opposite(), y: y.opposite() }); - expect(result.toString()).toStrictEqual("-15"); - }); - - it('adds positive and negative integers together', () => { - const result: BigInt = addDelta({ x, y: y.opposite() }); - expect(result.toString()).toStrictEqual("5"); - }); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/maxLiquidityForAmounts.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/maxLiquidityForAmounts.spec.ts deleted file mode 100644 index 81779f7fc..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/maxLiquidityForAmounts.spec.ts +++ /dev/null @@ -1,237 +0,0 @@ -import { BigInt } from "@polywrap/wasm-as"; -import { encodeSqrtRatioX96, maxLiquidityForAmounts } from "../../.."; -import { MAX_UINT_256 } from "../../../utils"; - -describe('maxLiquidityForAmounts', () => { - describe('imprecise', () => { - describe('price inside', () => { - it('100 token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: BigInt.fromString("200"), - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual("2148"); - }); - - it('100 token0, max token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: MAX_UINT_256, - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual("2148"); - }); - - it('max token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: MAX_UINT_256, - amount1: BigInt.fromString("200"), - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual("4297"); - }); - }); - - describe('price below', () => { - it('100 token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(99), amount0: BigInt.fromUInt16(110)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: BigInt.fromString("200"), - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual("1048"); - }); - - it('100 token0, max token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(99), amount0: BigInt.fromUInt16(110)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: MAX_UINT_256, - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual("1048"); - }); - - it('max token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(99), amount0: BigInt.fromUInt16(110)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: MAX_UINT_256, - amount1: BigInt.fromString("200"), - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual('1214437677402050006470401421068302637228917309992228326090730924516431320489727'); - }); - }); - - describe('price above', () => { - it('100 token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(111), amount0: BigInt.fromUInt16(100)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: BigInt.fromString("200"), - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual("2097"); - }); - - it('100 token0, max token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(111), amount0: BigInt.fromUInt16(100)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: MAX_UINT_256, - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual('1214437677402050006470401421098959354205873606971497132040612572422243086574654'); - }); - - it('max token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(111), amount0: BigInt.fromUInt16(100)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: MAX_UINT_256, - amount1: BigInt.fromString("200"), - useFullPrecision: false, - }); - expect(result.toString()).toStrictEqual("2097"); - }); - }); - }); - - describe('precise', () => { - describe('price inside', () => { - it('100 token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: BigInt.fromString("200"), - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual("2148"); - }); - - it('100 token0, max token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: MAX_UINT_256, - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual("2148"); - }); - - it('max token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: MAX_UINT_256, - amount1: BigInt.fromString("200"), - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual("4297"); - }); - }); - - describe('price below', () => { - it('100 token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(99), amount0: BigInt.fromUInt16(110)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: BigInt.fromString("200"), - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual("1048"); - }); - - it('100 token0, max token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(99), amount0: BigInt.fromUInt16(110)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: MAX_UINT_256, - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual("1048"); - }); - - it('max token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(99), amount0: BigInt.fromUInt16(110)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: MAX_UINT_256, - amount1: BigInt.fromString("200"), - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual('1214437677402050006470401421082903520362793114274352355276488318240158678126184'); - }); - }); - - describe('price above', () => { - it('100 token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(111), amount0: BigInt.fromUInt16(100)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: BigInt.fromString("200"), - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual("2097"); - }); - - it('100 token0, max token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(111), amount0: BigInt.fromUInt16(100)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: BigInt.fromString("100"), - amount1: MAX_UINT_256, - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual('1214437677402050006470401421098959354205873606971497132040612572422243086574654'); - }); - - it('max token0, 200 token1', () => { - const result: BigInt = maxLiquidityForAmounts({ - sqrtRatioCurrentX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(111), amount0: BigInt.fromUInt16(100)}), - sqrtRatioAX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(100), amount0: BigInt.fromUInt16(110)}), - sqrtRatioBX96: encodeSqrtRatioX96({ amount1: BigInt.fromUInt16(110), amount0: BigInt.fromUInt16(100)}), - amount0: MAX_UINT_256, - amount1: BigInt.fromString("200"), - useFullPrecision: true, - }); - expect(result.toString()).toStrictEqual("2097"); - }); - }); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/mostSignificantBit.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/mostSignificantBit.spec.ts deleted file mode 100644 index e9bbbb726..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/mostSignificantBit.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { mostSignificantBit} from "../../.."; -import { MAX_UINT_256 } from "../../../utils"; -import { BigInt } from "@polywrap/wasm-as"; - -describe('mostSignificantBit', () => { - - it('throws for zero', () => { - const throwsZero = (): void => { - const x: BigInt = BigInt.ZERO; - const _error: u32 = mostSignificantBit({ x }); - }; - expect(throwsZero).toThrow('ZERO'); - }); - - it('correct value for every power of 2', () => { - for (let i = 1; i < 256; i++) { - const x: BigInt = BigInt.ONE.leftShift(i); - expect(mostSignificantBit({ x })).toStrictEqual(i); - } - }); - - it('correct value for every power of 2 - 1', () => { - for (let i = 2; i < 256; i++) { - const x: BigInt = BigInt.ONE.leftShift(i).subInt(1); - expect(mostSignificantBit({ x })).toStrictEqual(i - 1); - } - }); - - it('succeeds for MaxUint256', () => { - expect(mostSignificantBit({ x: MAX_UINT_256 })).toStrictEqual(255); - }); -}) \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/nearestUsableTIck.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/nearestUsableTIck.spec.ts deleted file mode 100644 index bd1217dbf..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/nearestUsableTIck.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { nearestUsableTick } from "../../.."; -import { _MAX_TICK, _MIN_TICK } from "../../../utils"; - -describe('nearestUsableTick', () => { - - it('throws if tickSpacing is 0', () => { - const throwsSpacing = (): void => { - nearestUsableTick({ tick: 1, tickSpacing: 0 }); - }; - expect(throwsSpacing).toThrow('TICK_SPACING: tick spacing must be greater than 0'); - }); - - it('throws if tickSpacing is negative', () => { - const throwsSpacing = (): void => { - nearestUsableTick({ tick: 1, tickSpacing: -5 }); - }; - expect(throwsSpacing).toThrow('TICK_SPACING: tick spacing must be greater than 0'); - }); - - it('throws if tick > MAX_TICK or tick < MIN_TICK', () => { - const throwsTickMax = (): void => { - nearestUsableTick({ tick: _MAX_TICK + 1, tickSpacing: 1 }); - }; - const throwsTickMin = (): void => { - nearestUsableTick({ tick: _MIN_TICK - 1, tickSpacing: 1 }); - }; - expect(throwsTickMax).toThrow(`TICK_BOUND: tick index is out of range ${_MIN_TICK} to ${_MAX_TICK}`); - expect(throwsTickMin).toThrow(`TICK_BOUND: tick index is out of range ${_MIN_TICK} to ${_MAX_TICK}`); - }); - - it('rounds at positive half', () => { - expect(nearestUsableTick({ tick: 5, tickSpacing: 10 })).toStrictEqual(10); - }); - - it('rounds down below positive half', () => { - expect(nearestUsableTick({ tick: 4, tickSpacing: 10 })).toStrictEqual(0); - }); - - it('rounds up for negative half', () => { - expect(nearestUsableTick({ tick: -5, tickSpacing: 10 })).toStrictEqual(0); - }); - - it('rounds up for negative half', () => { - expect(nearestUsableTick({ tick: -6, tickSpacing: 10 })).toStrictEqual(-10); - }); - - it('cannot round past MIN_TICK', () => { - const spacing: i32 = _MAX_TICK / 2 + 100; - expect(nearestUsableTick({ tick: _MIN_TICK, tickSpacing: spacing })).toStrictEqual(-spacing); - }); - - it('cannot round past MAX_TICK', () => { - const spacing: i32 = _MAX_TICK / 2 + 100; - expect(nearestUsableTick({ tick: _MAX_TICK, tickSpacing: spacing })).toStrictEqual(spacing); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/pool.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/pool.spec.ts deleted file mode 100644 index b72678cb6..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/pool.spec.ts +++ /dev/null @@ -1,451 +0,0 @@ -import { BigInt, BigNumber } from "@polywrap/wasm-as"; -import { ChainId, FeeAmount, Pool, PoolChangeResult, Price, Token, TokenAmount } from "../../../wrap"; -import { getWrappedNative } from "../../../token"; -import { - createPool, - encodeSqrtRatioX96, getPoolInputAmount, getPoolOutputAmount, - getTickAtSqrtRatio, - nearestUsableTick, - poolChainId, - poolInvolvesToken, - poolPriceOf, - poolToken0Price, - poolToken1Price, tokenEquals -} from "../../.."; -import { _MAX_TICK, _MIN_TICK, _feeAmountToTickSpacing } from "../../../utils"; - - -const ONE_ETHER: BigInt = BigInt.pow(BigInt.fromUInt16(10), 18); - -const USDC: Token = { - chainId: ChainId.MAINNET, - address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - currency: { - decimals: 6, - symbol: "USDC", - name: "USD Coin", - }, -}; -const DAI: Token = { - chainId: ChainId.MAINNET, - address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", - currency: { - decimals: 18, - symbol: "DAI", - name: "DAI Stablecoin", - }, -}; - -let swapPool: Pool; - -describe('Pool', () => { - - describe('Pool constructor', () => { - - it('cannot be used for tokens on different chains', () => { - const error = (): void => { - createPool({ - tokenA: USDC, - tokenB: getWrappedNative({ chainId: ChainId.ROPSTEN }), - fee: FeeAmount.MEDIUM, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - }; - expect(error).toThrow("CHAIN_IDS: tokens in a pool must have the same chain id"); - }); - - it('cannot be given two of the same token', () => { - const error = (): void => { - createPool({ - tokenA: USDC, - tokenB: USDC, - fee: FeeAmount.MEDIUM, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - }; - expect(error).toThrow("ADDRESSES: tokens in a pool cannot have the same address"); - }); - - it('price must be within tick price bounds', () => { - const error = (): void => { - createPool({ - tokenA: USDC, - tokenB: getWrappedNative({ chainId: ChainId.MAINNET }), - fee: FeeAmount.MEDIUM, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 1, - ticks: [], - }); - }; - expect(error).toThrow("PRICE_BOUNDS: sqrtRatioX96 is invalid for current tick"); - - const errorNeg = (): void => { - createPool({ - tokenA: USDC, - tokenB: getWrappedNative({ chainId: ChainId.MAINNET }), - fee: FeeAmount.MEDIUM, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }).addInt(1), - liquidity: BigInt.ZERO, - tickCurrent: -1, - ticks: [], - }); - }; - expect(errorNeg).toThrow("PRICE_BOUNDS: sqrtRatioX96 is invalid for current tick"); - }); - - it('works with valid arguments for empty pool medium fee', () => { - const noError = (): void => { - createPool({ - tokenA: USDC, - tokenB: getWrappedNative({ chainId: ChainId.MAINNET }), - fee: FeeAmount.MEDIUM, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - }; - expect(noError).not.toThrow(); - }); - - it('works with valid arguments for empty pool low fee', () => { - const noError = (): void => { - createPool({ - tokenA: USDC, - tokenB: getWrappedNative({ chainId: ChainId.MAINNET }), - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - }; - expect(noError).not.toThrow(); - }); - - it('works with valid arguments for empty pool lowest fee', () => { - const noError = (): void => { - createPool({ - tokenA: USDC, - tokenB: getWrappedNative({ chainId: ChainId.MAINNET }), - fee: FeeAmount.LOWEST, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - }; - expect(noError).not.toThrow(); - }); - - it('works with valid arguments for empty pool high fee', () => { - const noError = (): void => { - createPool({ - tokenA: USDC, - tokenB: getWrappedNative({ chainId: ChainId.MAINNET }), - fee: FeeAmount.HIGH, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - }; - expect(noError).not.toThrow(); - }); - }); - - describe('token0', () => { - it('always is the token that sorts before', () => { - const poolA: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - expect(poolA.token0).toStrictEqual(DAI); - - const poolB: Pool = createPool({ - tokenA: DAI, - tokenB: USDC, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - expect(poolB.token0).toStrictEqual(DAI); - }); - }); - - describe('token1', () => { - it('always is the token that sorts after', () => { - const poolA: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - expect(poolA.token1).toStrictEqual(USDC); - - const poolB: Pool = createPool({ - tokenA: DAI, - tokenB: USDC, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - expect(poolB.token1).toStrictEqual(USDC); - }); - }); - - describe('poolToken0Price', () => { - it('returns price of token0 in terms of token1', () => { - const amount1: BigInt = BigInt.fromString("101000000"); - const amount0: BigInt = BigInt.fromString("100000000000000000000"); - const sqrtRatioX96: BigInt = encodeSqrtRatioX96({ amount1, amount0 }); - const poolA: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: sqrtRatioX96, - liquidity: BigInt.ZERO, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96 }), - ticks: [], - }); - const priceA: Price = poolToken0Price({ - token0: poolA.token0, - token1: poolA.token1, - sqrtRatioX96: poolA.sqrtRatioX96 - }); - expect(BigNumber.from(priceA.price).toSignificant(5)).toStrictEqual("1.01"); - expect(priceA).toStrictEqual(poolA.token0Price); - - const poolB: Pool = createPool({ - tokenA: DAI, - tokenB: USDC, - fee: FeeAmount.LOW, - sqrtRatioX96: sqrtRatioX96, - liquidity: BigInt.ZERO, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96 }), - ticks: [], - }); - const priceB: Price = poolToken0Price({ - token0: poolB.token0, - token1: poolB.token1, - sqrtRatioX96: poolB.sqrtRatioX96 - }); - expect(BigNumber.from(priceB.price).toSignificant(5)).toStrictEqual("1.01"); - expect(priceB).toStrictEqual(poolB.token0Price); - - }); - }); - - describe('poolToken1Price', () => { - it('returns price of token1 in terms of token0', () => { - const amount1: BigInt = BigInt.fromString("101000000"); - const amount0: BigInt = BigInt.fromString("100000000000000000000"); - const sqrtRatioX96: BigInt = encodeSqrtRatioX96({ amount1, amount0 }); - const poolA: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: sqrtRatioX96, - liquidity: BigInt.ZERO, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96 }), - ticks: [], - }); - const priceA: Price = poolToken1Price({ - token0: poolA.token0, - token1: poolA.token1, - sqrtRatioX96: poolA.sqrtRatioX96 - }); - const priceRoundedA: string = BigNumber.fromString(priceA.price).toFixed(4); - expect(priceRoundedA).toStrictEqual("0.9901"); - expect(priceA).toStrictEqual(poolA.token1Price); - - const poolB: Pool = createPool({ - tokenA: DAI, - tokenB: USDC, - fee: FeeAmount.LOW, - sqrtRatioX96: sqrtRatioX96, - liquidity: BigInt.ZERO, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96 }), - ticks: [], - }); - const priceB: Price = poolToken1Price({ - token0: poolB.token0, - token1: poolB.token1, - sqrtRatioX96: poolB.sqrtRatioX96 - }); - const priceRoundedB: string = BigNumber.fromString(priceB.price).toFixed(4); - expect(priceRoundedB).toStrictEqual("0.9901"); - expect(priceB).toStrictEqual(poolB.token1Price); - }); - }); - - describe('poolPriceOf', () => { - - it('returns price of token in terms of other token', () => { - const pool: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - expect(poolPriceOf({ token: DAI, pool: pool })).toStrictEqual(pool.token0Price); - expect(poolPriceOf({ token: USDC, pool: pool })).toStrictEqual(pool.token1Price); - }); - - it('throws if invalid token', () => { - const error = (): void => { - const pool: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - poolPriceOf({ token: getWrappedNative({ chainId: ChainId.MAINNET }), pool: pool }); - }; - expect(error).toThrow("TOKEN: Cannot return the price of a token that is not in the pool"); - }); - }); - - describe('chainId', () => { - it('returns the token0 chainId', () => { - const poolA: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - expect(poolChainId({ pool: poolA })).toStrictEqual(ChainId.MAINNET); - - const poolB: Pool = createPool({ - tokenA: DAI, - tokenB: USDC, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - expect(poolChainId({ pool: poolB })).toStrictEqual(ChainId.MAINNET); - }); - }); - - describe('involvesToken', () => { - it('returns true iff token is in pool', () => { - const pool: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: [], - }); - expect(poolInvolvesToken({ token: USDC, pool: pool })).toStrictEqual(true); - expect(poolInvolvesToken({ token: DAI, pool: pool })).toStrictEqual(true); - expect(poolInvolvesToken({ token: getWrappedNative({ chainId: ChainId.MAINNET }), pool: pool })).toStrictEqual(false); - }); - }); - - describe('swaps', () => { - - beforeAll(() => { - swapPool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: ONE_ETHER, - tickCurrent: 0, - ticks: [ - { - index: nearestUsableTick({ tick: _MIN_TICK, tickSpacing: _feeAmountToTickSpacing(FeeAmount.LOW) }), - liquidityNet: ONE_ETHER, - liquidityGross: ONE_ETHER - }, - { - index: nearestUsableTick({ tick: _MAX_TICK, tickSpacing: _feeAmountToTickSpacing(FeeAmount.LOW) }), - liquidityNet: ONE_ETHER.opposite(), - liquidityGross: ONE_ETHER - }], - }); - }); - - describe('getOutputAmount', () => { - - it('USDC -> DAI', () => { - const inputAmount: TokenAmount = { - token: USDC, - amount: BigInt.fromUInt16(100), - }; - const poolChangeResult: PoolChangeResult = getPoolOutputAmount({ inputAmount, sqrtPriceLimitX96: null, pool: swapPool }); - const outputAmount: TokenAmount = poolChangeResult.amount; - expect(tokenEquals({ tokenA: outputAmount.token, tokenB: DAI })).toStrictEqual(true); - expect(outputAmount.amount.toInt32()).toStrictEqual(98); - }); - - it('DAI -> USDC', () => { - const inputAmount: TokenAmount = { - token: DAI, - amount: BigInt.fromUInt16(100), - }; - const poolChangeResult: PoolChangeResult = getPoolOutputAmount({ inputAmount, sqrtPriceLimitX96: null, pool: swapPool }); - const outputAmount: TokenAmount = poolChangeResult.amount; - expect(tokenEquals({ tokenA: outputAmount.token, tokenB: USDC })).toStrictEqual(true); - expect(outputAmount.amount.toInt32()).toStrictEqual(98); - }); - }); - - describe('getInputAmount', () => { - - it('USDC -> DAI', () => { - const outputAmount: TokenAmount = { - token: DAI, - amount: BigInt.fromUInt16(98), - }; - const poolChangeResult: PoolChangeResult = getPoolInputAmount({ outputAmount, sqrtPriceLimitX96: null, pool: swapPool }); - const inputAmount: TokenAmount = poolChangeResult.amount; - expect(tokenEquals({ tokenA: inputAmount.token, tokenB: USDC })).toStrictEqual(true); - expect(inputAmount.amount.toInt32()).toStrictEqual(100); - }); - - it('DAI -> USDC', () => { - const outputAmount: TokenAmount = { - token: USDC, - amount: BigInt.fromUInt16(98), - }; - const poolChangeResult: PoolChangeResult = getPoolInputAmount({ outputAmount, sqrtPriceLimitX96: null, pool: swapPool }); - const inputAmount: TokenAmount = poolChangeResult.amount; - expect(tokenEquals({ tokenA: inputAmount.token, tokenB: DAI })).toStrictEqual(true); - expect(inputAmount.amount.toInt32()).toStrictEqual(100); - }); - }); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/poolUtils.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/poolUtils.spec.ts deleted file mode 100644 index 30bd33423..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/poolUtils.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { ChainId, FeeAmount, Pool, Token } from "../../../wrap"; -import { createPool, encodeSqrtRatioX96, nearestUsableTick, simulateSwap } from "../../.."; -import { BigInt } from "@polywrap/wasm-as"; -import { _MAX_SQRT_RATIO, _MAX_TICK, _MIN_SQRT_RATIO, _MIN_TICK, _feeAmountToTickSpacing } from "../../../utils"; - -const USDC: Token = { - chainId: ChainId.MAINNET, - address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - currency: { - decimals: 6, - symbol: "USDC", - name: "USD Coin", - }, -}; -const DAI: Token = { - chainId: ChainId.MAINNET, - address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", - currency: { - decimals: 18, - symbol: "DAI", - name: "DAI Stablecoin", - }, -}; -const ONE_ETHER: BigInt = BigInt.pow(BigInt.fromUInt16(10), 18); - -const pool: Pool = createPool({ - tokenA: USDC, - tokenB: DAI, - fee: FeeAmount.LOW, - sqrtRatioX96: encodeSqrtRatioX96({ amount1: BigInt.ONE, amount0: BigInt.ONE }), - liquidity: ONE_ETHER, - tickCurrent: 0, - ticks: [ - { - index: nearestUsableTick({ tick: _MIN_TICK, tickSpacing: _feeAmountToTickSpacing(FeeAmount.LOW) }), - liquidityNet: ONE_ETHER, - liquidityGross: ONE_ETHER - }, - { - index: nearestUsableTick({ tick: _MAX_TICK, tickSpacing: _feeAmountToTickSpacing(FeeAmount.LOW) }), - liquidityNet: ONE_ETHER.opposite(), - liquidityGross: ONE_ETHER - }], -}); - -describe('Pool Utils', () => { - describe('simulateSwap', () => { - it('throws if sqrtRatio <= MIN and zeroForOne = true', () => { - const error = (): void => { - simulateSwap(pool, false, BigInt.fromUInt16(100), _MIN_SQRT_RATIO) - }; - expect(error).toThrow(`RATIO_MIN: input sqrtPriceLimitX96 ${_MIN_SQRT_RATIO.toString()} is less than or equal to the minimum sqrt ratio ${_MIN_SQRT_RATIO.toString()}`); - }); - - it('throws if sqrtRatio >= pool.sqrtRatioX96 and zeroForOne = true', () => { - const error = (): void => { - simulateSwap(pool, false, BigInt.fromUInt16(100), pool.sqrtRatioX96) - }; - expect(error).toThrow(`RATIO_CURRENT: input sqrtPriceLimitX96 ${pool.sqrtRatioX96.toString()} is greater than or equal to the pool's current sqrt ratio ${pool.sqrtRatioX96.toString()}`); - }); - - it('throws if sqrtRatio >= MAX and zeroForOne = false', () => { - const error = (): void => { - simulateSwap(pool, false, BigInt.fromUInt16(100), _MAX_SQRT_RATIO) - }; - expect(error).toThrow(`RATIO_MAX: input sqrtPriceLimitX96 ${_MAX_SQRT_RATIO.toString()} is greater than or equal to the maximum sqrt ratio ${_MAX_SQRT_RATIO.toString()}`); - }); - - it('throws if sqrtRatio <= pool.sqrtRatioX96 and zeroForOne = false', () => { - const error = (): void => { - simulateSwap(pool, false, BigInt.fromUInt16(100), pool.sqrtRatioX96) - }; - expect(error).toThrow(`RATIO_CURRENT: input sqrtPriceLimitX96 ${pool.sqrtRatioX96.toString()} is less than or equal to the pool's current sqrt ratio ${pool.sqrtRatioX96.toString()}`); - }); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/position.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/position.spec.ts deleted file mode 100644 index cb3136b4e..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/position.spec.ts +++ /dev/null @@ -1,516 +0,0 @@ -import { ChainId, FeeAmount, MintAmounts, Pool, Position, Token } from "../../../wrap"; -import { createPool, encodeSqrtRatioX96, getTickAtSqrtRatio, nearestUsableTick, burnAmountsWithSlippage, - createPosition, mintAmounts, - mintAmountsWithSlippage, - positionAmount0, - positionAmount1 } from "../../.."; -import { BigInt } from "@polywrap/wasm-as"; -import { _MAX_SQRT_RATIO, _MAX_TICK, _MIN_SQRT_RATIO, _MIN_TICK, _feeAmountToTickSpacing } from "../../../utils"; - -const USDC: Token = { - chainId: ChainId.MAINNET, - address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - currency: { - decimals: 6, - symbol: "USDC", - name: "USD Coin", - }, -}; -const DAI: Token = { - chainId: ChainId.MAINNET, - address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", - currency: { - decimals: 18, - symbol: "DAI", - name: "DAI Stablecoin", - }, -}; - -const bi100e6: BigInt = BigInt.fromString("100000000"); -const bi100e12: BigInt = BigInt.fromString("100000000000000"); -const bi100e18: BigInt = BigInt.fromString("100000000000000000000"); - -const POOL_SQRT_RATIO_START: BigInt = encodeSqrtRatioX96({ - amount1: bi100e6, - amount0: bi100e18 -}); -const POOL_TICK_CURRENT: i32 = getTickAtSqrtRatio({ sqrtRatioX96: POOL_SQRT_RATIO_START }); -const TICK_SPACING: i32 = _feeAmountToTickSpacing(FeeAmount.LOW); -const DAI_USDC_POOL: Pool = createPool({ - tokenA: DAI, - tokenB: USDC, - fee: FeeAmount.LOW, - sqrtRatioX96: POOL_SQRT_RATIO_START, - liquidity: BigInt.ZERO, - tickCurrent: POOL_TICK_CURRENT, - ticks: null, -}); - -describe('Position', () => { - - it('can be constructed around 0 tick', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: BigInt.ONE, - tickLower: -10, - tickUpper: 10 - }); - expect(position.liquidity).toStrictEqual(BigInt.ONE); - }); - - it('can use min and max ticks', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: BigInt.ONE, - tickLower: nearestUsableTick({ tick: _MIN_TICK, tickSpacing: TICK_SPACING}), - tickUpper: nearestUsableTick({ tick: _MAX_TICK, tickSpacing: TICK_SPACING}), - }); - expect(position.liquidity).toStrictEqual(BigInt.ONE); - }); - - it('tick lower must be less than tick upper', () => { - const error = (): void => { - createPosition({ - pool: DAI_USDC_POOL, - liquidity: BigInt.ONE, - tickLower: 10, - tickUpper: -10, - }); - }; - expect(error).toThrow("TICK_ORDER: upper tick index must be greater than lower tick index"); - }); - - it('tick lower cannot equal tick upper', () => { - const error = (): void => { - createPosition({ - pool: DAI_USDC_POOL, - liquidity: BigInt.ONE, - tickLower: -10, - tickUpper: -10, - }); - }; - expect(error).toThrow("TICK_ORDER: upper tick index must be greater than lower tick index"); - }); - - it('tick lower must be multiple of tick spacing', () => { - const error = (): void => { - createPosition({ - pool: DAI_USDC_POOL, - liquidity: BigInt.ONE, - tickLower: -5, - tickUpper: 10, - }); - }; - expect(error).toThrow("TICK_LOWER: lower tick index is less than minimum or not aligned with tick spacing"); - }); - - it('tick lower must be greater than MIN_TICK', () => { - const error = (): void => { - createPosition({ - pool: DAI_USDC_POOL, - liquidity: BigInt.ONE, - tickLower: nearestUsableTick({ tick: _MIN_TICK, tickSpacing: TICK_SPACING}) - TICK_SPACING, - tickUpper: 10, - }); - }; - expect(error).toThrow("TICK_LOWER: lower tick index is less than minimum or not aligned with tick spacing"); - }); - - it('tick upper must be multiple of tick spacing', () => { - const error = (): void => { - createPosition({ - pool: DAI_USDC_POOL, - liquidity: BigInt.ONE, - tickLower: -10, - tickUpper: 15, - }); - }; - expect(error).toThrow("TICK_UPPER: upper tick index is greater than maximum or not aligned with tick spacing"); - }); - - it('tick upper must be less than MAX_TICK', () => { - const error = (): void => { - createPosition({ - pool: DAI_USDC_POOL, - liquidity: BigInt.ONE, - tickLower: -10, - tickUpper: nearestUsableTick({ tick: _MAX_TICK, tickSpacing: TICK_SPACING}) + TICK_SPACING, - }); - }; - expect(error).toThrow("TICK_UPPER: upper tick index is greater than maximum or not aligned with tick spacing"); - }); - - describe('amount0', () => { - it('is correct for price above', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e12, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const amount: string = positionAmount0({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount.toString(); - expect(amount).toStrictEqual('49949961958869841'); - expect(amount).toStrictEqual(position.token0Amount.amount.toString()); - }); - - it('is correct for price below', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING, - }); - const amount: string = positionAmount0({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount.toString(); - expect(amount).toStrictEqual('0'); - expect(amount).toStrictEqual(position.token0Amount.amount.toString()); - }); - - it('is correct for in-range position', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const amount: string = positionAmount0({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount.toString(); - expect(amount).toStrictEqual('120054069145287995769396'); - expect(amount).toStrictEqual(position.token0Amount.amount.toString()); - }); - }); - - describe('amount1', () => { - it('is correct for price above', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const amount: string = positionAmount1({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount.toString(); - expect(amount).toStrictEqual('0'); - expect(amount).toStrictEqual(position.token1Amount.amount.toString()); - }); - - it('is correct for price below', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING, - }); - const amount: string = positionAmount1({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount.toString(); - expect(amount).toStrictEqual('49970077052'); - expect(amount).toStrictEqual(position.token1Amount.amount.toString()); - }); - - it('is correct for in-range position', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const amount: string = positionAmount1({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount.toString(); - expect(amount).toStrictEqual('79831926242'); - expect(amount).toStrictEqual(position.token1Amount.amount.toString()); - }); - }); - - describe('mintAmountsWithSlippage', () => { - describe('0 slippage', () => { - it('is correct for positions below', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const mintAmounts: MintAmounts = mintAmountsWithSlippage({ position, slippageTolerance: "0" }); - expect(mintAmounts.amount0.toString()).toStrictEqual('49949961958869841738198'); - expect(mintAmounts.amount1.toString()).toStrictEqual('0'); - }); - - it('is correct for positions above', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING, - }); - const mintAmounts: MintAmounts = mintAmountsWithSlippage({ position, slippageTolerance: "0" }); - expect(mintAmounts.amount0.toString()).toStrictEqual('0'); - expect(mintAmounts.amount1.toString()).toStrictEqual('49970077053'); - }); - - it('is correct for positions within', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const mintAmounts: MintAmounts = mintAmountsWithSlippage({ position, slippageTolerance: "0" }); - expect(mintAmounts.amount0.toString()).toStrictEqual('120054069145287995740584'); - expect(mintAmounts.amount1.toString()).toStrictEqual('79831926243'); - }); - }); - - describe('.05% slippage', () => { - it('is correct for positions below', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const mintAmounts: MintAmounts = mintAmountsWithSlippage({ position, slippageTolerance: "0.0005" }); - expect(mintAmounts.amount0.toString()).toStrictEqual('49949961958869841738198'); - expect(mintAmounts.amount1.toString()).toStrictEqual('0'); - }); - - it('is correct for positions above', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING, - }); - const mintAmounts: MintAmounts = mintAmountsWithSlippage({ position, slippageTolerance: "0.0005" }); - expect(mintAmounts.amount0.toString()).toStrictEqual('0'); - expect(mintAmounts.amount1.toString()).toStrictEqual('49970077053'); - }); - - it('is correct for positions within', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const mintAmounts: MintAmounts = mintAmountsWithSlippage({ position, slippageTolerance: "0.0005" }); - expect(mintAmounts.amount0.toString()).toStrictEqual('95063440240746211432007'); - expect(mintAmounts.amount1.toString()).toStrictEqual('54828800461'); - }); - }); - - describe('5% slippage tolerance', () => { - it('is correct for pool at min price', () => { - const position: Position = createPosition({ - pool: createPool({ tokenA: DAI, tokenB: USDC, fee: FeeAmount.LOW, sqrtRatioX96: _MIN_SQRT_RATIO, liquidity: BigInt.ZERO, tickCurrent: _MIN_TICK, ticks: null }), - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const mintAmounts: MintAmounts = mintAmountsWithSlippage({ position, slippageTolerance: "0.05" }); - expect(mintAmounts.amount0.toString()).toStrictEqual('49949961958869841738198'); - expect(mintAmounts.amount1.toString()).toStrictEqual('0'); - }); - - it('is correct for pool at max price', () => { - const position: Position = createPosition({ - pool: createPool({ tokenA: DAI, tokenB: USDC, fee: FeeAmount.LOW, sqrtRatioX96: _MAX_SQRT_RATIO.subInt(1), liquidity: BigInt.ZERO, tickCurrent: _MAX_TICK - 1, ticks: null }), - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const burnAmounts: MintAmounts = mintAmountsWithSlippage({ position, slippageTolerance: "0.05" }); - expect(burnAmounts.amount0.toString()).toStrictEqual("0"); - expect(burnAmounts.amount1.toString()).toStrictEqual('50045084660'); - }); - }); - }); - - describe('burnAmountsWithSlippage', () => { - describe('0 slippage', () => { - - it('is correct for positions below', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ position, slippageTolerance: "0" }); - expect(burnAmounts.amount0.toString()).toStrictEqual('49949961958869841754181'); - expect(burnAmounts.amount1.toString()).toStrictEqual('0'); - }); - - it('is correct for positions above', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING, - }); - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ position, slippageTolerance: "0" }); - expect(burnAmounts.amount0.toString()).toStrictEqual('0'); - expect(burnAmounts.amount1.toString()).toStrictEqual('49970077052'); - }); - - it('is correct for positions within', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ position, slippageTolerance: "0" }); - expect(burnAmounts.amount0.toString()).toStrictEqual('120054069145287995769396'); - expect(burnAmounts.amount1.toString()).toStrictEqual('79831926242'); - }); - }); - - describe('.05% slippage', () => { - it('is correct for positions below', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ position, slippageTolerance: "0.0005" }); - expect(burnAmounts.amount0.toString()).toStrictEqual('49949961958869841754181'); - expect(burnAmounts.amount1.toString()).toStrictEqual('0'); - }); - - it('is correct for positions above', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING, - }); - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ position, slippageTolerance: "0.0005" }); - expect(burnAmounts.amount0.toString()).toStrictEqual('0'); - expect(burnAmounts.amount1.toString()).toStrictEqual('49970077052'); - }); - - it('is correct for positions within', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ position, slippageTolerance: "0.0005" }); - expect(burnAmounts.amount0.toString()).toStrictEqual('95063440240746211454822'); - expect(burnAmounts.amount1.toString()).toStrictEqual('54828800460'); - }); - }); - - describe('5% slippage tolerance', () => { - it('is correct for pool at min price', () => { - const position: Position = createPosition({ - pool: createPool({ tokenA: DAI, tokenB: USDC, fee: FeeAmount.LOW, sqrtRatioX96: _MIN_SQRT_RATIO, liquidity: BigInt.ZERO, tickCurrent: _MIN_TICK, ticks: null }), - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ position, slippageTolerance: "0.05" }); - expect(burnAmounts.amount0.toString()).toStrictEqual('49949961958869841754181'); - expect(burnAmounts.amount1.toString()).toStrictEqual('0'); - }); - - it('is correct for pool at max price', () => { - const position: Position = createPosition({ - pool: createPool({ tokenA: DAI, tokenB: USDC, fee: FeeAmount.LOW, sqrtRatioX96: _MAX_SQRT_RATIO.subInt(1), liquidity: BigInt.ZERO, tickCurrent: _MAX_TICK - 1, ticks: null }), - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ position, slippageTolerance: "0.05" }); - expect(burnAmounts.amount0.toString()).toStrictEqual("0"); - expect(burnAmounts.amount1.toString()).toStrictEqual('50045084659'); - }); - }); - }); - - describe('mintAmounts', () => { - it('is correct for price above', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const amounts: MintAmounts = mintAmounts({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }); - expect(amounts.amount0.toString()).toStrictEqual('49949961958869841754182'); - expect(amounts.amount1.toString()).toStrictEqual('0'); - expect(amounts.amount0.toString()).toStrictEqual(position.mintAmounts.amount0.toString()); - expect(amounts.amount1.toString()).toStrictEqual(position.mintAmounts.amount1.toString()); - }); - - it('is correct for price below', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING, - }); - const amounts: MintAmounts = mintAmounts({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }); - expect(amounts.amount0.toString()).toStrictEqual('0'); - expect(amounts.amount1.toString()).toStrictEqual('49970077053'); - expect(amounts.amount0.toString()).toStrictEqual(position.mintAmounts.amount0.toString()); - expect(amounts.amount1.toString()).toStrictEqual(position.mintAmounts.amount1.toString()); - }); - - it('is correct for in-range position', () => { - const position: Position = createPosition({ - pool: DAI_USDC_POOL, - liquidity: bi100e18, - tickLower: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) - TICK_SPACING * 2, - tickUpper: nearestUsableTick({ tick: POOL_TICK_CURRENT, tickSpacing: TICK_SPACING}) + TICK_SPACING * 2, - }); - const amounts: MintAmounts = mintAmounts({ - pool: position.pool, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }); - expect(amounts.amount0.toString()).toStrictEqual('120054069145287995769397'); - expect(amounts.amount1.toString()).toStrictEqual('79831926243'); - expect(amounts.amount0.toString()).toStrictEqual(position.mintAmounts.amount0.toString()); - expect(amounts.amount1.toString()).toStrictEqual(position.mintAmounts.amount1.toString()); - }); - }); -}); diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/priceTickConversion.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/priceTickConversion.spec.ts deleted file mode 100644 index eaef40162..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/priceTickConversion.spec.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { ChainId, Args_priceToClosestTick, Args_tickToPrice, Token, Price as PriceType } from "../../../wrap"; -import { priceToClosestTick, tickToPrice } from "../../.."; -import {Price} from "../../../utils"; -import { BigInt, BigNumber } from "@polywrap/wasm-as"; - -/** - * Creates an example token with a specific sort order - */ -function token(sortOrder: i32, decimals: u8 = 18, chainId: ChainId = ChainId.MAINNET): Token { - if (sortOrder > 9 || sortOrder % 1 !== 0) throw new Error('invalid sort order'); - return { - chainId: chainId, - address: `0x${new Array(40).fill(`${sortOrder}`).join('')}`, - currency: { - decimals: decimals, - symbol: `T${sortOrder}`, - name: `token${sortOrder}`, - }, - }; -} - -function reciprocal(baseToken: Token, quoteToken: Token, tick: i32): i32 { - const tickToPriceInput: Args_tickToPrice = { - baseToken: baseToken, - quoteToken: quoteToken, - tick: tick, - }; - - const priceToTickInput: Args_priceToClosestTick = { - price: tickToPrice(tickToPriceInput), - }; - return priceToClosestTick(priceToTickInput); -} - -const token0: Token = token(0); -const token1: Token = token(1); -const token2_6decimals: Token = token(2, 6); - -describe('priceTickConversions', () => { - - describe('tickToPrice', () => { - - it('1800 t0/1 t1', () => { - const price: string = tickToPrice({ baseToken: token1, quoteToken: token0, tick: -74959 }).price; - const result: string = BigNumber.fromString(price).toSignificant(5); - expect(result).toStrictEqual('1800'); - }); - - it('1 t1/1800 t0', () => { - const price: string = tickToPrice({ baseToken: token0, quoteToken: token1, tick: -74959 }).price; - const result: string = BigNumber.fromString(price).toSignificant(5); - expect(result).toStrictEqual('0.00055556'); - }); - - it('1800 t1/1 t0', () => { - const price: string = tickToPrice({ baseToken: token0, quoteToken: token1, tick: 74959 }).price; - const result: string = BigNumber.fromString(price).toSignificant(5); - expect(result).toStrictEqual('1800'); - }); - - it('1 t0/1800 t1', () => { - const price: string = tickToPrice({ baseToken: token1, quoteToken: token0, tick: 74959 }).price; - const result: string = BigNumber.fromString(price).toSignificant(5); - expect(result).toStrictEqual('0.00055556'); - }); - - describe('12 decimal difference', () => { - - it('1.01 t2/1 t0', () => { - const price: string = tickToPrice({ baseToken: token0, quoteToken: token2_6decimals, tick: -276225 }).price; - const result: string = BigNumber.fromString(price).toSignificant(3); - expect(result).toStrictEqual('1.01'); - }); - - it('1 t0/1.01 t2', () => { - const price: string = tickToPrice({ baseToken: token2_6decimals, quoteToken: token0, tick: -276225 }).price; - const result: string = BigNumber.fromString(price).toSignificant(5); - expect(result).toStrictEqual('0.99015'); - }); - - it('1 t2/1.01 t0', () => { - const price: string = tickToPrice({ baseToken: token0, quoteToken: token2_6decimals, tick: -276423 }).price; - const result: string = BigNumber.fromString(price).toSignificant(5); - expect(result).toStrictEqual('0.99015'); - }); - - it('1.01 t0/1 t2', () => { - const price: string = tickToPrice({ baseToken: token2_6decimals, quoteToken: token0, tick: -276423 }).price; - const result: string = BigNumber.fromString(price).toSignificant(5); - expect(result).toStrictEqual('1.0099'); - }); - - it('1.01 t2/1 t0', () => { - const price: string = tickToPrice({ baseToken: token0, quoteToken: token2_6decimals, tick: -276225 }).price; - const result: string = BigNumber.fromString(price).toSignificant(3); - expect(result).toStrictEqual('1.01'); - }); - }); - }); - - describe('priceToClosestTick', () => { - - it('1800 t0/1 t1', () => { - const price: PriceType = new Price(token1, token0, BigInt.ONE, BigInt.fromString("1800")).toPriceType(); - const args: Args_priceToClosestTick = { price }; - expect(priceToClosestTick(args)).toStrictEqual(-74960); - }); - - it('1 t1/1800 t0', () => { - const price: PriceType = new Price(token0, token1, BigInt.fromString("1800"), BigInt.ONE).toPriceType(); - const args: Args_priceToClosestTick = { price }; - expect(priceToClosestTick(args)).toStrictEqual(-74960); - }); - - it('1.01 t2/1 t0', () => { - const price: PriceType = new Price(token0, token2_6decimals, BigInt.fromString("100000000000000000000"), BigInt.fromString("101000000")).toPriceType(); - const args: Args_priceToClosestTick = { price }; - expect(priceToClosestTick(args)).toStrictEqual(-276225); - }); - - it('1 t0/1.01 t2', () => { - const price: PriceType = new Price(token2_6decimals, token0, BigInt.fromString("101000000"), BigInt.fromString("100000000000000000000")).toPriceType(); - const args: Args_priceToClosestTick = { price }; - expect(priceToClosestTick(args)).toStrictEqual(-276225); - }); - - describe('reciprocal with tickToPrice', () => { - - it('1800 t0/1 t1', () => { - const baseToken: Token = token1; - const quoteToken: Token = token0; - const tick: i32 = -74960; - expect(reciprocal(baseToken, quoteToken, tick)).toStrictEqual(tick); - }); - - it('1 t0/1800 t1', () => { - const baseToken: Token = token1; - const quoteToken: Token = token0; - const tick: i32 = 74960; - expect(reciprocal(baseToken, quoteToken, tick)).toStrictEqual(tick); - }) - - it('1 t1/1800 t0', () => { - const baseToken: Token = token0; - const quoteToken: Token = token1; - const tick: i32 = -74960; - expect(reciprocal(baseToken, quoteToken, tick)).toStrictEqual(tick); - }) - - it('1800 t1/1 t0', () => { - const baseToken: Token = token0; - const quoteToken: Token = token1; - const tick: i32 = 74960; - expect(reciprocal(baseToken, quoteToken, tick)).toStrictEqual(tick); - }) - - it('1.01 t2/1 t0', () => { - const baseToken: Token = token0; - const quoteToken: Token = token2_6decimals; - const tick: i32 = -276225; - expect(reciprocal(baseToken, quoteToken, tick)).toStrictEqual(tick); - }) - - it('1 t0/1.01 t2', () => { - const baseToken: Token = token2_6decimals; - const quoteToken: Token = token0; - const tick: i32 = -276225; - expect(reciprocal(baseToken, quoteToken, tick)).toStrictEqual(tick); - }) - }) - }) -}) \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/route.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/route.spec.ts deleted file mode 100644 index ff2ca6fe0..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/route.spec.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { getWrappedNative } from "../../../token"; -import { ChainId, Currency, FeeAmount, Pool, Price, Route, Token } from "../../../wrap"; -import { - createPool, - encodeSqrtRatioX96, - getTickAtSqrtRatio, - createRoute, - routeChainId, - routeMidPrice, -} from "../../.."; -import { BigInt, BigNumber } from "@polywrap/wasm-as"; - -const ETHER: Currency = { - decimals: 18, - name: "Ether", - symbol: "ETH", -}; - -const getTestToken = (i: i32): Token => { - return { - chainId: ChainId.MAINNET, - address: "0x000000000000000000000000000000000000000" + i.toString(), - currency: { - decimals: 18, - symbol: "t" + i.toString(), - name: null, - } - } -} - -const getTestPool = (tokenA: Token, tokenB: Token, amount1: BigInt, amount0: BigInt): Pool => { - const sqrtRatioX96: BigInt = encodeSqrtRatioX96({ amount1, amount0 }); - return createPool({ - tokenA: tokenA, - tokenB: tokenB, - fee: FeeAmount.MEDIUM, - sqrtRatioX96: sqrtRatioX96, - liquidity: BigInt.ZERO, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96 }), - ticks: [], - }); -} - -const eth: Token = { - chainId: ChainId.MAINNET, - address: "", - currency: ETHER, -}; -const weth: Token = getWrappedNative({ chainId: ChainId.MAINNET }); -const token0: Token = getTestToken(0); -const token1: Token = getTestToken(1); -const token2: Token = getTestToken(2); -let pool_0_1: Pool; -let pool_0_weth: Pool; -let pool_1_weth: Pool; -let pool_1_2: Pool; - -describe('Route', () => { - - describe('createRoute', () => { - - beforeAll(() => { - pool_0_1 = getTestPool(token0, token1, BigInt.ONE, BigInt.ONE); - pool_0_weth = getTestPool(token0, weth, BigInt.ONE, BigInt.ONE); - pool_1_weth = getTestPool(token1, weth, BigInt.ONE, BigInt.ONE); - }); - - it('constructs a path from the tokens', () => { - const route: Route = createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }); - expect(route.pools).toStrictEqual([pool_0_1]); - expect(route.path).toStrictEqual([token0, token1]); - expect(route.input).toStrictEqual(token0); - expect(route.output).toStrictEqual(token1); - expect(routeChainId({ route })).toStrictEqual(ChainId.MAINNET); - }); - - it('should fail if the input is not in the first pool', () => { - const error = (): void => { - createRoute({ pools: [pool_0_1], inToken: weth, outToken: token1 }); - }; - expect(error).toThrow(); - }); - - it('should fail if output is not in the last pool', () => { - const error = (): void => { - createRoute({ pools: [pool_0_1], inToken: token0, outToken: weth }); - }; - expect(error).toThrow(); - }); - - it('can have a token as both input and output', () => { - const route: Route = createRoute({ - pools: [pool_0_weth, pool_0_1, pool_1_weth], - inToken: weth, - outToken: weth, - }); - expect(route.pools).toStrictEqual([pool_0_weth, pool_0_1, pool_1_weth]); - expect(route.input).toStrictEqual(weth); - expect(route.output).toStrictEqual(weth); - }); - - it('supports ether input', () => { - const route: Route = createRoute({ - pools: [pool_0_weth], - inToken: eth, - outToken: token0, - }); - expect(route.pools).toStrictEqual([pool_0_weth]); - expect(route.input).toStrictEqual(eth); - expect(route.output).toStrictEqual(token0); - }); - - it('supports ether output', () => { - const route: Route = createRoute({ - pools: [pool_0_weth], - inToken: token0, - outToken: eth, - }); - expect(route.pools).toStrictEqual([pool_0_weth]); - expect(route.input).toStrictEqual(token0); - expect(route.output).toStrictEqual(eth); - }); - }); - - describe('routeMidPrice', () => { - - beforeAll(() => { - pool_0_1 = getTestPool(token0, token1, BigInt.fromUInt16(1), BigInt.fromUInt16(5)); - pool_1_2 = getTestPool(token1, token2, BigInt.fromUInt16(15), BigInt.fromUInt16(30)); - pool_0_weth = getTestPool(token0, weth, BigInt.fromUInt16(3), BigInt.fromUInt16(1)); - pool_1_weth = getTestPool(token1, weth, BigInt.fromUInt16(1), BigInt.fromUInt16(7)); - }); - - it('correct for 0 -> 1', () => { - const route: Route = createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }); - const price: Price = routeMidPrice({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }); - expect(price).toStrictEqual(route.midPrice); - expect(price.price.substring(0, 6)).toStrictEqual('0.2000'); - expect(price.baseToken).toStrictEqual(token0); - expect(price.quoteToken).toStrictEqual(token1); - }); - - it('correct for 1 -> 0', () => { - const route: Route = createRoute({ - pools: [pool_0_1], - inToken: token1, - outToken: token0, - }); - const price: Price = routeMidPrice({ - pools: [pool_0_1], - inToken: token1, - outToken: token0, - }); - expect(price).toStrictEqual(route.midPrice); - expect(price.price.substring(0, 6)).toStrictEqual('5.0000'); - expect(price.baseToken).toStrictEqual(token1); - expect(price.quoteToken).toStrictEqual(token0); - }); - - it('correct for 0 -> 1 -> 2', () => { - const route: Route = createRoute({ - pools: [pool_0_1, pool_1_2], - inToken: token0, - outToken: token2, - }); - const price: Price = routeMidPrice({ - pools: [pool_0_1, pool_1_2], - inToken: token0, - outToken: token2, - }); - expect(price).toStrictEqual(route.midPrice); - expect(price.price.substring(0, 6)).toStrictEqual('0.1'); - expect(price.baseToken).toStrictEqual(token0); - expect(price.quoteToken).toStrictEqual(token2); - }); - - it('correct for 2 -> 1 -> 0', () => { - const route: Route = createRoute({ - pools: [pool_1_2, pool_0_1], - inToken: token2, - outToken: token0, - }); - const price: Price = routeMidPrice({ - pools: [pool_1_2, pool_0_1], - inToken: token2, - outToken: token0, - }); - expect(price).toStrictEqual(route.midPrice); - expect(price.price.substring(0, 7)).toStrictEqual('10.0000'); - expect(price.baseToken).toStrictEqual(token2); - expect(price.quoteToken).toStrictEqual(token0); - }); - - it('correct for ether -> 0', () => { - const route: Route = createRoute({ - pools: [pool_0_weth], - inToken: eth, - outToken: token0, - }); - const price: Price = routeMidPrice({ - pools: [pool_0_weth], - inToken: eth, - outToken: token0, - }); - expect(price).toStrictEqual(route.midPrice); - expect(price.price.substring(0, 6)).toStrictEqual('0.3333'); - expect(price.baseToken).toStrictEqual(eth); - expect(price.quoteToken).toStrictEqual(token0); - }); - - it('correct for 1 -> weth', () => { - const route: Route = createRoute({ - pools: [pool_1_weth], - inToken: token1, - outToken: weth, - }); - const price: Price = routeMidPrice({ - pools: [pool_1_weth], - inToken: token1, - outToken: weth, - }); - expect(price).toStrictEqual(route.midPrice); - const priceStr: string = BigNumber.fromString(price.price).toFixed(4); - expect(priceStr).toStrictEqual('0.1429'); - expect(price.baseToken).toStrictEqual(token1); - expect(price.quoteToken).toStrictEqual(weth); - }); - - it('correct for ether -> 0 -> 1 -> weth', () => { - const route: Route = createRoute({ - pools: [pool_0_weth, pool_0_1, pool_1_weth], - inToken: eth, - outToken: weth, - }); - const price: Price = routeMidPrice({ - pools: [pool_0_weth, pool_0_1, pool_1_weth], - inToken: eth, - outToken: weth, - }); - expect(price).toStrictEqual(route.midPrice); - const priceStr: string = BigNumber.fromString(price.price).toFixed(6); - expect(priceStr).toStrictEqual('0.009524'); - expect(price.baseToken).toStrictEqual(eth); - expect(price.quoteToken).toStrictEqual(weth); - }); - - it('correct for weth -> 0 -> 1 -> ether', () => { - const route: Route = createRoute({ - pools: [pool_0_weth, pool_0_1, pool_1_weth], - inToken: weth, - outToken: eth, - }); - const price: Price = routeMidPrice({ - pools: [pool_0_weth, pool_0_1, pool_1_weth], - inToken: weth, - outToken: eth, - }); - expect(price).toStrictEqual(route.midPrice); - const priceStr: string = BigNumber.fromString(price.price).toFixed(6); - expect(priceStr).toStrictEqual('0.009524'); - expect(price.baseToken).toStrictEqual(weth); - expect(price.quoteToken).toStrictEqual(eth); - }); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListDataProvider.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListDataProvider.spec.ts deleted file mode 100644 index d6aa132a9..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListDataProvider.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { getTick, validateTickList } from "../../.."; -import { BigInt } from "@polywrap/wasm-as"; -import { Tick } from "../../../wrap"; - -describe('TickListDataProvider', () => { - - describe('TickListDataProvider constructor', () => { - - it('can take an empty list of ticks', () => { - const noError = (): void => { - validateTickList({ ticks: [], tickSpacing: 1 }); - }; - expect(noError).not.toThrow(); - }); - - it('throws for 0 tick spacing', () => { - const error = (): void => { - validateTickList({ ticks: [], tickSpacing: 0 }); - }; - expect(error).toThrow("TICK_SPACING_NONZERO: Tick spacing must be greater than zero"); - }); - - it('throws for uneven tick list', () => { - const error = (): void => { - validateTickList({ ticks: [ - { index: -1, liquidityNet: BigInt.fromString("-1"), liquidityGross: BigInt.ONE }, - { index: 1, liquidityNet: BigInt.fromUInt16(2), liquidityGross: BigInt.ONE } - ], tickSpacing: 0 }); - }; - expect(error).toThrow("ZERO_NET: tick net liquidity values must sum to 0"); - }); - }); - - describe('getTick', () => { - - it('throws if tick not in list', () => { - const error = (): void => { - const ticks: Tick[] = [ - { index: -1, liquidityNet: BigInt.fromString("-1"), liquidityGross: BigInt.ONE }, - { index: 1, liquidityNet: BigInt.ONE, liquidityGross: BigInt.ONE } - ]; - validateTickList({ ticks, tickSpacing: 1 }); - getTick({ tickIndex: 0, tickDataProvider: ticks }); - }; - expect(error).toThrow("NOT_CONTAINED: requested tick not found in tick list"); - }); - - it('gets the smallest tick from the list', () => { - const ticks: Tick[] = [ - { index: -1, liquidityNet: BigInt.fromString("-1"), liquidityGross: BigInt.ONE }, - { index: 1, liquidityNet: BigInt.ONE, liquidityGross: BigInt.ONE } - ]; - validateTickList({ ticks, tickSpacing: 1 }); - const tick: Tick = getTick({ tickIndex: -1, tickDataProvider: ticks }); - expect(tick.liquidityNet).toStrictEqual(BigInt.fromString("-1")); - expect(tick.liquidityGross).toStrictEqual(BigInt.ONE); - }); - - it('gets the largest tick from the list', () => { - const ticks: Tick[] = [ - { index: -1, liquidityNet: BigInt.fromString("-1"), liquidityGross: BigInt.ONE }, - { index: 1, liquidityNet: BigInt.ONE, liquidityGross: BigInt.ONE } - ]; - validateTickList({ ticks, tickSpacing: 1 }); - const tick: Tick = getTick({ tickIndex: 1, tickDataProvider: ticks }); - expect(tick.liquidityNet).toStrictEqual(BigInt.ONE) - expect(tick.liquidityGross).toStrictEqual(BigInt.ONE) - }) - }) -}) \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListIsSorted.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListIsSorted.spec.ts deleted file mode 100644 index 8666736a8..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListIsSorted.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { tickListIsSorted } from "../../.."; -import { Tick } from "../../../wrap"; -import { BigInt } from "@polywrap/wasm-as"; - -const tick1: Tick = { - index: 1, - liquidityGross: BigInt.ZERO, - liquidityNet: BigInt.ZERO, - }; -const tick2: Tick = { - index: 2, - liquidityGross: BigInt.ZERO, - liquidityNet: BigInt.ZERO, - }; -const tick3: Tick = { - index: 3, - liquidityGross: BigInt.ZERO, - liquidityNet: BigInt.ZERO, - }; -const tick4: Tick = { - index: 4, - liquidityGross: BigInt.ZERO, - liquidityNet: BigInt.ZERO, - }; -const tick5: Tick = { - index: 5, - liquidityGross: BigInt.ZERO, - liquidityNet: BigInt.ZERO, - }; -const tick6: Tick = { - index: 6, - liquidityGross: BigInt.ZERO, - liquidityNet: BigInt.ZERO, -}; -const tick7: Tick = { - index: 7, - liquidityGross: BigInt.ZERO, - liquidityNet: BigInt.ZERO, -}; - -const tick2Copy: Tick = { - index: 2, - liquidityGross: BigInt.ZERO, - liquidityNet: BigInt.ZERO, -}; - -describe('tickListIsSorted', () => { - - it('list with one element', () => { - expect(tickListIsSorted({ticks: [tick1]})).toStrictEqual(true); - }); - - it('list with two sorted elements', () => { - expect(tickListIsSorted({ticks: [tick1, tick2]})).toStrictEqual(true); - }); - - it('list with two equal elements', () => { - expect(tickListIsSorted({ticks: [tick2, tick2Copy]})).toStrictEqual(true); - }); - - it('list with two unsorted elements', () => { - expect(tickListIsSorted({ticks: [tick2, tick1]})).toStrictEqual(false); - }); - - it('list with many elements with one unsorted pair', () => { - expect(tickListIsSorted({ticks: [tick1, tick2, tick3, tick4, tick6, tick5, tick7]})).toStrictEqual(false); - }); - - it('list with many elements with one unsorted pair at the end', () => { - expect(tickListIsSorted({ticks: [tick1, tick2, tick3, tick4, tick5, tick7, tick6]})).toStrictEqual(false); - }); - - it('list with many elements with one unsorted pair at the beginning', () => { - expect(tickListIsSorted({ticks: [tick2, tick1, tick3, tick4, tick5, tick6, tick7]})).toStrictEqual(false); - }); - - it('list with many elements with duplicates', () => { - expect(tickListIsSorted({ticks: [tick1, tick2, tick2Copy, tick3, tick4, tick5, tick6, tick7]})).toStrictEqual(true); - }); -}) \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListUtils.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListUtils.spec.ts deleted file mode 100644 index d661b80db..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickListUtils.spec.ts +++ /dev/null @@ -1,335 +0,0 @@ -import { FeeAmount, Args_nextInitializedTick, Args_validateTickList, Tick } from "../../../wrap"; -import { BigInt } from "@polywrap/wasm-as"; -import { _MAX_TICK, _MIN_TICK, _feeAmountToTickSpacing } from "../../../utils"; -import * as TickList from "../../../tickList/index"; -import * as TickListUtils from "../../../tickList/utils"; -import { nearestUsableTick } from "../../.."; - -let highTick: Tick; -let lowTick: Tick; -let midTick: Tick; -let ticks: Tick[]; - -describe('TickList', () => { - - beforeEach(() => { - lowTick = { - index: _MIN_TICK + 1, - liquidityNet: BigInt.fromUInt16(10), - liquidityGross: BigInt.fromUInt16(10), - }; - midTick = { - index: 0, - liquidityNet: BigInt.fromString("-5"), - liquidityGross: BigInt.fromUInt16(5), - }; - highTick = { - index: _MAX_TICK - 1, - liquidityNet: BigInt.fromString("-5"), - liquidityGross: BigInt.fromUInt16(5), - }; - }); - - describe('validate', () => { - - it('errors for incomplete lists', () => { - const _error = (): void => { - const args: Args_validateTickList = {ticks: [lowTick], tickSpacing: 1 }; - TickListUtils.validateTickList(args) - }; - expect(_error).toThrow("ZERO_NET: tick net liquidity values must sum to 0"); - }); - - it('errors for unsorted lists', () => { - const _error = (): void => { - const args: Args_validateTickList = { ticks: [highTick, lowTick, midTick], tickSpacing: 1 }; - TickListUtils.validateTickList(args) - }; - expect(_error).toThrow("SORTED: tick list must be sorted by index"); - }); - - it('errors if ticks are not on multiples of tick spacing', () => { - const _error = (): void => { - const args: Args_validateTickList = { ticks: [highTick, lowTick, midTick], tickSpacing: 1337 }; - TickListUtils.validateTickList(args) - }; - expect(_error).toThrow("TICK_SPACING: Tick indices must be multiples of tickSpacing"); - }); - }); - - it('isBelowSmallest', () => { - const ticks: Tick[] = [lowTick, midTick, highTick]; - expect(TickListUtils.tickIsBelowSmallest({ ticks: ticks, tick: _MIN_TICK })).toStrictEqual(true); - expect(TickListUtils.tickIsBelowSmallest({ticks: ticks, tick: _MIN_TICK + 1 })).toStrictEqual(false); - }); - - it('isAtOrAboveLargest', () => { - const ticks: Tick[] = [lowTick, midTick, highTick]; - expect(TickListUtils.tickIsAtOrAboveLargest({ ticks: ticks, tick: _MAX_TICK - 2 })).toStrictEqual(false); - expect(TickListUtils.tickIsAtOrAboveLargest({ ticks: ticks, tick: _MAX_TICK - 1 })).toStrictEqual(true); - }); - - describe('nextInitializedTick', () => { - - beforeEach(() => { - ticks = [lowTick, midTick, highTick]; - }); - - it('low - lte = true', () => { - const _error = (): void => { - const args: Args_nextInitializedTick = { ticks: ticks, tick: _MIN_TICK, lte: true }; - TickListUtils.nextInitializedTick(args); - }; - expect(_error).toThrow("BELOW_SMALLEST: tick is below smallest tick index in the list"); - - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: _MIN_TICK + 1, lte: true })).toStrictEqual(lowTick); - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: _MIN_TICK + 2, lte: true })).toStrictEqual(lowTick); - }); - - it('low - lte = false', () => { - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: _MIN_TICK, lte: false })).toStrictEqual(lowTick); - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: _MIN_TICK + 1, lte: false })).toStrictEqual(midTick); - }); - - it('mid - lte = true', () => { - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: 0, lte: true })).toStrictEqual(midTick); - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: 1, lte: true })).toStrictEqual(midTick); - }); - - it('mid - lte = false', () => { - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: -1, lte: false })).toStrictEqual(midTick); - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: 1, lte: false })).toStrictEqual(highTick); - }); - - it('high - lte = true', () => { - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: _MAX_TICK - 1, lte: true })).toStrictEqual(highTick); - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: _MAX_TICK, lte: true })).toStrictEqual(highTick); - }); - - it('high - lte = false', () => { - const _error = (): void => { - const args: Args_nextInitializedTick = { ticks: ticks, tick: _MAX_TICK - 1, lte: false }; - TickListUtils.nextInitializedTick(args); - }; - expect(_error).toThrow("AT_OR_ABOVE_LARGEST: tick is at or above largest tick index in the list"); - - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: _MAX_TICK - 2, lte: false })).toStrictEqual(highTick) - expect(TickListUtils.nextInitializedTick({ ticks: ticks, tick: _MAX_TICK - 3, lte: false })).toStrictEqual(highTick) - }); - }); - - describe('nextInitializedTickWithinOneWord', () => { - - beforeEach(() => { - ticks = [lowTick, midTick, highTick]; - }); - - it('words around 0, lte = true', () => { - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -257, - lte: true, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: -512, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -256, - lte: true, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: -256, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -1, - lte: true, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: -256, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 0, - lte: true, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 0, - found: true, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 1, - lte: true, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 0, - found: true, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 255, - lte: true, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 0, - found: true, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 256, - lte: true, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 256, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 257, - lte: true, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 256, - found: false, - }); - }) - - it('words around 0, lte = false', () => { - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -258, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: -257, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -257, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: -1, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -256, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: -1, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -2, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: -1, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -1, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 0, - found: true, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 0, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 255, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 1, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 255, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 254, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 255, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 255, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 511, - found: false, - }); - - expect(TickList.nextInitializedTickWithinOneWord({ - tick: 256, - lte: false, - tickSpacing: 1, - tickDataProvider: ticks, - })).toStrictEqual({ - index: 511, - found: false, - }); - }); - - it('pool getInputAmount and getOutputAmount failed test params', () => { - const ONE_ETHER: BigInt = BigInt.pow(BigInt.fromUInt16(10), 18); - ticks = [ - { - index: nearestUsableTick({ tick: _MIN_TICK, tickSpacing: _feeAmountToTickSpacing(FeeAmount.LOW) }), - liquidityNet: ONE_ETHER, - liquidityGross: ONE_ETHER - }, - { - index: nearestUsableTick({ tick: _MAX_TICK, tickSpacing: _feeAmountToTickSpacing(FeeAmount.LOW) }), - liquidityNet: ONE_ETHER.opposite(), - liquidityGross: ONE_ETHER - }]; - expect(TickList.nextInitializedTickWithinOneWord({ - tick: -1, - lte: true, - tickSpacing: 10, - tickDataProvider: ticks, - })).toStrictEqual({ - index: -2560, - found: false, - }); - }); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickMath.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickMath.spec.ts deleted file mode 100644 index 08f6787a6..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/tickMath.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { _MIN_TICK, _MAX_TICK, _MIN_SQRT_RATIO, _MAX_SQRT_RATIO } from "../../../utils"; -import * as TickUtils from "../../.."; -import { BigInt } from "@polywrap/wasm-as"; - -describe('TickMath', () => { - - describe('MIN_TICK', () => { - it('equals correct value', () => { - expect(_MIN_TICK).toStrictEqual(-887272); - }); - }); - - describe('MAX_TICK', () => { - it('equals correct value', () => { - expect(_MAX_TICK).toStrictEqual(887272) - }) - }) - - describe('getSqrtRatioAtTick', () => { - - it('throws for tick too small', () => { - expect(() => TickUtils.getSqrtRatioAtTick({ tick: _MIN_TICK - 1 })).toThrow(`TICK_BOUND: tick index is out of range ${_MIN_TICK} to ${_MAX_TICK}`); - }); - - it('throws for tick too large', () => { - expect(() => TickUtils.getSqrtRatioAtTick({ tick: _MAX_TICK + 1 })).toThrow(`TICK_BOUND: tick index is out of range ${_MIN_TICK} to ${_MAX_TICK}`); - }); - - it('returns the correct value for min tick', () => { - expect(TickUtils.getSqrtRatioAtTick({ tick: _MIN_TICK}).toString()).toStrictEqual(_MIN_SQRT_RATIO.toString()); - }); - - it('returns the correct value for tick 0', () => { - expect(TickUtils.getSqrtRatioAtTick({ tick: 0 }).toString()).toStrictEqual(BigInt.ONE.leftShift(96).toString()); - }); - - it('returns the correct value for max tick', () => { - expect(TickUtils.getSqrtRatioAtTick({ tick: _MAX_TICK }).toString()).toStrictEqual(_MAX_SQRT_RATIO.toString()); - }); - }); - - describe('getTickAtSqrtRatio', () => { - - it('returns the correct value for sqrt ratio at min tick', () => { - expect(TickUtils.getTickAtSqrtRatio({sqrtRatioX96: _MIN_SQRT_RATIO })).toStrictEqual(_MIN_TICK); - }); - - it('returns the correct value for sqrt ratio at max tick', () => { - expect(TickUtils.getTickAtSqrtRatio({sqrtRatioX96: _MAX_SQRT_RATIO.subInt(1)})).toStrictEqual(_MAX_TICK - 1); - }); - }); -}) \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/trade.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/trade.spec.ts deleted file mode 100644 index e72f5bb41..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/core/trade.spec.ts +++ /dev/null @@ -1,1351 +0,0 @@ -import { - ChainId, Currency, - FeeAmount, Fraction, - Pool, - Price as PriceType, - Token, - TokenAmount, - Trade, - TradeSwap, - TradeType -} from "../../../wrap"; -import { getWrappedNative } from "../../../token"; -import { - bestTradeExactIn, - bestTradeExactOut, - createPool, - createRoute, - createTradeFromRoute, - createTradeFromRoutes, - createUncheckedTrade, - createUncheckedTradeWithMultipleRoutes, - encodeSqrtRatioX96, - getTickAtSqrtRatio, - nearestUsableTick, tradeExecutionPrice, - tradeMaximumAmountIn, - tradeMinimumAmountOut, tradePriceImpact, - tradeWorstExecutionPrice -} from "../../.."; -import { BigInt, BigNumber, Box } from "@polywrap/wasm-as"; -import { _feeAmountToTickSpacing, _MAX_TICK, _MIN_TICK, Price } from "../../../utils"; - -const ETHER: Currency = { - decimals: 18, - name: "Ether", - symbol: "ETH", -}; - -const getTestToken = (i: i32): Token => { - return { - chainId: ChainId.MAINNET, - address: "0x000000000000000000000000000000000000000" + (i + 1).toString(), - currency: { - decimals: 18, - symbol: "t" + i.toString(), - name: "token" + i.toString(), - } - }; -}; - -const v2StylePool = ( - reserve0: TokenAmount, - reserve1: TokenAmount, - feeAmount: FeeAmount = FeeAmount.MEDIUM -): Pool => { - const sqrtRatioX96: BigInt = encodeSqrtRatioX96({ amount1: reserve1.amount, amount0: reserve0.amount }); - const liquidity: BigInt = BigInt.mul(reserve0.amount, reserve1.amount).sqrt(); - return createPool({ - tokenA: reserve0.token, - tokenB: reserve1.token, - fee: feeAmount, - sqrtRatioX96: sqrtRatioX96, - liquidity: liquidity, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96 }), - ticks: [ - { - index: nearestUsableTick({ tick: _MIN_TICK, tickSpacing: _feeAmountToTickSpacing(feeAmount) }), - liquidityNet: liquidity, - liquidityGross: liquidity - }, - { - index: nearestUsableTick({ tick: _MAX_TICK, tickSpacing: _feeAmountToTickSpacing(feeAmount) }), - liquidityNet: liquidity.opposite(), - liquidityGross: liquidity - } - ], - }); -}; - -const eth: Token = { - chainId: ChainId.MAINNET, - address: "", - currency: ETHER, -}; -const token0 = getTestToken(0); -const token1 = getTestToken(1); -const token2 = getTestToken(2); -const token3 = getTestToken(3); - -const pool_0_1: Pool = v2StylePool( - { token: token0, amount: BigInt.fromUInt32(100000) }, - { token: token1, amount: BigInt.fromUInt32(100000) } -); -const pool_0_2: Pool = v2StylePool( - { token: token0, amount: BigInt.fromUInt32(100000) }, - { token: token2, amount: BigInt.fromUInt32(110000) } -); -const pool_0_3: Pool = v2StylePool( - { token: token0, amount: BigInt.fromUInt32(100000) }, - { token: token3, amount: BigInt.fromUInt32(90000) } -); -const pool_1_2: Pool = v2StylePool( - { token: token1, amount: BigInt.fromUInt32(120000) }, - { token: token2, amount: BigInt.fromUInt32(100000) } -); -const pool_1_3: Pool = v2StylePool( - { token: token1, amount: BigInt.fromUInt32(120000) }, - { token: token3, amount: BigInt.fromUInt32(130000) } -); -const pool_weth_0: Pool = v2StylePool( - { token: getWrappedNative({ chainId: ChainId.MAINNET }), amount: BigInt.fromUInt32(100000) }, - { token: token0, amount: BigInt.fromUInt32(100000) } -); -const pool_weth_1: Pool = v2StylePool( - { token: getWrappedNative({ chainId: ChainId.MAINNET }), amount: BigInt.fromUInt32(100000) }, - { token: token1, amount: BigInt.fromUInt32(100000) } -); -const pool_weth_2: Pool = v2StylePool( - { token: getWrappedNative({ chainId: ChainId.MAINNET }), amount: BigInt.fromUInt32(100000) }, - { token: token2, amount: BigInt.fromUInt32(100000) } -); - -const getSwap = (pools: Pool[], inToken: Token, outToken: Token, inputAmount: u16, outputAmount: u16): TradeSwap => { - return { - route: createRoute({ - pools, - inToken, - outToken, - }), - inputAmount: { - token: inToken, - amount: BigInt.fromUInt16(inputAmount), - }, - outputAmount: { - token: outToken, - amount: BigInt.fromUInt16(outputAmount), - }, - }; -}; - -const uncheckedTrade = (inToken: Token, outToken: Token, pools: Pool[], inputAmount: u16, outputAmount: u16, tradeType: TradeType): Trade => { - const swap: TradeSwap = getSwap(pools, inToken, outToken, inputAmount, outputAmount); - return createUncheckedTrade({ swap, tradeType }); -}; - -const uncheckedTradeMultiRoute = (inToken: Token, outToken: Token, pools0: Pool[], pools1: Pool[], in0: u16, out0: u16, in1: u16, out1: u16, tradeType: TradeType): Trade => { - return createUncheckedTradeWithMultipleRoutes({ - swaps: [ - getSwap(pools0, inToken, outToken, in0, out0), - getSwap(pools1, inToken, outToken, in1, out1) - ], - tradeType - }); -}; - -const tradeFromRoute = (inToken: Token, outToken: Token, pools: Pool[], amount: u16, tradeType: TradeType): Trade => { - return createTradeFromRoute({ - tradeRoute: { - route: createRoute({ - pools: pools, - inToken: inToken, - outToken: outToken, - }), - amount: { - token: tradeType == TradeType.EXACT_INPUT ? inToken : outToken, - amount: BigInt.fromUInt16(amount), - } - }, - tradeType: tradeType, - }); -}; - -const exactIn: Trade = uncheckedTrade(token0, token2, [pool_0_1, pool_1_2],100, 69, TradeType.EXACT_INPUT); -const exactInMultiRoute0: Trade = uncheckedTradeMultiRoute(token0, token2, [pool_0_1, pool_1_2], [pool_0_2], 50, 35, 50, 34, TradeType.EXACT_INPUT); -const exactInMultiRoute1: Trade = uncheckedTradeMultiRoute(token0, token2, [pool_0_1, pool_1_2], [pool_0_2], 90, 62, 10, 7, TradeType.EXACT_INPUT); -const exactOut: Trade = uncheckedTrade(token0, token2, [pool_0_1, pool_1_2], 156, 100, TradeType.EXACT_OUTPUT); -const exactOutMultiRoute0: Trade = uncheckedTradeMultiRoute(token0, token2, [pool_0_1, pool_1_2], [pool_0_2], 78, 50, 78, 50, TradeType.EXACT_OUTPUT); -const exactOutMultiRoute1: Trade = uncheckedTradeMultiRoute(token0, token2, [pool_0_1, pool_1_2], [pool_0_2], 140, 90, 16, 10, TradeType.EXACT_OUTPUT); -const exactInFromRoute0: Trade = tradeFromRoute(token0, token2, [pool_0_1, pool_1_2], 100, TradeType.EXACT_INPUT); -const exactInFromRoute1: Trade = tradeFromRoute(token0, token2, [pool_0_1, pool_1_2], 10000, TradeType.EXACT_INPUT); -const exactOutFromRoute0: Trade = tradeFromRoute(token0, token2, [pool_0_1, pool_1_2], 10000, TradeType.EXACT_OUTPUT); -const exactOutFromRoute1: Trade = tradeFromRoute(token0, token2, [pool_0_1, pool_1_2], 100, TradeType.EXACT_OUTPUT); - -describe('Trade', () => { - - describe('createTradeFromRoute', () => { - it('can be constructed with ETHER as input', () => { - const trade: Trade = createTradeFromRoute({ - tradeRoute: { - route: createRoute({ - pools: [pool_weth_0], - inToken: eth, - outToken: token0, - }), - amount: { - token: eth, - amount: BigInt.fromUInt16(10000), - } - }, - tradeType: TradeType.EXACT_INPUT - }); - expect(trade.inputAmount.token).toStrictEqual(eth); - expect(trade.outputAmount.token).toStrictEqual(token0); - }); - - it('can be constructed with ETHER as input for exact output', () => { - const trade: Trade = createTradeFromRoute({ - tradeRoute: { - route: createRoute({ - pools: [pool_weth_0], - inToken: eth, - outToken: token0, - }), - amount: { - token: token0, - amount: BigInt.fromUInt16(10000), - } - }, - tradeType: TradeType.EXACT_OUTPUT - }); - expect(trade.inputAmount.token).toStrictEqual(eth); - expect(trade.outputAmount.token).toStrictEqual(token0); - }); - - it('can be constructed with ETHER as output', () => { - const trade: Trade = createTradeFromRoute({ - tradeRoute: { - route: createRoute({ - pools: [pool_weth_0], - inToken: token0, - outToken: eth, - }), - amount: { - token: eth, - amount: BigInt.fromUInt16(10000), - } - }, - tradeType: TradeType.EXACT_OUTPUT - }); - expect(trade.inputAmount.token).toStrictEqual(token0); - expect(trade.outputAmount.token).toStrictEqual(eth); - }); - - it('can be constructed with ETHER as output for exact input', () => { - const trade: Trade = createTradeFromRoute({ - tradeRoute: { - route: createRoute({ - pools: [pool_weth_0], - inToken: token0, - outToken: eth, - }), - amount: { - token: token0, - amount: BigInt.fromUInt16(10000), - } - }, - tradeType: TradeType.EXACT_INPUT - }); - expect(trade.inputAmount.token ).toStrictEqual(token0); - expect(trade.outputAmount.token).toStrictEqual(eth); - }); - }); - - describe('createTradeFromRoutes', () => { - it('can be constructed with ETHER as input with multiple routes', () => { - const trade: Trade = createTradeFromRoutes({ - tradeRoutes: [{ - route: createRoute({ - pools: [pool_weth_0], - inToken: eth, - outToken: token0, - }), - amount: { - token: eth, - amount: BigInt.fromUInt16(10000), - } - }], - tradeType: TradeType.EXACT_INPUT - }); - expect(trade.inputAmount.token).toStrictEqual(eth); - expect(trade.outputAmount.token).toStrictEqual(token0); - }); - - it('can be constructed with ETHER as input for exact output with multiple routes', () => { - const trade: Trade = createTradeFromRoutes({ - tradeRoutes: [ - { - route: createRoute({ - pools: [pool_weth_0], - inToken: eth, - outToken: token0, - }), - amount: { - token: token0, - amount: BigInt.fromUInt16(3000), - } - }, - { - route: createRoute({ - pools: [pool_weth_1, pool_0_1], - inToken: eth, - outToken: token0, - }), - amount: { - token: token0, - amount: BigInt.fromUInt16(7000), - } - }, - ], - tradeType: TradeType.EXACT_OUTPUT - }); - expect(trade.inputAmount.token).toStrictEqual(eth); - expect(trade.outputAmount.token).toStrictEqual(token0); - }); - - it('can be constructed with ETHER as output with multiple routes', () => { - const trade: Trade = createTradeFromRoutes({ - tradeRoutes: [ - { - route: createRoute({ - pools: [pool_weth_0], - inToken: token0, - outToken: eth, - }), - amount: { - token: eth, - amount: BigInt.fromUInt16(4000), - } - }, - { - route: createRoute({ - pools: [pool_0_1, pool_weth_1], - inToken: token0, - outToken: eth, - }), - amount: { - token: eth, - amount: BigInt.fromUInt16(6000), - } - }, - ], - tradeType: TradeType.EXACT_OUTPUT - }); - expect(trade.inputAmount.token).toStrictEqual(token0); - expect(trade.outputAmount.token).toStrictEqual(eth); - }); - - it('can be constructed with ETHER as output for exact input with multiple routes', () => { - const trade: Trade = createTradeFromRoutes({ - tradeRoutes: [ - { - route: createRoute({ - pools: [pool_weth_0], - inToken: token0, - outToken: eth, - }), - amount: { - token: token0, - amount: BigInt.fromUInt16(3000), - } - }, - { - route: createRoute({ - pools: [pool_0_1, pool_weth_1], - inToken: token0, - outToken: eth, - }), - amount: { - token: token0, - amount: BigInt.fromUInt16(6000), - } - }, - ], - tradeType: TradeType.EXACT_INPUT - }); - expect(trade.inputAmount.token).toStrictEqual(token0); - expect(trade.outputAmount.token).toStrictEqual(eth); - }); - - it('throws if pools are re-used between routes', () => { - const error = (): void => { - createTradeFromRoutes({ - tradeRoutes: [ - { - route: createRoute({ - pools: [pool_0_1, pool_weth_1], - inToken: token0, - outToken: eth, - }), - amount: { - token: token0, - amount: BigInt.fromUInt16(4500), - } - }, - { - route: createRoute({ - pools: [pool_0_1, pool_1_2, pool_weth_2], - inToken: token0, - outToken: eth, - }), - amount: { - token: token0, - amount: BigInt.fromUInt16(5500), - } - }, - ], - tradeType: TradeType.EXACT_INPUT - }); - }; - expect(error).toThrow('POOLS_DUPLICATED: pools must be unique within and across routes'); - }); - }); - - describe('createUncheckedTrade', () => { - it('throws if input currency does not match route', () => { - const error = (): void => { - createUncheckedTrade({ - swap: { - route: createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token2, - amount: BigInt.fromUInt16(10000), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(10000), - } - }, - tradeType: TradeType.EXACT_INPUT, - }); - }; - expect(error).toThrow('INPUT_CURRENCY_MATCH: the input token of the trade and all its routes must match'); - }); - - it('throws if output currency does not match route', () => { - const error = (): void => { - createUncheckedTrade({ - swap: { - route: createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(10000), - }, - outputAmount: { - token: token2, - amount: BigInt.fromUInt16(10000), - } - }, - tradeType: TradeType.EXACT_INPUT, - }); - }; - expect(error).toThrow('OUTPUT_CURRENCY_MATCH: the output token of the trade and all its routes must match'); - }); - - it('can create an exact input trade without simulating', () => { - createUncheckedTrade({ - swap: { - route: createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(10000), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(10000), - } - }, - tradeType: TradeType.EXACT_INPUT, - }); - }); - - it('can create an exact output trade without simulating', () => { - createUncheckedTrade({ - swap: { - route: createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(10000), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(10000), - } - }, - tradeType: TradeType.EXACT_OUTPUT, - }); - }); - }); - - describe('createUncheckedTradeWithMultipleRoutes', () => { - it('throws if input currency does not match route with multiple routes', () => { - const error = (): void => { - createUncheckedTradeWithMultipleRoutes({ - swaps: [ - { - route: createRoute({ - pools: [pool_1_2], - inToken: token2, - outToken: token1, - }), - inputAmount: { - token: token2, - amount: BigInt.fromUInt16(2000), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(2000), - } - }, - { - route: createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token2, - amount: BigInt.fromUInt16(8000), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(8000), - } - }, - ], - tradeType: TradeType.EXACT_INPUT, - }); - }; - expect(error).toThrow('INPUT_CURRENCY_MATCH: the input token of the trade and all its routes must match'); - }); - - it('throws if output currency does not match route with multiple routes', () => { - const error = (): void => { - createUncheckedTradeWithMultipleRoutes({ - swaps: [ - { - route: createRoute({ - pools: [pool_0_2], - inToken: token0, - outToken: token2, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(10000), - }, - outputAmount: { - token: token2, - amount: BigInt.fromUInt16(10000), - } - }, - { - route: createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(10000), - }, - outputAmount: { - token: token2, - amount: BigInt.fromUInt16(10000), - } - }, - ], - tradeType: TradeType.EXACT_INPUT, - }); - }; - expect(error).toThrow('OUTPUT_CURRENCY_MATCH: the output token of the trade and all its routes must match'); - }); - - it('can create an exact input trade without simulating with multiple routes', () => { - createUncheckedTradeWithMultipleRoutes({ - swaps: [ - { - route: createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(5000), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(5000), - } - }, - { - route: createRoute({ - pools: [pool_0_2, pool_1_2], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(5000), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(5000), - } - }, - ], - tradeType: TradeType.EXACT_INPUT, - }); - }); - - it('can create an exact output trade without simulating with multiple routes', () => { - createUncheckedTradeWithMultipleRoutes({ - swaps: [ - { - route: createRoute({ - pools: [pool_0_1], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(5001), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(5000), - } - }, - { - route: createRoute({ - pools: [pool_0_2, pool_1_2], - inToken: token0, - outToken: token1, - }), - inputAmount: { - token: token0, - amount: BigInt.fromUInt16(4999), - }, - outputAmount: { - token: token1, - amount: BigInt.fromUInt16(5000), - } - }, - ], - tradeType: TradeType.EXACT_OUTPUT, - }); - }); - }); - - describe('route and swaps', () => { - it('can access routes for both single and multi route trades', () => { - expect(exactIn.swaps).toHaveLength(1) - expect(exactInMultiRoute0.swaps).toHaveLength(2) - }); - }); - - describe('tradeWorstExecutionPrice', () => { - describe('tradeType = EXACT_INPUT', () => { - it('throws if less than 0', () => { - const error = (): void => { - tradeWorstExecutionPrice({ - trade: exactIn, - slippageTolerance: "-0.01", - }); - }; - expect(error).toThrow("SLIPPAGE_TOLERANCE: slippage tolerance cannot be less than zero"); - }); - - it('returns exact if 0', () => { - const price: PriceType = tradeWorstExecutionPrice({ - trade: exactIn, - slippageTolerance: "0", - }); - expect(price).toStrictEqual(exactIn.executionPrice); - expect(price).toStrictEqual(tradeExecutionPrice({ - inputAmount: exactIn.inputAmount, - outputAmount: exactIn.outputAmount - })); - }); - - it('returns exact if nonzero', () => { - const expected0: string = new Price(token0, token2, BigInt.fromUInt16(100), BigInt.fromUInt16(69)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactIn, - slippageTolerance: "0", - }).price).toStrictEqual(expected0); - - const expected0005: string = new Price(token0, token2, BigInt.fromUInt16(100), BigInt.fromUInt16(65)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactIn, - slippageTolerance: "0.05", - }).price).toStrictEqual(expected0005); - - const expected002: string = new Price(token0, token2, BigInt.fromUInt16(100), BigInt.fromUInt16(23)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactIn, - slippageTolerance: "2", - }).price).toStrictEqual(expected002); - }); - - it('returns exact if nonzero with multiple routes', () => { - const expected0: string = new Price(token0, token2, BigInt.fromUInt16(100), BigInt.fromUInt16(69)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactInMultiRoute0, - slippageTolerance: "0", - }).price).toStrictEqual(expected0); - - const expected0005: string = new Price(token0, token2, BigInt.fromUInt16(100), BigInt.fromUInt16(65)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactInMultiRoute0, - slippageTolerance: "0.05", - }).price).toStrictEqual(expected0005); - - const expected002: string = new Price(token0, token2, BigInt.fromUInt16(100), BigInt.fromUInt16(23)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactInMultiRoute0, - slippageTolerance: "2", - }).price).toStrictEqual(expected002); - }); - }); - - describe('tradeType = EXACT_OUTPUT', () => { - it('throws if less than 0', () => { - const error = (): void => { - tradeWorstExecutionPrice({ - trade: exactOut, - slippageTolerance: "-0.01", - }); - }; - expect(error).toThrow("SLIPPAGE_TOLERANCE: slippage tolerance cannot be less than zero"); - }); - - it('returns exact if 0', () => { - const price: PriceType = tradeWorstExecutionPrice({ - trade: exactOut, - slippageTolerance: "0", - }); - expect(price).toStrictEqual(exactOut.executionPrice); - expect(price).toStrictEqual(tradeExecutionPrice({ - inputAmount: exactOut.inputAmount, - outputAmount: exactOut.outputAmount - })); - }); - - it('returns slippage amount if nonzero', () => { - const expected0: string = new Price(token0, token2, BigInt.fromUInt16(156), BigInt.fromUInt16(100)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactOut, - slippageTolerance: "0", - }).price).toStrictEqual(expected0); - - const expected0005: string = new Price(token0, token2, BigInt.fromUInt16(163), BigInt.fromUInt16(100)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactOut, - slippageTolerance: "0.05", - }).price).toStrictEqual(expected0005); - - const expected002: string = new Price(token0, token2, BigInt.fromUInt16(468), BigInt.fromUInt16(100)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactOut, - slippageTolerance: "2", - }).price).toStrictEqual(expected002); - }); - - it('returns exact if nonzero with multiple routes', () => { - const expected0: string = new Price(token0, token2, BigInt.fromUInt16(156), BigInt.fromUInt16(100)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactOutMultiRoute0, - slippageTolerance: "0", - }).price).toStrictEqual(expected0); - - const expected0005: string = new Price(token0, token2, BigInt.fromUInt16(163), BigInt.fromUInt16(100)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactOutMultiRoute0, - slippageTolerance: "0.05", - }).price).toStrictEqual(expected0005); - - const expected002: string = new Price(token0, token2, BigInt.fromUInt16(468), BigInt.fromUInt16(100)).toFixed(18); - expect(tradeWorstExecutionPrice({ - trade: exactOutMultiRoute0, - slippageTolerance: "2", - }).price).toStrictEqual(expected002); - }); - }); - }); - - describe('tradePriceImpact', () => { - describe('tradeType = EXACT_INPUT', () => { - it('is correct', () => { - const result: string = BigNumber.fromString(exactIn.priceImpact.quotient).toSignificant(3); - expect(result).toStrictEqual('0.172'); - const priceImpact: Fraction = tradePriceImpact({ swaps: exactIn.swaps, outputAmount: exactIn.outputAmount }); - expect(priceImpact).toStrictEqual(exactIn.priceImpact); - }); - - it('is correct with multiple routes', () => { - const result: string = BigNumber.fromString(exactInMultiRoute1.priceImpact.quotient).toSignificant(3); - expect(result).toStrictEqual('0.198'); - const priceImpact: Fraction = tradePriceImpact({ swaps: exactInMultiRoute1.swaps, outputAmount: exactInMultiRoute1.outputAmount }); - expect(priceImpact).toStrictEqual(exactInMultiRoute1.priceImpact); - }); - }); - - describe('tradeType = EXACT_OUTPUT', () => { - it('is correct', () => { - const result: string = BigNumber.fromString(exactOut.priceImpact.quotient).toSignificant(3); - expect(result).toStrictEqual('0.231'); - const priceImpact: Fraction = tradePriceImpact({ swaps: exactOut.swaps, outputAmount: exactOut.outputAmount }); - expect(priceImpact).toStrictEqual(exactOut.priceImpact); - }); - - it('is correct with multiple routes', () => { - const result: string = BigNumber.fromString(exactOutMultiRoute1.priceImpact.quotient).toSignificant(3); - expect(result).toStrictEqual('0.255'); - const priceImpact: Fraction = tradePriceImpact({ swaps: exactOutMultiRoute1.swaps, outputAmount: exactOutMultiRoute1.outputAmount }); - expect(priceImpact).toStrictEqual(exactOutMultiRoute1.priceImpact); - }); - }); - }); - - describe('bestTradeExactIn', () => { - it('throws with empty pools', () => { - const error = (): void => { - bestTradeExactIn({ - pools: [], - amountIn: { - token: token0, - amount: BigInt.fromUInt16(10000), - }, - tokenOut: token2, - options: null, - }); - }; - expect(error).toThrow("POOLS: pools array is empty"); - }); - - it('throws with max hops of 0', () => { - const error = (): void => { - bestTradeExactIn({ - pools: [pool_0_2], - amountIn: { - token: token0, - amount: BigInt.fromUInt16(10000), - }, - tokenOut: token2, - options: { - maxHops: new Box(0), - maxNumResults: null, - }, - }); - }; - expect(error).toThrow("MAX_HOPS: maxHops must be greater than zero"); - }); - - it('provides best route', () => { - const result: Trade[] = bestTradeExactIn({ - pools: [pool_0_1, pool_0_2, pool_1_2], - amountIn: { - token: token0, - amount: BigInt.fromUInt16(10000), - }, - tokenOut: token2, - options: null, - }); - - expect(result).toHaveLength(2); - expect(result[0].swaps[0].route.pools).toHaveLength(1); // 0 -> 2 at 10:11 - expect(result[0].swaps[0].route.path).toStrictEqual([token0, token2]); - expect(result[0].inputAmount).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(10000) }); - expect(result[0].outputAmount).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(9971) }); - expect(result[1].swaps[0].route.pools).toHaveLength(2); // 0 -> 1 -> 2 at 12:12:10 - expect(result[1].swaps[0].route.path).toStrictEqual([token0, token1, token2]); - expect(result[1].inputAmount).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(10000) }); - expect(result[1].outputAmount).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(7004) }); - }); - - it('respects maxHops', () => { - const result: Trade[] = bestTradeExactIn({ - pools: [pool_0_1, pool_0_2, pool_1_2], - amountIn: { - token: token0, - amount: BigInt.fromUInt16(10), - }, - tokenOut: token2, - options: { - maxHops: new Box(1), - maxNumResults: null, - }, - }); - expect(result).toHaveLength(1); - expect(result[0].swaps[0].route.pools).toHaveLength(1); // 0 -> 2 at 10:11 - expect(result[0].swaps[0].route.path).toStrictEqual([token0, token2]); - }); - - it('insufficient input for one pool', () => { - const result: Trade[] = bestTradeExactIn({ - pools: [pool_0_1, pool_0_2, pool_1_2], - amountIn: { - token: token0, - amount: BigInt.fromUInt16(1), - }, - tokenOut: token2, - options: null, - }); - expect(result).toHaveLength(2); - expect(result[0].swaps[0].route.pools).toHaveLength(1); // 0 -> 2 at 10:11 - expect(result[0].swaps[0].route.path).toStrictEqual([token0, token2]); - expect(result[0].outputAmount).toStrictEqual({ token: token2, amount: BigInt.ZERO }); - }); - - it('respects n', () => { - const result: Trade[] = bestTradeExactIn({ - pools: [pool_0_1, pool_0_2, pool_1_2], - amountIn: { - token: token0, - amount: BigInt.fromUInt16(10), - }, - tokenOut: token2, - options: { - maxHops: null, - maxNumResults: new Box(1), - }, - }); - expect(result).toHaveLength(1); - }); - - it('no path', () => { - const result: Trade[] = bestTradeExactIn({ - pools: [pool_0_1, pool_0_3, pool_1_3], - amountIn: { - token: token0, - amount: BigInt.fromUInt16(10), - }, - tokenOut: token2, - options: null, - }); - expect(result).toHaveLength(0); - }); - - it('works for ETHER currency input', () => { - const result: Trade[] = bestTradeExactIn({ - pools: [pool_weth_0, pool_0_1, pool_0_3, pool_1_3], - amountIn: { - token: eth, - amount: BigInt.fromUInt16(100), - }, - tokenOut: token3, - options: null, - }); - expect(result).toHaveLength(2); - expect(result[0].inputAmount.token.currency).toStrictEqual(ETHER); - expect(result[0].swaps[0].route.path).toStrictEqual([getWrappedNative({ chainId: ChainId.MAINNET }), token0, token1, token3]); - expect(result[0].outputAmount.token).toStrictEqual(token3); - expect(result[1].inputAmount.token.currency).toStrictEqual(ETHER); - expect(result[1].swaps[0].route.path).toStrictEqual([getWrappedNative({ chainId: ChainId.MAINNET }), token0, token3]); - expect(result[1].outputAmount.token).toStrictEqual(token3); - }); - - it('works for ETHER currency output', () => { - const result: Trade[] = bestTradeExactIn({ - pools: [pool_weth_0, pool_0_1, pool_0_3, pool_1_3], - amountIn: { - token: token3, - amount: BigInt.fromUInt16(100), - }, - tokenOut: eth, - options: null, - }); - expect(result).toHaveLength(2); - expect(result[0].inputAmount.token).toStrictEqual(token3); - expect(result[0].swaps[0].route.path).toStrictEqual([token3, token0, getWrappedNative({ chainId: ChainId.MAINNET })]); - expect(result[0].outputAmount.token.currency).toStrictEqual(ETHER); - expect(result[1].inputAmount.token).toStrictEqual(token3); - expect(result[1].swaps[0].route.path).toStrictEqual([token3, token1, token0, getWrappedNative({ chainId: ChainId.MAINNET })]); - expect(result[1].outputAmount.token.currency).toStrictEqual(ETHER); - }); - }); - - describe('tradeMaximumAmountIn', () => { - describe('tradeType = EXACT_INPUT', () => { - - it('throws if less than 0', () => { - const error = (): void => { - tradeMaximumAmountIn({ - slippageTolerance: "-0.01", - amountIn: exactInFromRoute0.inputAmount, - tradeType: exactInFromRoute0.tradeType, - }); - }; - expect(error).toThrow("SLIPPAGE_TOLERANCE: slippage tolerance cannot be less than zero"); - }); - - it('returns exact if 0', () => { - const result: TokenAmount = tradeMaximumAmountIn({ - slippageTolerance: "0", - amountIn: exactInFromRoute0.inputAmount, - tradeType: exactInFromRoute0.tradeType, - }); - expect(result).toStrictEqual(exactInFromRoute0.inputAmount); - }); - - it('returns exact if nonzero', () => { - const amount0: TokenAmount = tradeMaximumAmountIn({ - slippageTolerance: "0", - amountIn: exactInFromRoute0.inputAmount, - tradeType: exactInFromRoute0.tradeType - }); - expect(amount0).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(100) }); - - const amount0005: TokenAmount = tradeMaximumAmountIn({ - slippageTolerance: "0.05", - amountIn: exactInFromRoute0.inputAmount, - tradeType: exactInFromRoute0.tradeType - }); - expect(amount0005).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(100) }); - - const amount02: TokenAmount = tradeMaximumAmountIn({ - slippageTolerance: "2", - amountIn: exactInFromRoute0.inputAmount, - tradeType: exactInFromRoute0.tradeType - }); - expect(amount02).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(100) }); - }); - }); - - describe('tradeType = EXACT_OUTPUT', () => { - - it('throws if less than 0', () => { - const error = (): void => { - tradeMaximumAmountIn({ - slippageTolerance: "-0.01", - amountIn: exactOutFromRoute0.inputAmount, - tradeType: exactOutFromRoute0.tradeType, - }); - } - expect(error).toThrow("SLIPPAGE_TOLERANCE: slippage tolerance cannot be less than zero"); - }); - - it('returns exact if 0', () => { - const result: TokenAmount = tradeMaximumAmountIn({ - slippageTolerance: "0", - amountIn: exactOutFromRoute0.inputAmount, - tradeType: exactOutFromRoute0.tradeType, - }); - expect(result).toStrictEqual(exactOutFromRoute0.inputAmount); - }); - - it('returns slippage amount if nonzero', () => { - const amount0: TokenAmount = tradeMaximumAmountIn({ - slippageTolerance: "0", - amountIn: exactOutFromRoute0.inputAmount, - tradeType: exactOutFromRoute0.tradeType - }); - expect(amount0).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(15488) }); - - const amount0005: TokenAmount = tradeMaximumAmountIn({ - slippageTolerance: "0.05", - amountIn: exactOutFromRoute0.inputAmount, - tradeType: exactOutFromRoute0.tradeType - }); - expect(amount0005).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(16262) }); - - const amount02: TokenAmount = tradeMaximumAmountIn({ - slippageTolerance: "2", - amountIn: exactOutFromRoute0.inputAmount, - tradeType: exactOutFromRoute0.tradeType - }); - expect(amount02).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(46464) }); - }); - }); - }); - - describe('tradeMinimumAmountOut', () => { - describe('tradeType = EXACT_INPUT', () => { - - it('throws if less than 0', () => { - const error = (): void => { - tradeMinimumAmountOut({ - slippageTolerance: "-0.01", - amountOut: exactInFromRoute1.outputAmount, - tradeType: exactInFromRoute1.tradeType, - }); - }; - expect(error).toThrow("SLIPPAGE_TOLERANCE: slippage tolerance cannot be less than zero"); - }); - - it('returns exact if 0', () => { - const result: TokenAmount = tradeMinimumAmountOut({ - slippageTolerance: "0", - amountOut: exactInFromRoute1.outputAmount, - tradeType: exactInFromRoute1.tradeType, - }); - expect(result).toStrictEqual(exactInFromRoute1.outputAmount); - }); - - it('returns exact if nonzero', () => { - const amount0: TokenAmount = tradeMinimumAmountOut({ - slippageTolerance: "0", - amountOut: exactInFromRoute1.outputAmount, - tradeType: exactInFromRoute1.tradeType, - }); - expect(amount0).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(7004) }); - - const amount0005: TokenAmount = tradeMinimumAmountOut({ - slippageTolerance: "0.05", - amountOut: exactInFromRoute1.outputAmount, - tradeType: exactInFromRoute1.tradeType, - }); - expect(amount0005).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(6670) }); - - const amount02: TokenAmount = tradeMinimumAmountOut({ - slippageTolerance: "2", - amountOut: exactInFromRoute1.outputAmount, - tradeType: exactInFromRoute1.tradeType, - }); - expect(amount02).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(2334) }); - }); - }); - - describe('tradeType = EXACT_OUTPUT', () => { - - it('throws if less than 0', () => { - const error = (): void => { - tradeMinimumAmountOut({ - slippageTolerance: "-0.01", - amountOut: exactOutFromRoute1.outputAmount, - tradeType: exactOutFromRoute1.tradeType, - }); - }; - expect(error).toThrow("SLIPPAGE_TOLERANCE: slippage tolerance cannot be less than zero"); - }); - - it('returns exact if 0', () => { - const result: TokenAmount = tradeMinimumAmountOut({ - slippageTolerance: "0", - amountOut: exactOutFromRoute1.outputAmount, - tradeType: exactOutFromRoute1.tradeType, - }); - expect(result).toStrictEqual(exactOutFromRoute1.outputAmount); - }); - - it('returns slippage amount if nonzero', () => { - const amount0: TokenAmount = tradeMinimumAmountOut({ - slippageTolerance: "0", - amountOut: exactOutFromRoute1.outputAmount, - tradeType: exactOutFromRoute1.tradeType, - }); - expect(amount0).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(100) }); - - const amount0005: TokenAmount = tradeMinimumAmountOut({ - slippageTolerance: "0.05", - amountOut: exactOutFromRoute1.outputAmount, - tradeType: exactOutFromRoute1.tradeType, - }); - expect(amount0005).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(100) }); - - const amount02: TokenAmount = tradeMinimumAmountOut({ - slippageTolerance: "2", - amountOut: exactOutFromRoute1.outputAmount, - tradeType: exactOutFromRoute1.tradeType, - }); - expect(amount02).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(100) }); - }); - }); - }); - - describe('bestTradeExactOut', () => { - - it('throws with empty pools', () => { - const error = (): void => { - bestTradeExactOut({ - pools: [], - tokenIn: token0, - amountOut: { - token: token2, - amount: BigInt.fromUInt16(100), - }, - options: null, - }); - }; - expect(error).toThrow("POOLS: pools array is empty"); - }); - - it('throws with max hops of 0', () => { - const error = (): void => { - bestTradeExactOut({ - pools: [pool_0_2], - tokenIn: token0, - amountOut: { - token: token2, - amount: BigInt.fromUInt16(100), - }, - options: { - maxHops: new Box(0), - maxNumResults: null, - }, - }); - }; - expect(error).toThrow("MAX_HOPS: maxHops must be greater than zero"); - }); - - it('provides best route', () => { - const result: Trade[] = bestTradeExactOut({ - pools: [pool_0_1, pool_0_2, pool_1_2], - tokenIn: token0, - amountOut: { - token: token2, - amount: BigInt.fromUInt16(10000), - }, - options: null, - }); - expect(result).toHaveLength(2); - expect(result[0].swaps[0].route.pools).toHaveLength(1); // 0 -> 2 at 10:11 - expect(result[0].swaps[0].route.path).toStrictEqual([token0, token2]); - expect(result[0].inputAmount).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(10032) }); - expect(result[0].outputAmount).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(10000) }); - expect(result[1].swaps[0].route.pools).toHaveLength(2); // 0 -> 1 -> 2 at 12:12:10 - expect(result[1].swaps[0].route.path).toStrictEqual([token0, token1, token2]); - expect(result[1].inputAmount).toStrictEqual({ token: token0, amount: BigInt.fromUInt16(15488) }); - expect(result[1].outputAmount).toStrictEqual({ token: token2, amount: BigInt.fromUInt16(10000) }); - }); - - it('respects maxHops', () => { - const result: Trade[] = bestTradeExactOut({ - pools: [pool_0_1, pool_0_2, pool_1_2], - tokenIn: token0, - amountOut: { - token: token2, - amount: BigInt.fromUInt16(10), - }, - options: { - maxHops: new Box(1), - maxNumResults: null, - }, - }); - expect(result).toHaveLength(1); - expect(result[0].swaps[0].route.pools).toHaveLength(1); // 0 -> 2 at 10:11 - expect(result[0].swaps[0].route.path).toStrictEqual([token0, token2]); - }); - - // this test is skipped in the v3 js sdk repo - it('insufficient liquidity', () => { - const result: Trade[] = bestTradeExactOut({ - pools: [pool_0_1, pool_0_2, pool_1_2], - tokenIn: token0, - amountOut: { - token: token2, - amount: BigInt.fromUInt32(120000), - }, - options: null - }); - expect(result).toHaveLength(0); - }); - - // this test is skipped in the v3 js sdk repo - it('insufficient liquidity in one pool but not the other', () => { - const result: Trade[] = bestTradeExactOut({ - pools: [pool_0_1, pool_0_2, pool_1_2], - tokenIn: token0, - amountOut: { - token: token2, - amount: BigInt.fromUInt32(105000), - }, - options: null - }); - expect(result).toHaveLength(1); - }); - - it('respects n', () => { - const result: Trade[] = bestTradeExactOut({ - pools: [pool_0_1, pool_0_2, pool_1_2], - tokenIn: token0, - amountOut: { - token: token2, - amount: BigInt.fromUInt16(10), - }, - options: { - maxHops: null, - maxNumResults: new Box(1), - } - }); - expect(result).toHaveLength(1); - }); - - it('no path', () => { - const result: Trade[] = bestTradeExactOut({ - pools: [pool_0_1, pool_0_3, pool_1_3], - tokenIn: token0, - amountOut: { - token: token2, - amount: BigInt.fromUInt16(10), - }, - options: null - }); - expect(result).toHaveLength(0); - }) - - it('works for ETHER currency input', () => { - const result: Trade[] = bestTradeExactOut({ - pools: [pool_weth_0, pool_0_1, pool_0_3, pool_1_3], - tokenIn: eth, - amountOut: { - token: token3, - amount: BigInt.fromUInt16(10000), - }, - options: null - }); - expect(result).toHaveLength(2); - expect(result[0].inputAmount.token.currency).toStrictEqual(ETHER); - expect(result[0].swaps[0].route.path).toStrictEqual([getWrappedNative({ chainId: ChainId.MAINNET }), token0, token1, token3]); - expect(result[0].outputAmount.token).toStrictEqual(token3); - expect(result[1].inputAmount.token.currency).toStrictEqual(ETHER); - expect(result[1].swaps[0].route.path).toStrictEqual([getWrappedNative({ chainId: ChainId.MAINNET }), token0, token3]); - expect(result[1].outputAmount.token).toStrictEqual(token3); - }); - - it('works for ETHER currency output', () => { - const result: Trade[] = bestTradeExactOut({ - pools: [pool_weth_0, pool_0_1, pool_0_3, pool_1_3], - tokenIn: token3, - amountOut: { - token: eth, - amount: BigInt.fromUInt16(100), - }, - options: null - }); - expect(result).toHaveLength(2); - expect(result[0].inputAmount.token).toStrictEqual(token3); - expect(result[0].swaps[0].route.path).toStrictEqual([token3, token0, getWrappedNative({ chainId: ChainId.MAINNET })]); - expect(result[0].outputAmount.token.currency).toStrictEqual(ETHER); - expect(result[1].inputAmount.token).toStrictEqual(token3); - expect(result[1].swaps[0].route.path).toStrictEqual([token3, token1, token0, getWrappedNative({ chainId: ChainId.MAINNET })]); - expect(result[1].outputAmount.token.currency).toStrictEqual(ETHER); - }); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/Fraction.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/Fraction.spec.ts deleted file mode 100644 index e820de032..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/Fraction.spec.ts +++ /dev/null @@ -1,329 +0,0 @@ -import { BigInt } from "as-bigint"; - -import { Fraction } from "../../../utils"; - -describe('Fraction', () => { - describe('qoutient', () => { - test("floor division", () => { - expect( - new Fraction(BigInt.fromUInt16(8), BigInt.fromUInt16(3)).quotient() - ).toBe(BigInt.fromUInt16(2)) - - expect( - new Fraction(BigInt.fromUInt16(12), BigInt.fromUInt16(4)).quotient() - ).toBe(BigInt.fromUInt16(3)) - - expect( - new Fraction(BigInt.fromUInt16(16), BigInt.fromUInt16(5)).quotient() - ).toBe(BigInt.fromUInt16(3)) - }); - }); - - describe('invert', () => { - test("flips num and denom", () => { - const result = new Fraction(BigInt.fromUInt16(8), BigInt.fromUInt16(3)).invert() - - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(8)) - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(3)) - }); - }); - - describe('add', () => { - test("multiples denoms and adds nums", () => { - const result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).add( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(52)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(120)); - }); - - test("same denom", () => { - const result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(5) - ).add( - new Fraction( - BigInt.fromUInt16(2), - BigInt.fromUInt16(5) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(3)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(5)); - }); - }); - - describe('subtract', () => { - test("multiples denoms and adds nums", () => { - const result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).sub( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromString("-28")); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(120)); - }); - - test("same denom", () => { - const result = new Fraction( - BigInt.fromUInt16(3), - BigInt.fromUInt16(5) - ).sub( - new Fraction( - BigInt.fromUInt16(2), - BigInt.fromUInt16(5) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(1)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(5)); - }); - }); - - describe('lt', () => { - test("correct", () => { - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).lt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(true); - - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).lt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - - expect( - new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).lt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - }); - }); - - describe('eq', () => { - test("correct", () => { - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).eq( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).eq( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(true); - - expect( - new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).eq( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - }); - }); - - describe('gt', () => { - test("correct", () => { - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).gt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - - expect( - new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).gt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(false); - - expect( - new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).gt( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ) - ).toBe(true); - }); - }); - - describe('mul', () => { - test("correct", () => { - let result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).mul( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(4)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(120)); - - result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).mul( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(4)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(36)); - - result = new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).mul( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(20)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(144)); - }); - }); - - describe('div', () => { - test("correct", () => { - let result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(10) - ).div( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(12)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(40)); - - result = new Fraction( - BigInt.fromUInt16(1), - BigInt.fromUInt16(3) - ).div( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(12)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(12)); - - result = new Fraction( - BigInt.fromUInt16(5), - BigInt.fromUInt16(12) - ).div( - new Fraction( - BigInt.fromUInt16(4), - BigInt.fromUInt16(12) - ) - ); - - expect(result.numerator).toStrictEqual(BigInt.fromUInt16(60)); - expect(result.denominator).toStrictEqual(BigInt.fromUInt16(48)); - }); - }); - - describe('fromString', () => { - test("correct", () => { - let fraction = Fraction.fromString("0.05"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(5)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(100)); - - fraction = Fraction.fromString("0.5"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(5)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(10)); - - fraction = Fraction.fromString("0.0001"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(1)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(10000)); - - fraction = Fraction.fromString("0"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(0)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(1)); - - fraction = Fraction.fromString("2"); - - expect(fraction.numerator).toStrictEqual(BigInt.fromUInt16(2)); - expect(fraction.denominator).toStrictEqual(BigInt.fromUInt16(1)); - }); - }); -}) diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/Price.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/Price.spec.ts deleted file mode 100644 index 3bdbe31a8..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/Price.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { ChainId, Token } from "../../../wrap"; -import { Price } from "../../../utils"; -import { BigInt } from "@polywrap/wasm-as"; -import { getWrappedNative } from "../../../token"; - -const USDC: Token = { - chainId: ChainId.MAINNET, - address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - currency: { - decimals: 6, - symbol: "USDC", - name: "USD Coin", - }, -}; -const DAI: Token = { - chainId: ChainId.MAINNET, - address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", - currency: { - decimals: 18, - symbol: "DAI", - name: "DAI Stablecoin", - }, -}; - -describe('Price', () => { - - it('inverts', () => { - const price: Price = new Price(USDC, DAI, BigInt.fromUInt16(100), BigInt.fromUInt16(50)); - const invertedPrice: Price = price.invert(); - expect(invertedPrice.baseToken).toStrictEqual(price.quoteToken); - expect(invertedPrice.quoteToken).toStrictEqual(price.baseToken); - expect(invertedPrice.numerator).toStrictEqual(price.denominator); - expect(invertedPrice.denominator).toStrictEqual(price.numerator); - }); - - it('throws when trying to quote token not involved in price', () => { - const throws = (): void => { - const price: Price = new Price(USDC, DAI, BigInt.fromUInt16(100), BigInt.fromUInt16(50)); - price.quote({ - token: getWrappedNative({ chainId: ChainId.MAINNET }), - amount: BigInt.fromUInt16(100), - }); - } - expect(throws).toThrow("Token of tokenAmount must be the same as baseToken"); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/PriorityQueue.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/PriorityQueue.spec.ts deleted file mode 100644 index ad396aaee..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/PriorityQueue.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { PriorityQueue } from "../../../utils"; -import { BigInt } from "@polywrap/wasm-as"; - -const comparator = (a: BigInt, b: BigInt): i32 => a.sub(b).toInt32(); -const values: BigInt[] = [ - BigInt.fromUInt16(0), - BigInt.fromUInt16(2), - BigInt.fromUInt16(4), - BigInt.fromUInt16(1), - BigInt.fromUInt16(3), -]; -let pq: PriorityQueue; - -describe('Priority Queue', () => { - - beforeEach(() => { - pq = new PriorityQueue(comparator); - for (let i = 0; i < values.length; i++) { - const val: BigInt = BigInt.fromString(values[i].toString()); - pq.insert(val); - } - }); - - it('removes and returns highest priority item', () => { - expect(pq.length).toStrictEqual(5); - const item: BigInt | null = pq.delMax(); - expect(pq.length).toStrictEqual(4); - expect(item).not.toBeNull(); - expect(item!.toInt32()).toStrictEqual(4); - }); - - it('length', () => { - expect(pq.length).toStrictEqual(5); - pq.delMax(); - expect(pq.length).toStrictEqual(4); - }); - - it('isEmpty', () => { - pq.delMax(); - pq.delMax(); - pq.delMax(); - pq.delMax(); - expect(pq.isEmpty()).toStrictEqual(false); - pq.delMax(); - expect(pq.isEmpty()).toStrictEqual(true); - }); - - it('toArray', () => { - const arr: BigInt[] = pq.toArray(); - const expected: BigInt[] = [ - BigInt.fromUInt16(4), - BigInt.fromUInt16(3), - BigInt.fromUInt16(2), - BigInt.fromUInt16(1), - BigInt.fromUInt16(0), - ]; - expect(arr).toStrictEqual(expected); - }); - -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/enumUtils.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/enumUtils.spec.ts deleted file mode 100644 index 6bf3398cb..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/enumUtils.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { getFeeAmountEnum } from "../../../utils"; -import { FeeAmount, PermitV } from "../../../wrap"; -import { feeAmountToTickSpacing, getFeeAmount, getPermitV } from "../../.."; - -describe('Enum utils', () => { - - it('getFeeAmount', () => { - expect(getFeeAmount({ feeAmount: FeeAmount.LOWEST })).toStrictEqual(100); - expect(getFeeAmount({ feeAmount: FeeAmount.LOW })).toStrictEqual(500); - expect(getFeeAmount({ feeAmount: FeeAmount.MEDIUM })).toStrictEqual(3000); - expect(getFeeAmount({ feeAmount: FeeAmount.HIGH })).toStrictEqual(10000); - - const error = (): void => { getFeeAmount({ feeAmount: 7 }) }; - expect(error).toThrow(); - }); - - it('getFeeAmountEnum', () => { - expect(getFeeAmountEnum(100)).toStrictEqual(FeeAmount.LOWEST); - expect(getFeeAmountEnum(500)).toStrictEqual(FeeAmount.LOW); - expect(getFeeAmountEnum(3000)).toStrictEqual(FeeAmount.MEDIUM); - expect(getFeeAmountEnum(10000)).toStrictEqual(FeeAmount.HIGH); - const error = (): void => { getFeeAmountEnum(7) }; - expect(error).toThrow(); - }); - - it('getTickSpacings', () => { - expect(feeAmountToTickSpacing({ feeAmount: FeeAmount.LOWEST})).toStrictEqual(1); - expect(feeAmountToTickSpacing({ feeAmount: FeeAmount.LOW})).toStrictEqual(10); - expect(feeAmountToTickSpacing({ feeAmount: FeeAmount.MEDIUM})).toStrictEqual(60); - expect(feeAmountToTickSpacing({ feeAmount: FeeAmount.HIGH})).toStrictEqual(200); - - const error = (): void => { feeAmountToTickSpacing({ feeAmount: 7 }) }; - expect(error).toThrow(); - }); - - it('getPermitV', () => { - expect(getPermitV({ permitV: PermitV.v_0 })).toStrictEqual(0); - expect(getPermitV({ permitV: PermitV.v_1 })).toStrictEqual(1); - expect(getPermitV({ permitV: PermitV.v_27 })).toStrictEqual(27); - expect(getPermitV({ permitV: PermitV.v_28 })).toStrictEqual(28); - - const error = (): void => { getPermitV({ permitV: 7 }) }; - expect(error).toThrow(); - }); -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/tokenUtils.spec.ts b/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/tokenUtils.spec.ts deleted file mode 100644 index 843dc68a3..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/__tests__/unit/utils/tokenUtils.spec.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { ChainId, Currency, Token, TokenAmount } from "../../../wrap"; -import { getNative, getWrappedNative, isNative, wrapAmount, wrapToken } from "../../.."; -import { BigInt } from "@polywrap/wasm-as"; - -const Eth: Currency = { - decimals: 18, - name: "Ether", - symbol: "ETH", -}; -const WETH: Currency = { - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", -}; -export const MATIC: Currency = { - decimals: 18, - name: "Polygon Matic", - symbol: "MATIC", -}; -export const WMATIC: Currency = { - decimals: 18, - name: "Wrapped MATIC", - symbol: "WMATIC", -}; - -const USDC: Token = { - chainId: ChainId.MAINNET, - address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - currency: { - decimals: 6, - symbol: "USDC", - name: "USD Coin", - }, -}; - -describe('Token utils', () => { - - it('getNative', () => { - for (let i = ChainId.MAINNET; i < ChainId._MAX_; i++) { - let currency: Currency; - if (i == ChainId.POLYGON || i == ChainId.POLYGON_MUMBAI) { - currency = MATIC; - } else { - currency = Eth; - } - const result: Token = { - chainId: i as ChainId, - address: "", - currency: currency, - }; - - expect(getNative({ chainId: i as ChainId })).toStrictEqual(result); - } - - const error = (): void => { getNative({ chainId: 999 }) }; - expect(error).toThrow("Unknown chain ID"); - }); - - it('getWrappedNative', () => { - expect(getWrappedNative({ chainId: ChainId.MAINNET })).toStrictEqual({ - chainId: ChainId.MAINNET, - address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - currency: WETH, - }); - expect(getWrappedNative({ chainId: ChainId.ROPSTEN })).toStrictEqual({ - chainId: ChainId.ROPSTEN, - address: "0xc778417E063141139Fce010982780140Aa0cD5Ab", - currency: WETH, - }); - expect(getWrappedNative({ chainId: ChainId.RINKEBY })).toStrictEqual({ - chainId: ChainId.RINKEBY, - address: "0xc778417E063141139Fce010982780140Aa0cD5Ab", - currency: WETH, - }); - expect(getWrappedNative({ chainId: ChainId.GOERLI })).toStrictEqual({ - chainId: ChainId.GOERLI, - address: "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", - currency: WETH, - }); - expect(getWrappedNative({ chainId: ChainId.KOVAN })).toStrictEqual({ - chainId: ChainId.KOVAN, - address: "0xd0A1E359811322d97991E03f863a0C30C2cF029C", - currency: WETH, - }); - expect(getWrappedNative({ chainId: ChainId.OPTIMISM })).toStrictEqual({ - chainId: ChainId.OPTIMISM, - address: "0x4200000000000000000000000000000000000006", - currency: WETH, - }); - expect(getWrappedNative({ chainId: ChainId.OPTIMISTIC_KOVAN })).toStrictEqual({ - chainId: ChainId.OPTIMISTIC_KOVAN, - address: "0x4200000000000000000000000000000000000006", - currency: WETH, - }); - expect(getWrappedNative({ chainId: ChainId.ARBITRUM_ONE })).toStrictEqual({ - chainId: ChainId.ARBITRUM_ONE, - address: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", - currency: WETH, - }); - expect(getWrappedNative({ chainId: ChainId.ARBITRUM_RINKEBY })).toStrictEqual({ - chainId: ChainId.ARBITRUM_RINKEBY, - address: "0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681", - currency: WETH, - }); - - expect(getWrappedNative({ chainId: ChainId.POLYGON })).toStrictEqual({ - chainId: ChainId.POLYGON, - address: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", - currency: WMATIC, - }); - expect(getWrappedNative({ chainId: ChainId.POLYGON_MUMBAI })).toStrictEqual({ - chainId: ChainId.POLYGON_MUMBAI, - address: "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", - currency: WMATIC, - }); - - const error = (): void => { getWrappedNative({ chainId: 999 }) }; - expect(error).toThrow("Unknown chain ID"); - }); - - it('isNative', () => { - const ethToken: Token = getNative({ chainId: ChainId.MAINNET }); - expect(isNative({ token: ethToken })).toStrictEqual(true); - expect(isNative({ token: USDC })).toStrictEqual(false); - }); - - it('wrapToken', () => { - const ethToken: Token = getNative({ chainId: ChainId.MAINNET }); - expect(wrapToken({ token: ethToken })).toStrictEqual(getWrappedNative({ chainId: ethToken.chainId })); - expect(wrapToken({ token: USDC })).toStrictEqual(USDC); - }); - - it('wrapAmount', () => { - const ethAmount: TokenAmount = { - token: getNative({ chainId: ChainId.MAINNET }), - amount: BigInt.fromUInt16(100), - }; - const wethAmount: TokenAmount = { - token: getWrappedNative({ chainId: ethAmount.token.chainId }), - amount: BigInt.fromUInt16(100), - }; - expect(wrapAmount({ amount: ethAmount })).toStrictEqual(wethAmount); - - const USDCAmount: TokenAmount = { - token: USDC, - amount: BigInt.fromUInt16(100), - }; - expect(wrapAmount({ amount: USDCAmount })).toStrictEqual(USDCAmount); - }); - -}); \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/src/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/index.ts deleted file mode 100644 index 25d158bbd..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from "./pool"; -export * from "./position"; -export * from "./router"; -export * from "./swap"; -export * from "./tickList"; -export * from "./token"; -export * from "./utils"; -export * from "./route"; -export * from "./trade"; diff --git a/protocol/ethereum/uniswapv3/wrapper/src/pool/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/pool/index.ts deleted file mode 100644 index 90230d47a..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/pool/index.ts +++ /dev/null @@ -1,300 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ - -import { - ChainId, - FeeAmount, - Args_createPool, - Args_getPoolAddress, - Args_getPoolInputAmount, - Args_getPoolOutputAmount, - Args_getPoolTickSpacing, - Args_poolChainId, - Args_poolInvolvesToken, - Args_poolPriceOf, - Args_poolToken0Price, - Args_poolToken1Price, - Pool, - PoolChangeResult, - Price as PriceType, - Tick, - Token, - TokenAmount, -} from "../wrap"; -import { computePoolAddress, SimulatedSwapResult, simulateSwap } from "./utils"; -import { getSqrtRatioAtTick } from "../tickList"; -import { tokenEquals, tokenSortsBefore } from "../token"; -import { - _feeAmountToTickSpacing, - _FACTORY_ADDRESS, - Q192, - Price, -} from "../utils"; - -import { BigInt } from "@polywrap/wasm-as"; - -export * from "./utils"; - -/** - * constructs and validates a Pool - */ -export function createPool(args: Args_createPool): Pool { - const tokenA: Token = args.tokenA; - const tokenB: Token = args.tokenB; - const fee: FeeAmount = args.fee; - const sqrtRatioX96: BigInt = args.sqrtRatioX96; - const liquidity: BigInt = args.liquidity; - const tickCurrent: i32 = args.tickCurrent; - const ticks: Tick[] | null = args.ticks; - - if (tokenA.chainId != tokenB.chainId) { - throw new Error("CHAIN_IDS: tokens in a pool must have the same chain id"); - } - if (tokenEquals({ tokenA, tokenB })) { - throw new Error("ADDRESSES: tokens in a pool cannot have the same address"); - } - - const tickCurrentSqrtRatioX96: BigInt = getSqrtRatioAtTick({ - tick: tickCurrent, - }); - const nextTickSqrtRatioX96: BigInt = getSqrtRatioAtTick({ - tick: tickCurrent + 1, - }); - if ( - sqrtRatioX96 < tickCurrentSqrtRatioX96 || - sqrtRatioX96 > nextTickSqrtRatioX96 - ) { - throw new Error("PRICE_BOUNDS: sqrtRatioX96 is invalid for current tick"); - } - - const tokens: Token[] = tokenSortsBefore({ tokenA: tokenA, tokenB: tokenB }) - ? [tokenA, tokenB] - : [tokenB, tokenA]; - - return { - token0: tokens[0], - token1: tokens[1], - fee: fee, - sqrtRatioX96: sqrtRatioX96, - liquidity: liquidity, - tickCurrent: tickCurrent, - tickDataProvider: ticks === null ? [] : ticks, - token0Price: poolToken0Price({ - token0: tokens[0], - token1: tokens[1], - sqrtRatioX96, - }), - token1Price: poolToken1Price({ - token0: tokens[0], - token1: tokens[1], - sqrtRatioX96, - }), - }; -} - -/** - * Returns the Ethereum address of the Pool contract - */ -export function getPoolAddress(args: Args_getPoolAddress): string { - return computePoolAddress({ - factoryAddress: _FACTORY_ADDRESS, - fee: args.fee, - tokenA: args.tokenA, - tokenB: args.tokenB, - initCodeHashManualOverride: args.initCodeHashManualOverride, - }); -} - -/** - * Returns true if the token is either token0 or token1 - */ -export function poolInvolvesToken(args: Args_poolInvolvesToken): boolean { - const token: Token = args.token; - const pool: Pool = args.pool; - return ( - tokenEquals({ tokenA: token, tokenB: pool.token0 }) || - tokenEquals({ tokenA: token, tokenB: pool.token1 }) - ); -} - -/** - * Returns the current mid price of the pool in terms of token0, i.e. the ratio of token1 over token0 - */ -export function poolToken0Price(args: Args_poolToken0Price): PriceType { - const token0: Token = args.token0; - const token1: Token = args.token1; - const sqrtRatioX96: BigInt = args.sqrtRatioX96; - return new Price( - token0, - token1, - Q192, - BigInt.mul(sqrtRatioX96, sqrtRatioX96) - ).toPriceType(); -} - -/** - * Returns the current mid price of the pool in terms of token1, i.e. the ratio of token0 over token1 - */ -export function poolToken1Price(args: Args_poolToken1Price): PriceType { - const token0: Token = args.token0; - const token1: Token = args.token1; - const sqrtRatioX96: BigInt = args.sqrtRatioX96; - return new Price( - token1, - token0, - BigInt.mul(sqrtRatioX96, sqrtRatioX96), - Q192 - ).toPriceType(); -} - -/** - * Returns the price of the given token in terms of the other token in the pool - * @param args.token The token to return price of - */ -export function poolPriceOf(args: Args_poolPriceOf): PriceType { - const token: Token = args.token; - const pool: Pool = args.pool; - if (!poolInvolvesToken({ token: token, pool: pool })) { - throw new Error( - "TOKEN: Cannot return the price of a token that is not in the pool" - ); - } - return tokenEquals({ tokenA: token, tokenB: pool.token0 }) - ? pool.token0Price - : pool.token1Price; -} - -/** - * Returns the chain ID of the tokens in the pool - */ -export function poolChainId(args: Args_poolChainId): ChainId { - return args.pool.token0.chainId; -} - -/** - * Given an args amount of a token, return the computed output amount, and a pool with state updated after the trade - * @param args.inputAmount The input amount for which to quote the output amount - * @param args.sqrtPriceLimitX96 The Q64.96 sqrt price limit - */ -export function getPoolOutputAmount( - args: Args_getPoolOutputAmount -): PoolChangeResult { - const inputAmount: TokenAmount = args.inputAmount; - const sqrtPriceLimitX96: BigInt | null = args.sqrtPriceLimitX96; - const pool: Pool = args.pool; - if (!poolInvolvesToken({ token: inputAmount.token, pool: pool })) { - throw new Error( - "TOKEN: Cannot return the output amount for an input token that is not in the pool" - ); - } - - const zeroForOne: boolean = tokenEquals({ - tokenA: inputAmount.token, - tokenB: pool.token0, - }); - - const simulatedSwapResult: SimulatedSwapResult = simulateSwap( - pool, - zeroForOne, - inputAmount.amount, - sqrtPriceLimitX96 - ); - const outputAmount: BigInt = simulatedSwapResult.amountCalculated; - const sqrtRatioX96: BigInt = simulatedSwapResult.sqrtRatioX96; - const liquidity: BigInt = simulatedSwapResult.liquidity; - const tickCurrent: i32 = simulatedSwapResult.tickCurrent; - - const outputToken: Token = zeroForOne ? pool.token1 : pool.token0; - return { - amount: { - token: outputToken, - amount: outputAmount.opposite(), - }, - nextPool: { - token0: pool.token0, - token1: pool.token1, - fee: pool.fee, - sqrtRatioX96: sqrtRatioX96, - liquidity: liquidity, - tickCurrent: tickCurrent, - tickDataProvider: pool.tickDataProvider, - token0Price: poolToken0Price({ - token0: pool.token0, - token1: pool.token1, - sqrtRatioX96, - }), - token1Price: poolToken1Price({ - token0: pool.token0, - token1: pool.token1, - sqrtRatioX96, - }), - }, - }; -} - -/** - * Given a desired output amount of a token, return the computed input amount and a pool with state updated after the trade - * @param args.outputAmount The output amount for which to quote the input amount - * @param args.sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this value after the swap. If one for zero, the price cannot be greater than this value after the swap. - */ -export function getPoolInputAmount( - args: Args_getPoolInputAmount -): PoolChangeResult { - const outputAmount: TokenAmount = args.outputAmount; - const sqrtPriceLimitX96: BigInt | null = args.sqrtPriceLimitX96; - const pool: Pool = args.pool; - if (!poolInvolvesToken({ token: outputAmount.token, pool: pool })) { - throw new Error( - "TOKEN: Cannot return the output amount for an input token that is not in the pool" - ); - } - - const zeroForOne: boolean = tokenEquals({ - tokenA: outputAmount.token, - tokenB: pool.token1, - }); - - const simulatedSwapResult: SimulatedSwapResult = simulateSwap( - pool, - zeroForOne, - outputAmount.amount.opposite(), - sqrtPriceLimitX96 - ); - const inputAmount: BigInt = simulatedSwapResult.amountCalculated; - const sqrtRatioX96: BigInt = simulatedSwapResult.sqrtRatioX96; - const liquidity: BigInt = simulatedSwapResult.liquidity; - const tickCurrent: i32 = simulatedSwapResult.tickCurrent; - - const inputToken = zeroForOne ? pool.token0 : pool.token1; - return { - amount: { - token: inputToken, - amount: inputAmount, - }, - nextPool: { - token0: pool.token0, - token1: pool.token1, - fee: pool.fee, - sqrtRatioX96: sqrtRatioX96, - liquidity: liquidity, - tickCurrent: tickCurrent, - tickDataProvider: pool.tickDataProvider, - token0Price: poolToken0Price({ - token0: pool.token0, - token1: pool.token1, - sqrtRatioX96, - }), - token1Price: poolToken1Price({ - token0: pool.token0, - token1: pool.token1, - sqrtRatioX96, - }), - }, - }; -} - -/** - * Returns the tick spacing of ticks in the pool - */ -export function getPoolTickSpacing(args: Args_getPoolTickSpacing): i32 { - return _feeAmountToTickSpacing(args.pool.fee); -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/pool/utils.ts b/protocol/ethereum/uniswapv3/wrapper/src/pool/utils.ts deleted file mode 100644 index 467917587..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/pool/utils.ts +++ /dev/null @@ -1,416 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ - -import { - Ethereum_Module, - FeeAmount, - Args_computePoolAddress, - NextTickResult, - Pool, - SHA3_Module, - Token, -} from "../wrap"; -import { tokenSortsBefore } from "../token"; -import { - getAmount0Delta, - getAmount1Delta, - _getFeeAmount, - MAX_FEE, - _MAX_SQRT_RATIO, - _MAX_TICK, - _MIN_SQRT_RATIO, - _MIN_TICK, - _POOL_INIT_CODE_HASH, - concat, - getChecksumAddress, - getNextSqrtPriceFromInput, - getNextSqrtPriceFromOutput, - mulDivRoundingUp, -} from "../utils"; -import { - getTick, - nextInitializedTickWithinOneWord, - getSqrtRatioAtTick, - getTickAtSqrtRatio, -} from "../tickList"; -import { getPoolTickSpacing } from "."; - -import { BigInt } from "@polywrap/wasm-as"; - -// Pool state after swap execution; Return value of simulateSwap(...) -export class SimulatedSwapResult { - amountCalculated: BigInt; - sqrtRatioX96: BigInt; - liquidity: BigInt; - tickCurrent: i32; -} - -class SimulatedSwapState { - amountSpecifiedRemaining: BigInt; - amountCalculated: BigInt; - sqrtPriceX96: BigInt; - tick: i32; - liquidity: BigInt; -} - -class StepComputations { - sqrtPriceStartX96: BigInt; - tickNext: i32; - initialized: boolean; - sqrtPriceNextX96: BigInt; - amountIn: BigInt; - amountOut: BigInt; - feeAmount: BigInt; -} - -class SwapStepResult { - sqrtRatioNextX96: BigInt; - amountIn: BigInt; - amountOut: BigInt; - feeAmount: BigInt; -} - -/** - * Computes a pool address - * @param args.factoryAddress The Uniswap V3 factory address - * @param args.tokenA The first token of the pool, irrespective of sort order - * @param args.tokenB The second token of the pool, irrespective of sort order - * @param args.fee The fee tier of the pool - * @param args.initCodeHashManualOverride Override the init code hash used to compute the pool address if necessary - * @returns The pool address - */ -export function computePoolAddress(args: Args_computePoolAddress): string { - const factoryAddress: string = args.factoryAddress; - const tokens: Token[] = tokenSortsBefore({ - tokenA: args.tokenA, - tokenB: args.tokenB, - }) - ? [args.tokenA, args.tokenB] - : [args.tokenB, args.tokenA]; - const fee: u32 = _getFeeAmount(args.fee); - const initCodeHash: string = - args.initCodeHashManualOverride == null - ? _POOL_INIT_CODE_HASH - : args.initCodeHashManualOverride!; - - const salt: string = SHA3_Module.hex_keccak_256({ - message: Ethereum_Module.encodeParams({ - types: ["address", "address", "uint24"], - values: [tokens[0].address, tokens[1].address, fee.toString()], - }).unwrap(), - }).unwrap(); - const concatenatedItems: Uint8Array = concat([ - "0xff", - getChecksumAddress(factoryAddress), - salt, - initCodeHash, - ]); - const concatenationHash: string = SHA3_Module.buffer_keccak_256({ - message: concatenatedItems.buffer, - }).unwrap(); - return getChecksumAddress(concatenationHash.substring(24)); -} - -/** - * Simulations execution of a swap and returns next pool state - * @param pool The pool on which to execute the swap - * @param zeroForOne Whether the amount in is token0 or token1 - * @param amountSpecified The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative) - * @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this value after the swap. If one for zero, the price cannot be greater than this value after the swap. - */ -export function simulateSwap( - pool: Pool, - zeroForOne: boolean, - amountSpecified: BigInt, - sqrtPriceLimitX96: BigInt | null -): SimulatedSwapResult { - let _sqrtPriceLimitX96: BigInt; - if (sqrtPriceLimitX96 !== null) { - _sqrtPriceLimitX96 = sqrtPriceLimitX96; - } else { - _sqrtPriceLimitX96 = zeroForOne - ? BigInt.add(_MIN_SQRT_RATIO, BigInt.ONE) - : BigInt.sub(_MAX_SQRT_RATIO, BigInt.ONE); - } - - if (zeroForOne) { - if (_sqrtPriceLimitX96 <= _MIN_SQRT_RATIO) { - throw new Error( - `RATIO_MIN: input sqrtPriceLimitX96 ${_sqrtPriceLimitX96.toString()} is less than or equal to the minimum sqrt ratio ${_MIN_SQRT_RATIO.toString()}` - ); - } - if (_sqrtPriceLimitX96 >= pool.sqrtRatioX96) { - throw new Error( - `RATIO_CURRENT: input sqrtPriceLimitX96 ${_sqrtPriceLimitX96.toString()} is greater than or equal to the pool's current sqrt ratio ${pool.sqrtRatioX96.toString()}` - ); - } - } else { - if (_sqrtPriceLimitX96 >= _MAX_SQRT_RATIO) { - throw new Error( - `RATIO_MAX: input sqrtPriceLimitX96 ${_sqrtPriceLimitX96.toString()} is greater than or equal to the maximum sqrt ratio ${_MAX_SQRT_RATIO.toString()}` - ); - } - if (_sqrtPriceLimitX96 <= pool.sqrtRatioX96) { - throw new Error( - `RATIO_CURRENT: input sqrtPriceLimitX96 ${_sqrtPriceLimitX96.toString()} is less than or equal to the pool's current sqrt ratio ${pool.sqrtRatioX96.toString()}` - ); - } - } - - const ZERO: BigInt = BigInt.ZERO; - const exactInput: boolean = amountSpecified >= ZERO; - - // keep track of swap state - const state: SimulatedSwapState = { - amountSpecifiedRemaining: amountSpecified, - amountCalculated: ZERO, - sqrtPriceX96: pool.sqrtRatioX96, - tick: pool.tickCurrent, - liquidity: pool.liquidity, - }; - - // start swap while loop - while ( - state.amountSpecifiedRemaining != ZERO && - state.sqrtPriceX96 != _sqrtPriceLimitX96 - ) { - const step: StepComputations = { - sqrtPriceStartX96: BigInt.ZERO, - tickNext: 0, - initialized: false, - sqrtPriceNextX96: BigInt.ZERO, - amountIn: BigInt.ZERO, - amountOut: BigInt.ZERO, - feeAmount: BigInt.ZERO, - }; - step.sqrtPriceStartX96 = state.sqrtPriceX96; - - // because each iteration of the while loop rounds, we can't optimize this code (relative to the smart contract) - // by simply traversing to the next available tick, we instead need to exactly replicate - // tickBitmap.nextInitializedTickWithinOneWord - const nextTickResult: NextTickResult = nextInitializedTickWithinOneWord({ - tick: state.tick, - lte: zeroForOne, - tickSpacing: getPoolTickSpacing({ pool: pool }), - tickDataProvider: pool.tickDataProvider, - }); - step.tickNext = nextTickResult.index; - step.initialized = nextTickResult.found; - - if (step.tickNext < _MIN_TICK) { - step.tickNext = _MIN_TICK; - } else if (step.tickNext > _MAX_TICK) { - step.tickNext = _MAX_TICK; - } - - step.sqrtPriceNextX96 = getSqrtRatioAtTick({ - tick: step.tickNext, - }); - - const sqrtRatioTargetX96: BigInt = ( - zeroForOne - ? step.sqrtPriceNextX96 < _sqrtPriceLimitX96 - : step.sqrtPriceNextX96 > _sqrtPriceLimitX96 - ) - ? _sqrtPriceLimitX96 - : step.sqrtPriceNextX96; - const swapStepResult: SwapStepResult = computeSwapStep( - state.sqrtPriceX96, - sqrtRatioTargetX96, - state.liquidity, - state.amountSpecifiedRemaining, - pool.fee - ); - state.sqrtPriceX96 = swapStepResult.sqrtRatioNextX96; - step.amountIn = swapStepResult.amountIn; - step.amountOut = swapStepResult.amountOut; - step.feeAmount = swapStepResult.feeAmount; - - if (exactInput) { - state.amountSpecifiedRemaining = state.amountSpecifiedRemaining - .sub(step.amountIn) - .sub(step.feeAmount); - state.amountCalculated = state.amountCalculated.sub(step.amountOut); - } else { - state.amountSpecifiedRemaining = BigInt.add( - state.amountSpecifiedRemaining, - step.amountOut - ); - state.amountCalculated = state.amountCalculated - .add(step.amountIn) - .add(step.feeAmount); - } - - if (state.sqrtPriceX96 == step.sqrtPriceNextX96) { - // if the tick is initialized, run the tick transition - if (step.initialized) { - let liquidityNet: BigInt = getTick({ - tickIndex: step.tickNext, - tickDataProvider: pool.tickDataProvider, - }).liquidityNet; - // if we're moving leftward, we interpret liquidityNet as the opposite sign - // safe because liquidityNet cannot be type(int128).min - if (zeroForOne) { - liquidityNet = liquidityNet.opposite(); - } - // state.liquidity = addDelta({x: state.liquidity, y: liquidityNet }); - state.liquidity = state.liquidity.add(liquidityNet); - } - state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext; - } else if (state.sqrtPriceX96 != step.sqrtPriceStartX96) { - // recompute unless we're on a lower tick boundary (i.e. already transitioned ticks), and haven't moved - state.tick = getTickAtSqrtRatio({ - sqrtRatioX96: state.sqrtPriceX96, - }); - } - } - - return { - amountCalculated: state.amountCalculated, - sqrtRatioX96: state.sqrtPriceX96, - liquidity: state.liquidity, - tickCurrent: state.tick, - }; -} - -function computeSwapStep( - sqrtRatioCurrentX96: BigInt, - sqrtRatioTargetX96: BigInt, - liquidity: BigInt, - amountRemaining: BigInt, - feePips: FeeAmount -): SwapStepResult { - const _feePips: u32 = _getFeeAmount(feePips); - - const returnValues: SwapStepResult = { - sqrtRatioNextX96: BigInt.ZERO, - amountIn: BigInt.ZERO, - amountOut: BigInt.ZERO, - feeAmount: BigInt.ZERO, - }; - - const zeroForOne: boolean = sqrtRatioCurrentX96 >= sqrtRatioTargetX96; - const exactIn: boolean = amountRemaining >= BigInt.ZERO; - - if (exactIn) { - const amountRemainingLessFee: BigInt = BigInt.div( - BigInt.mul( - amountRemaining, - BigInt.sub(MAX_FEE, BigInt.fromUInt32(_feePips)) - ), - MAX_FEE - ); - - returnValues.amountIn = zeroForOne - ? getAmount0Delta({ - sqrtRatioAX96: sqrtRatioTargetX96, - sqrtRatioBX96: sqrtRatioCurrentX96, - liquidity: liquidity, - roundUp: true, - }) - : getAmount1Delta({ - sqrtRatioAX96: sqrtRatioCurrentX96, - sqrtRatioBX96: sqrtRatioTargetX96, - liquidity: liquidity, - roundUp: true, - }); - if (amountRemainingLessFee >= returnValues.amountIn) { - returnValues.sqrtRatioNextX96 = sqrtRatioTargetX96; - } else { - returnValues.sqrtRatioNextX96 = getNextSqrtPriceFromInput({ - sqrtPX96: sqrtRatioCurrentX96, - liquidity: liquidity, - amountIn: amountRemainingLessFee, - zeroForOne: zeroForOne, - }); - } - } else { - returnValues.amountOut = zeroForOne - ? getAmount1Delta({ - sqrtRatioAX96: sqrtRatioTargetX96, - sqrtRatioBX96: sqrtRatioCurrentX96, - liquidity: liquidity, - roundUp: false, - }) - : getAmount0Delta({ - sqrtRatioAX96: sqrtRatioCurrentX96, - sqrtRatioBX96: sqrtRatioTargetX96, - liquidity: liquidity, - roundUp: false, - }); - if (amountRemaining.opposite() >= returnValues.amountOut) { - returnValues.sqrtRatioNextX96 = sqrtRatioTargetX96; - } else { - returnValues.sqrtRatioNextX96 = getNextSqrtPriceFromOutput({ - sqrtPX96: sqrtRatioCurrentX96, - liquidity: liquidity, - amountOut: amountRemaining.opposite(), - zeroForOne: zeroForOne, - }); - } - } - - const max: boolean = sqrtRatioTargetX96 == returnValues.sqrtRatioNextX96; - - if (zeroForOne) { - returnValues.amountIn = - max && exactIn - ? returnValues.amountIn - : getAmount0Delta({ - sqrtRatioAX96: returnValues.sqrtRatioNextX96, - sqrtRatioBX96: sqrtRatioCurrentX96, - liquidity: liquidity, - roundUp: true, - }); - returnValues.amountOut = - max && !exactIn - ? returnValues.amountOut - : getAmount1Delta({ - sqrtRatioAX96: returnValues.sqrtRatioNextX96, - sqrtRatioBX96: sqrtRatioCurrentX96, - liquidity: liquidity, - roundUp: false, - }); - } else { - returnValues.amountIn = - max && exactIn - ? returnValues.amountIn - : getAmount1Delta({ - sqrtRatioAX96: sqrtRatioCurrentX96, - sqrtRatioBX96: returnValues.sqrtRatioNextX96, - liquidity: liquidity, - roundUp: true, - }); - returnValues.amountOut = - max && !exactIn - ? returnValues.amountOut - : getAmount0Delta({ - sqrtRatioAX96: sqrtRatioCurrentX96, - sqrtRatioBX96: returnValues.sqrtRatioNextX96, - liquidity: liquidity, - roundUp: false, - }); - } - - const negAmountRemaining: BigInt = amountRemaining.opposite(); - if (!exactIn && returnValues.amountOut > negAmountRemaining) { - returnValues.amountOut = negAmountRemaining; - } - - if (exactIn && returnValues.sqrtRatioNextX96 != sqrtRatioTargetX96) { - // we didn't reach the target, so take the remainder of the maximum input as fee - returnValues.feeAmount = amountRemaining.sub(returnValues.amountIn); - } else { - returnValues.feeAmount = mulDivRoundingUp({ - a: returnValues.amountIn, - b: BigInt.fromUInt32(_feePips), - denominator: MAX_FEE.subInt(_feePips), - }); - } - - return { - sqrtRatioNextX96: returnValues.sqrtRatioNextX96, - amountIn: returnValues.amountIn, - amountOut: returnValues.amountOut, - feeAmount: returnValues.feeAmount, - }; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/position/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/position/index.ts deleted file mode 100644 index 2372ec67b..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/position/index.ts +++ /dev/null @@ -1,501 +0,0 @@ -import { - Args_burnAmountsWithSlippage, - Args_createPosition, - Args_createPositionFromAmount0, - Args_createPositionFromAmount1, - Args_createPositionFromAmounts, - Args_mintAmounts, - Args_mintAmountsWithSlippage, - Args_positionAmount0, - Args_positionAmount1, - Args_positionToken0PriceLower, - Args_positionToken0PriceUpper, - MintAmounts, - Pool, - Position, - Price as PriceType, - TokenAmount, -} from "../wrap"; -import { createPool, getPoolTickSpacing } from "../pool"; -import { - getSqrtRatioAtTick, - getTickAtSqrtRatio, - tickToPrice, -} from "../tickList"; -import { - _MAX_SQRT_RATIO, - _MAX_TICK, - MAX_UINT_256, - _MIN_SQRT_RATIO, - _MIN_TICK, - encodeSqrtRatioX96, - getAmount0Delta, - getAmount1Delta, - Fraction, - Price, -} from "../utils"; -import { maxLiquidityForAmounts } from "./utils"; - -import { BigInt } from "@polywrap/wasm-as"; - -export * from "./nonfungiblePositionManager"; -export * from "./utils"; - -/** - * Constructs and validates a Position for a given Pool with the given liquidity - * @param args.pool For which pool the liquidity is assigned - * @param args.tickLower The lower tick of the position - * @param args.tickUpper The upper tick of the position - * @param args.liquidity The amount of liquidity that is in the position - */ -export function createPosition(args: Args_createPosition): Position { - const pool: Pool = args.pool; - const tickLower: i32 = args.tickLower; - const tickUpper: i32 = args.tickUpper; - const liquidity: BigInt = args.liquidity; - - if (tickLower >= tickUpper) { - throw new Error( - "TICK_ORDER: upper tick index must be greater than lower tick index" - ); - } - if (tickLower < _MIN_TICK || tickLower % getPoolTickSpacing({ pool }) != 0) { - throw new Error( - "TICK_LOWER: lower tick index is less than minimum or not aligned with tick spacing" - ); - } - if (tickUpper > _MAX_TICK || tickUpper % getPoolTickSpacing({ pool }) != 0) { - throw new Error( - "TICK_UPPER: upper tick index is greater than maximum or not aligned with tick spacing" - ); - } - - return { - pool, - tickLower, - tickUpper, - liquidity, - token0Amount: positionAmount0({ - pool: args.pool, - tickLower: args.tickLower, - tickUpper: args.tickUpper, - liquidity: args.liquidity, - }), - token1Amount: positionAmount1({ - pool: args.pool, - tickLower: args.tickLower, - tickUpper: args.tickUpper, - liquidity: args.liquidity, - }), - mintAmounts: mintAmounts({ - pool: args.pool, - tickLower: args.tickLower, - tickUpper: args.tickUpper, - liquidity: args.liquidity, - }), - token0PriceLower: positionToken0PriceLower({ pool, tickLower }), - token0PriceUpper: positionToken0PriceUpper({ pool, tickUpper }), - }; -} - -/** - * Computes the maximum amount of liquidity received for a given amount of token0, token1, and the prices at the tick boundaries - * @param args.pool The pool for which the position should be created - * @param args.tickLower The lower tick of the position - * @param args.tickUpper The upper tick of the position - * @param args.amount0 token0 amount - * @param args.amount1 token1 amount - * @param args.useFullPrecision If false, liquidity will be maximized according to what the router can calculate, not what core can theoretically support - */ -export function createPositionFromAmounts( - args: Args_createPositionFromAmounts -): Position { - const pool: Pool = args.pool; - const tickLower: i32 = args.tickLower; - const tickUpper: i32 = args.tickUpper; - const amount0: BigInt = args.amount0; - const amount1: BigInt = args.amount1; - const useFullPrecision: boolean = args.useFullPrecision; - - const sqrtRatioAX96: BigInt = getSqrtRatioAtTick({ tick: tickLower }); - const sqrtRatioBX96: BigInt = getSqrtRatioAtTick({ tick: tickUpper }); - return createPosition({ - pool, - tickLower, - tickUpper, - liquidity: maxLiquidityForAmounts({ - sqrtRatioCurrentX96: pool.sqrtRatioX96, - sqrtRatioAX96, - sqrtRatioBX96, - amount0, - amount1, - useFullPrecision, - }), - }); -} - -/** - * Computes a position with the maximum amount of liquidity received for a given amount of token0, assuming an unlimited amount of token1 - * @param args.pool The pool for which the position should be created - * @param args.tickLower The lower tick of the position - * @param args.tickUpper The upper tick of the position - * @param args.amount0 token0 The desired amount of token0 - * @param args.useFullPrecision If false, liquidity will be maximized according to what the router can calculate, not what core can theoretically support - */ -export function createPositionFromAmount0( - args: Args_createPositionFromAmount0 -): Position { - const pool: Pool = args.pool; - const tickLower: i32 = args.tickLower; - const tickUpper: i32 = args.tickUpper; - const amount0: BigInt = args.amount0; - const useFullPrecision: boolean = args.useFullPrecision; - return createPositionFromAmounts({ - pool, - tickLower, - tickUpper, - amount0, - amount1: MAX_UINT_256, - useFullPrecision, - }); -} - -/** - * Computes a position with the maximum amount of liquidity received for a given amount of token1, assuming an unlimited amount of token0 - * @param args.pool The pool for which the position should be created - * @param args.tickLower The lower tick of the position - * @param args.tickUpper The upper tick of the position - * @param args.amount1 token0 The desired amount of token1 - * @param args.useFullPrecision If false, liquidity will be maximized according to what the router can calculate, not what core can theoretically support - */ -export function createPositionFromAmount1( - args: Args_createPositionFromAmount1 -): Position { - const pool: Pool = args.pool; - const tickLower: i32 = args.tickLower; - const tickUpper: i32 = args.tickUpper; - const amount1: BigInt = args.amount1; - return createPositionFromAmounts({ - pool, - tickLower, - tickUpper, - amount0: MAX_UINT_256, - amount1, - useFullPrecision: true, - }); -} - -/** - * Returns the price of token0 at the lower tick - * @param args.position - */ -export function positionToken0PriceLower( - args: Args_positionToken0PriceLower -): PriceType { - const pool: Pool = args.pool; - const tickLower: i32 = args.tickLower; - return tickToPrice({ - baseToken: pool.token0, - quoteToken: pool.token1, - tick: tickLower, - }); -} - -/** - * Returns the price of token0 at the upper tick - * @param args.position - */ -export function positionToken0PriceUpper( - args: Args_positionToken0PriceUpper -): PriceType { - const pool: Pool = args.pool; - const tickUpper: i32 = args.tickUpper; - return tickToPrice({ - baseToken: pool.token0, - quoteToken: pool.token1, - tick: tickUpper, - }); -} - -/** - * Returns the amount of token0 that this position's liquidity could be burned for at the current pool price - * @param args.position - */ -export function positionAmount0(args: Args_positionAmount0): TokenAmount { - const pool: Pool = args.pool; - const tickLower: i32 = args.tickLower; - const tickUpper: i32 = args.tickUpper; - const liquidity: BigInt = args.liquidity; - if (pool.tickCurrent < tickLower) { - return { - token: pool.token0, - amount: getAmount0Delta({ - sqrtRatioAX96: getSqrtRatioAtTick({ tick: tickLower }), - sqrtRatioBX96: getSqrtRatioAtTick({ tick: tickUpper }), - liquidity: liquidity, - roundUp: false, - }), - }; - } else if (pool.tickCurrent < tickUpper) { - return { - token: pool.token0, - amount: getAmount0Delta({ - sqrtRatioAX96: pool.sqrtRatioX96, - sqrtRatioBX96: getSqrtRatioAtTick({ tick: tickUpper }), - liquidity: liquidity, - roundUp: false, - }), - }; - } else { - return { - token: pool.token0, - amount: BigInt.ZERO, - }; - } -} - -/** - * Returns the amount of token1 that this position's liquidity could be burned for at the current pool price - * @param args.position - */ -export function positionAmount1(args: Args_positionAmount1): TokenAmount { - const pool: Pool = args.pool; - const tickLower: i32 = args.tickLower; - const tickUpper: i32 = args.tickUpper; - const liquidity: BigInt = args.liquidity; - if (pool.tickCurrent < tickLower) { - return { - token: pool.token1, - amount: BigInt.ZERO, - }; - } else if (pool.tickCurrent < tickUpper) { - return { - token: pool.token1, - amount: getAmount1Delta({ - sqrtRatioAX96: getSqrtRatioAtTick({ tick: tickLower }), - sqrtRatioBX96: pool.sqrtRatioX96, - liquidity: liquidity, - roundUp: false, - }), - }; - } else { - return { - token: pool.token1, - amount: getAmount1Delta({ - sqrtRatioAX96: getSqrtRatioAtTick({ tick: tickLower }), - sqrtRatioBX96: getSqrtRatioAtTick({ tick: tickUpper }), - liquidity: liquidity, - roundUp: false, - }), - }; - } -} - -/** - * Returns the minimum amounts that must be sent in order to mint the amount of liquidity held by the position at the current price for the pool - * @param args.position - */ -export function mintAmounts(args: Args_mintAmounts): MintAmounts { - const pool: Pool = args.pool; - const tickLower: i32 = args.tickLower; - const tickUpper: i32 = args.tickUpper; - const liquidity: BigInt = args.liquidity; - if (pool.tickCurrent < tickLower) { - return { - amount0: getAmount0Delta({ - sqrtRatioAX96: getSqrtRatioAtTick({ tick: tickLower }), - sqrtRatioBX96: getSqrtRatioAtTick({ tick: tickUpper }), - liquidity: liquidity, - roundUp: true, - }), - amount1: BigInt.ZERO, - }; - } else if (pool.tickCurrent < tickUpper) { - return { - amount0: getAmount0Delta({ - sqrtRatioAX96: pool.sqrtRatioX96, - sqrtRatioBX96: getSqrtRatioAtTick({ tick: tickUpper }), - liquidity: liquidity, - roundUp: true, - }), - amount1: getAmount1Delta({ - sqrtRatioAX96: getSqrtRatioAtTick({ tick: tickLower }), - sqrtRatioBX96: pool.sqrtRatioX96, - liquidity: liquidity, - roundUp: true, - }), - }; - } else { - return { - amount0: BigInt.ZERO, - amount1: getAmount1Delta({ - sqrtRatioAX96: getSqrtRatioAtTick({ tick: tickLower }), - sqrtRatioBX96: getSqrtRatioAtTick({ tick: tickUpper }), - liquidity: liquidity, - roundUp: true, - }), - }; - } -} - -/** - * Returns the minimum amounts that must be sent in order to safely mint the amount of liquidity held by the position with the given slippage tolerance - * @param args.position - * @param args.slippageTolerance Tolerance of unfavorable slippage from the current price - */ -export function mintAmountsWithSlippage( - args: Args_mintAmountsWithSlippage -): MintAmounts { - const position: Position = args.position; - const slippageTolerance: string = args.slippageTolerance; - - // get lower/upper prices - const bounds: BigInt[] = ratiosAfterSlippage( - position.pool, - Fraction.fromString(slippageTolerance) - ); - const sqrtRatioX96Lower: BigInt = bounds[0]; - const sqrtRatioX96Upper: BigInt = bounds[1]; - - // construct counterfactual pools - const poolLower = createPool({ - tokenA: position.pool.token0, - tokenB: position.pool.token1, - fee: position.pool.fee, - sqrtRatioX96: sqrtRatioX96Lower, - liquidity: BigInt.ZERO /* liquidity doesn't matter */, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96: sqrtRatioX96Lower }), - ticks: null, - }); - const poolUpper = createPool({ - tokenA: position.pool.token0, - tokenB: position.pool.token1, - fee: position.pool.fee, - sqrtRatioX96: sqrtRatioX96Upper, - liquidity: BigInt.ZERO /* liquidity doesn't matter */, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96: sqrtRatioX96Upper }), - ticks: null, - }); - - // because the router is imprecise, we need to calculate the position that will be created (assuming no slippage) - // the mint amounts are what will be passed as calldata - const positionThatWillBeCreated = createPositionFromAmounts({ - pool: position.pool, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - amount0: position.mintAmounts.amount0, - amount1: position.mintAmounts.amount1, - useFullPrecision: false, - }); - - // we want the smaller amounts... - // ...which occurs at the upper price for amount0... - const amount0: BigInt = mintAmounts({ - pool: poolUpper, - liquidity: positionThatWillBeCreated.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount0; - // ...and the lower for amount1 - const amount1: BigInt = mintAmounts({ - pool: poolLower, - liquidity: positionThatWillBeCreated.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount1; - - return { amount0, amount1 }; -} - -/** - * Returns the minimum amounts that should be requested in order to safely burn the amount of liquidity held by the position with the given slippage tolerance - * @param args.position - * @param args.slippageTolerance Tolerance of unfavorable slippage from the current price - */ -export function burnAmountsWithSlippage( - args: Args_burnAmountsWithSlippage -): MintAmounts { - const position: Position = args.position; - const slippageTolerance: string = args.slippageTolerance; - - // get lower/upper prices - const bounds: BigInt[] = ratiosAfterSlippage( - position.pool, - Fraction.fromString(slippageTolerance) - ); - const sqrtRatioX96Lower: BigInt = bounds[0]; - const sqrtRatioX96Upper: BigInt = bounds[1]; - - // construct counterfactual pools - const poolLower = createPool({ - tokenA: position.pool.token0, - tokenB: position.pool.token1, - fee: position.pool.fee, - sqrtRatioX96: sqrtRatioX96Lower, - liquidity: BigInt.ZERO /* liquidity doesn't matter */, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96: sqrtRatioX96Lower }), - ticks: null, - }); - const poolUpper = createPool({ - tokenA: position.pool.token0, - tokenB: position.pool.token1, - fee: position.pool.fee, - sqrtRatioX96: sqrtRatioX96Upper, - liquidity: BigInt.ZERO /* liquidity doesn't matter */, - tickCurrent: getTickAtSqrtRatio({ sqrtRatioX96: sqrtRatioX96Upper }), - ticks: null, - }); - - // we want the smaller amounts... - // ...which occurs at the upper price for amount0... - const amount0: BigInt = positionAmount0({ - pool: poolUpper, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount; - // ...and the lower for amount1 - const amount1: BigInt = positionAmount1({ - pool: poolLower, - liquidity: position.liquidity, - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }).amount; - - return { amount0, amount1 }; -} - -/** - * Returns the lower and upper sqrt ratios if the price 'slips' up to slippage tolerance percentage - * @param pool The pool for which the position exists - * @param slippageTolerance The amount by which the price can 'slip' before the transaction will revert - * @returns The sqrt ratios after slippage - */ -function ratiosAfterSlippage( - pool: Pool, - slippageTolerance: Fraction -): BigInt[] { - const one: Fraction = new Fraction(BigInt.ONE); - const priceLower: Fraction = Price.fromPriceType(pool.token0Price) - .raw() - .mul(one.sub(slippageTolerance)); - const priceUpper: Fraction = Price.fromPriceType(pool.token0Price) - .raw() - .mul(slippageTolerance.add(one)); - - let sqrtRatioX96Lower: BigInt = encodeSqrtRatioX96({ - amount1: priceLower.numerator, - amount0: priceLower.denominator, - }); - if (sqrtRatioX96Lower <= _MIN_SQRT_RATIO) { - sqrtRatioX96Lower = _MIN_SQRT_RATIO.addInt(1); - } - let sqrtRatioX96Upper = encodeSqrtRatioX96({ - amount1: priceUpper.numerator, - amount0: priceUpper.denominator, - }); - if (sqrtRatioX96Upper >= _MAX_SQRT_RATIO) { - sqrtRatioX96Upper = _MAX_SQRT_RATIO.subInt(1); - } - return [sqrtRatioX96Lower, sqrtRatioX96Upper]; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/position/nonfungiblePositionManager.ts b/protocol/ethereum/uniswapv3/wrapper/src/position/nonfungiblePositionManager.ts deleted file mode 100644 index b1fe6851b..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/position/nonfungiblePositionManager.ts +++ /dev/null @@ -1,507 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ - -import { - AddLiquidityOptions, - CollectOptions, - Ethereum_Module, - Args_addCallParameters, - Args_collectCallParameters, - Args_createCallParameters, - Args_removeCallParameters, - Args_safeTransferFromParameters, - MethodParameters, - MintAmounts, - Pool, - Position, - RemoveLiquidityOptions, - SafeTransferOptions, - Token, - TokenAmount, -} from "../wrap"; -import { - encodeMulticall, - encodePermit, - encodeRefundETH, - encodeSweepToken, - encodeUnwrapWETH9, - toHex, -} from "../router"; -import { - ADDRESS_ZERO, - ZERO_HEX, - _getFeeAmount, - _getPermitV, - getChecksumAddress, - Fraction, -} from "../utils"; -import { - burnAmountsWithSlippage, - createPosition, - mintAmountsWithSlippage, -} from "./index"; -import { tokenEquals, _isNative, _wrapToken } from "../token"; - -import { BigInt } from "@polywrap/wasm-as"; - -const MAX_UINT_128_HEX = toHex({ value: BigInt.ONE.leftShift(128).subInt(1) }); - -class MintArgs { - token0: string; - token1: string; - fee: u32; - tickLower: i32; - tickUpper: i32; - amount0Desired: string; - amount1Desired: string; - amount0Min: string; - amount1Min: string; - recipient: string; - deadline: string; -} - -class IncreaseLiquidityArgs { - tokenId: string; - amount0Desired: string; - amount1Desired: string; - amount0Min: string; - amount1Min: string; - deadline: string; -} - -class CollectArgs { - tokenId: string; - recipient: string; - amount0Max: string; - amount1Max: string; -} - -class DecreaseLiquidityArgs { - tokenId: string; - liquidity: string; - amount0Min: string; - amount1Min: string; - deadline: string; -} - -export function createCallParameters( - args: Args_createCallParameters -): MethodParameters { - return { - calldata: encodeCreate(args.pool), - value: ZERO_HEX, - }; -} - -export function addCallParameters( - args: Args_addCallParameters -): MethodParameters { - const position: Position = args.position; - const options: AddLiquidityOptions = args.options; - - if (position.liquidity <= BigInt.ZERO) { - throw new Error("ZERO_LIQUIDITY: position liquidity must exceed zero"); - } - - const calldatas: string[] = []; - - // get amounts - const amount0Desired: BigInt = position.mintAmounts.amount0; - const amount1Desired: BigInt = position.mintAmounts.amount1; - - // adjust for slippage - const minimumAmounts: MintAmounts = mintAmountsWithSlippage({ - position, - slippageTolerance: options.slippageTolerance, - }); - const amount0Min: string = toHex({ value: minimumAmounts.amount0 }); - const amount1Min: string = toHex({ value: minimumAmounts.amount1 }); - - const deadline: string = toHex({ value: options.deadline }); - - // create pool if needed - if ( - isMint(options) && - options.createPool !== null && - options.createPool!.unwrap() - ) { - calldatas.push(encodeCreate(position.pool)); - } - - // permits if necessary - if (options.token0Permit !== null) { - calldatas.push( - encodePermit({ - token: position.pool.token0, - options: options.token0Permit!, - }) - ); - } - if (options.token1Permit !== null) { - calldatas.push( - encodePermit({ - token: position.pool.token1, - options: options.token1Permit!, - }) - ); - } - - // mint - if (isMint(options)) { - const args: MintArgs = { - token0: position.pool.token0.address, - token1: position.pool.token1.address, - fee: _getFeeAmount(position.pool.fee), - tickLower: position.tickLower, - tickUpper: position.tickUpper, - amount0Desired: toHex({ value: amount0Desired }), - amount1Desired: toHex({ value: amount1Desired }), - amount0Min, - amount1Min, - recipient: getChecksumAddress(options.recipient!), - deadline, - }; - calldatas.push( - Ethereum_Module.encodeFunction({ - method: nfpmAbi("mint"), - args: [paramsToJsonString(args)], - }).unwrap() - ); - } else { - // increase - const args: IncreaseLiquidityArgs = { - tokenId: toHex({ value: options.tokenId! }), - amount0Desired: toHex({ value: amount0Desired }), - amount1Desired: toHex({ value: amount1Desired }), - amount0Min, - amount1Min, - deadline, - }; - calldatas.push( - Ethereum_Module.encodeFunction({ - method: nfpmAbi("increaseLiquidity"), - args: [paramsToJsonString(args)], - }).unwrap() - ); - } - - let value: string = ZERO_HEX; - if (options.useNative !== null) { - const wrapped: Token = _wrapToken(options.useNative!); - const isToken0: boolean = tokenEquals({ - tokenA: position.pool.token0, - tokenB: wrapped, - }); - const isToken1: boolean = tokenEquals({ - tokenA: position.pool.token1, - tokenB: wrapped, - }); - if (!isToken0 && !isToken1) { - throw new Error( - "NO_WETH: the native token provided with the useNative option must be involved in the position pool" - ); - } - - const wrappedValue: BigInt = isToken0 ? amount0Desired : amount1Desired; - - // we only need to refund if we're actually sending ETH - if (wrappedValue > BigInt.ZERO) { - calldatas.push(encodeRefundETH({})); - } - - value = toHex({ value: wrappedValue }); - } - - return { - calldata: encodeMulticall({ calldatas }), - value, - }; -} - -export function collectCallParameters( - args: Args_collectCallParameters -): MethodParameters { - const calldatas: string[] = encodeCollect(args.options); - return { - calldata: encodeMulticall({ calldatas }), - value: ZERO_HEX, - }; -} - -/** - * Produces the calldata for completely or partially exiting a position - * @param args.position The position to exit - * @param args.options Additional information necessary for generating the calldata - */ -export function removeCallParameters( - args: Args_removeCallParameters -): MethodParameters { - const position: Position = args.position; - const options: RemoveLiquidityOptions = args.options; - - const calldatas: string[] = []; - - const deadline: string = toHex({ value: options.deadline }); - const tokenId: string = toHex({ value: options.tokenId }); - const liqPercent: Fraction = Fraction.fromString(options.liquidityPercentage); - - // construct a partial position with a percentage of liquidity - const partialPosition = createPosition({ - pool: position.pool, - liquidity: liqPercent.mul(new Fraction(position.liquidity)).quotient(), - tickLower: position.tickLower, - tickUpper: position.tickUpper, - }); - if (partialPosition.liquidity <= BigInt.ZERO) { - throw new Error("ZERO_LIQUIDITY"); - } - - // slippage-adjusted underlying amounts - const burnAmounts: MintAmounts = burnAmountsWithSlippage({ - position: partialPosition, - slippageTolerance: options.slippageTolerance, - }); - const amount0Min: BigInt = burnAmounts.amount0; - const amount1Min: BigInt = burnAmounts.amount1; - - if (options.permit !== null) { - calldatas.push( - Ethereum_Module.encodeFunction({ - method: nfpmAbi("permit"), - args: [ - getChecksumAddress(options.permit!.spender), - tokenId, - toHex({ value: options.permit!.deadline }), - _getPermitV(options.permit!.v).toString(), - options.permit!.r, - options.permit!.s, - ], - }).unwrap() - ); - } - - // remove liquidity - const decreaseLiqArgs: DecreaseLiquidityArgs = { - tokenId, - liquidity: toHex({ value: partialPosition.liquidity }), - amount0Min: toHex({ value: amount0Min }), - amount1Min: toHex({ value: amount1Min }), - deadline, - }; - calldatas.push( - Ethereum_Module.encodeFunction({ - method: nfpmAbi("decreaseLiquidity"), - args: [paramsToJsonString(decreaseLiqArgs)], - }).unwrap() - ); - - const expectedCurrencyOwed0: TokenAmount = - options.collectOptions.expectedCurrencyOwed0; - const expectedCurrencyOwed1: TokenAmount = - options.collectOptions.expectedCurrencyOwed1; - const collectCalldatas: string[] = encodeCollect({ - tokenId: options.tokenId, - // add the underlying value to the expected currency already owed - expectedCurrencyOwed0: { - token: expectedCurrencyOwed0.token, - amount: expectedCurrencyOwed0.amount.add(amount0Min), - }, - expectedCurrencyOwed1: { - token: expectedCurrencyOwed1.token, - amount: expectedCurrencyOwed1.amount.add(amount1Min), - }, - recipient: options.collectOptions.recipient, - }); - for (let i = 0; i < collectCalldatas.length; i++) { - calldatas.push(collectCalldatas[i]); - } - - if (liqPercent.eq(new Fraction(BigInt.ONE))) { - if (options.burnToken !== null && options.burnToken!.unwrap()) { - calldatas.push( - Ethereum_Module.encodeFunction({ - method: nfpmAbi("burn"), - args: [tokenId], - }).unwrap() - ); - } - } else { - if (options.burnToken !== null && options.burnToken!.unwrap()) { - throw new Error("CANNOT_BURN"); - } - } - - return { - calldata: encodeMulticall({ calldatas }), - value: ZERO_HEX, - }; -} - -export function safeTransferFromParameters( - args: Args_safeTransferFromParameters -): MethodParameters { - const options: SafeTransferOptions = args.options; - - const recipient: string = getChecksumAddress(options.recipient); - const sender: string = getChecksumAddress(options.sender); - - let calldata: string; - if (options.data !== null) { - calldata = Ethereum_Module.encodeFunction({ - method: nfpmAbi("safeTransferFrom"), - args: [ - sender, - recipient, - toHex({ value: options.tokenId }), - options.data!, - ], - }).unwrap(); - } else { - calldata = Ethereum_Module.encodeFunction({ - method: nfpmAbi("_safeTransferFrom"), - args: [sender, recipient, toHex({ value: options.tokenId })], - }).unwrap(); - } - - return { - calldata: calldata, - value: ZERO_HEX, - }; -} - -function isMint(options: AddLiquidityOptions): boolean { - return options.recipient !== null; -} - -function encodeCreate(pool: Pool): string { - return Ethereum_Module.encodeFunction({ - method: nfpmAbi("createAndInitializePoolIfNecessary"), - args: [ - pool.token0.address, - pool.token1.address, - _getFeeAmount(pool.fee).toString(), - toHex({ value: pool.sqrtRatioX96 }), - ], - }).unwrap(); -} - -function encodeCollect(options: CollectOptions): string[] { - const calldatas: string[] = []; - - const tokenId: string = toHex({ value: options.tokenId }); - const recipient: string = getChecksumAddress(options.recipient); - const involvesETH: boolean = - _isNative(options.expectedCurrencyOwed0.token) || - _isNative(options.expectedCurrencyOwed1.token); - - // collect - const collectArgs: CollectArgs = { - tokenId, - recipient: involvesETH ? ADDRESS_ZERO : recipient, - amount0Max: MAX_UINT_128_HEX, - amount1Max: MAX_UINT_128_HEX, - }; - calldatas.push( - Ethereum_Module.encodeFunction({ - method: nfpmAbi("collect"), - args: [paramsToJsonString(collectArgs)], - }).unwrap() - ); - - if (involvesETH) { - const ethAmount: BigInt = _isNative(options.expectedCurrencyOwed0.token) - ? options.expectedCurrencyOwed0.amount - : options.expectedCurrencyOwed1.amount; - const token: Token = _isNative(options.expectedCurrencyOwed0.token) - ? options.expectedCurrencyOwed1.token - : options.expectedCurrencyOwed0.token; - const tokenAmount: BigInt = _isNative(options.expectedCurrencyOwed0.token) - ? options.expectedCurrencyOwed1.amount - : options.expectedCurrencyOwed0.amount; - - calldatas.push( - encodeUnwrapWETH9({ - amountMinimum: ethAmount, - recipient, - feeOptions: null, - }) - ); - calldatas.push( - encodeSweepToken({ - token, - amountMinimum: tokenAmount, - recipient, - feeOptions: null, - }) - ); - } - - return calldatas; -} - -function nfpmAbi(methodName: string): string { - if (methodName == "createAndInitializePoolIfNecessary") { - return "function createAndInitializePoolIfNecessary(address token0, address token1, uint24 fee, uint160 sqrtPriceX96) external payable returns (address pool)"; - } else if (methodName == "collect") { - return "function collect(tuple(uint256 tokenId, address recipient, uint128 amount0Max, uint128 amount1Max) calldata params) external payable returns (uint256 amount0, uint256 amount1)"; - } else if (methodName == "mint") { - return "function mint(tuple(address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline) calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)"; - } else if (methodName == "increaseLiquidity") { - return "function increaseLiquidity(tuple(uint256 tokenId, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, uint256 deadline) calldata params) external payable returns (uint128 liquidity, uint256 amount0, uint256 amount1)"; - } else if (methodName == "permit") { - return "function permit(address spender, uint256 deadline, bytes32 r, bytes32 s) external payable"; - } else if (methodName == "decreaseLiquidity") { - return "function decreaseLiquidity(tuple(uint256 tokenId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min, uint256 deadline) calldata params) external payable returns (uint256 amount0, uint256 amount1)"; - } else if (methodName == "burn") { - return "function burn(uint256 tokenId) external payable"; - } else if (methodName == "safeTransferFrom") { - return "function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)"; - } else if (methodName == "_safeTransferFrom") { - return "function safeTransferFrom(address from, address to, uint256 tokenId)"; - } else { - throw new Error("Invalid method name: " + methodName); - } -} - -function paramsToJsonString(params: T): string { - if (params instanceof CollectArgs) { - return `{ - "tokenId": "${params.tokenId}", - "recipient": "${params.recipient}", - "amount0Max": "${params.amount0Max}", - "amount1Max": "${params.amount1Max}" - }`; - } else if (params instanceof MintArgs) { - return `{ - "token0": "${params.token0}", - "token1": "${params.token1}", - "fee": ${params.fee}, - "tickLower": ${params.tickLower}, - "tickUpper": ${params.tickUpper}, - "amount0Desired": "${params.amount0Desired}", - "amount1Desired": "${params.amount1Desired}", - "amount0Min": "${params.amount0Min}", - "amount1Min": "${params.amount1Min}", - "recipient": "${params.recipient}", - "deadline": "${params.deadline}" - }`; - } else if (params instanceof IncreaseLiquidityArgs) { - return `{ - "tokenId": "${params.tokenId}", - "amount0Desired": "${params.amount0Desired}", - "amount1Desired": "${params.amount1Desired}", - "amount0Min": "${params.amount0Min}", - "amount1Min": "${params.amount1Min}", - "deadline": "${params.deadline}" - }`; - } else if (params instanceof DecreaseLiquidityArgs) { - return `{ - "tokenId": "${params.tokenId}", - "liquidity": "${params.liquidity}", - "amount0Min": "${params.amount0Min}", - "amount1Min": "${params.amount1Min}", - "deadline": "${params.deadline}" - }`; - } else { - throw new Error("unknown router parameters type"); - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/position/utils.ts b/protocol/ethereum/uniswapv3/wrapper/src/position/utils.ts deleted file mode 100644 index 86e1e32be..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/position/utils.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { Q96 } from "../utils/constants"; -import { Args_maxLiquidityForAmounts } from "../wrap"; - -import { BigInt } from "@polywrap/wasm-as"; - -/** - * Returns an imprecise maximum amount of liquidity received for a given amount of token 0. - * This function is available to accommodate LiquidityAmounts#getLiquidityForAmount0 in the v3 periphery, - * which could be more precise by at least 32 bits by dividing by Q64 instead of Q96 in the intermediate step, - * and shifting the subtracted ratio left by 32 bits. This imprecise calculation will likely be replaced in a future - * v3 router contract. - * @param sqrtRatioAX96 The price at the lower boundary - * @param sqrtRatioBX96 The price at the upper boundary - * @param amount0 The token0 amount - * @returns liquidity for amount0, imprecise - */ -function maxLiquidityForAmount0Imprecise( - sqrtRatioAX96: BigInt, - sqrtRatioBX96: BigInt, - amount0: BigInt -): BigInt { - if (sqrtRatioAX96 > sqrtRatioBX96) { - const temp = sqrtRatioAX96; - sqrtRatioAX96 = sqrtRatioBX96; - sqrtRatioBX96 = temp; - } - const intermediate: BigInt = sqrtRatioAX96.mul(sqrtRatioBX96).div(Q96); - return amount0.mul(intermediate).div(sqrtRatioBX96.sub(sqrtRatioAX96)); -} - -/** - * Returns a precise maximum amount of liquidity received for a given amount of token 0 by dividing by Q64 instead of Q96 in the intermediate step, - * and shifting the subtracted ratio left by 32 bits. - * @param sqrtRatioAX96 The price at the lower boundary - * @param sqrtRatioBX96 The price at the upper boundary - * @param amount0 The token0 amount - * @returns liquidity for amount0, precise - */ -function maxLiquidityForAmount0Precise( - sqrtRatioAX96: BigInt, - sqrtRatioBX96: BigInt, - amount0: BigInt -): BigInt { - if (sqrtRatioAX96 > sqrtRatioBX96) { - const temp = sqrtRatioAX96; - sqrtRatioAX96 = sqrtRatioBX96; - sqrtRatioBX96 = temp; - } - const numerator: BigInt = amount0.mul(sqrtRatioAX96).mul(sqrtRatioBX96); - const denominator: BigInt = sqrtRatioBX96.sub(sqrtRatioAX96).mul(Q96); - return numerator.div(denominator); -} - -/** - * Computes the maximum amount of liquidity received for a given amount of token1 - * @param sqrtRatioAX96 The price at the lower tick boundary - * @param sqrtRatioBX96 The price at the upper tick boundary - * @param amount1 The token1 amount - * @returns liquidity for amount1 - */ -function maxLiquidityForAmount1( - sqrtRatioAX96: BigInt, - sqrtRatioBX96: BigInt, - amount1: BigInt -): BigInt { - if (sqrtRatioAX96 > sqrtRatioBX96) { - const temp = sqrtRatioAX96; - sqrtRatioAX96 = sqrtRatioBX96; - sqrtRatioBX96 = temp; - } - return amount1.mul(Q96).div(sqrtRatioBX96.sub(sqrtRatioAX96)); -} - -/** - * Computes the maximum amount of liquidity received for a given amount of token0, token1, - * and the prices at the tick boundaries. - * @param args.sqrtRatioCurrentX96 the current price - * @param args.sqrtRatioAX96 price at lower boundary - * @param args.sqrtRatioBX96 price at upper boundary - * @param args.amount0 token0 amount - * @param args.amount1 token1 amount - * @param args.useFullPrecision if false, liquidity will be maximized according to what the router can calculate, - * not what core can theoretically support - */ -export function maxLiquidityForAmounts( - args: Args_maxLiquidityForAmounts -): BigInt { - const sqrtRatioCurrentX96: BigInt = args.sqrtRatioCurrentX96; - let sqrtRatioAX96: BigInt = args.sqrtRatioAX96; - let sqrtRatioBX96: BigInt = args.sqrtRatioBX96; - const amount0: BigInt = args.amount0; - const amount1: BigInt = args.amount1; - const useFullPrecision: boolean = args.useFullPrecision; - - if (sqrtRatioAX96 > sqrtRatioBX96) { - const temp = sqrtRatioAX96; - sqrtRatioAX96 = sqrtRatioBX96; - sqrtRatioBX96 = temp; - } - - const maxLiquidityForAmount0 = useFullPrecision - ? maxLiquidityForAmount0Precise - : maxLiquidityForAmount0Imprecise; - - if (sqrtRatioCurrentX96 <= sqrtRatioAX96) { - return maxLiquidityForAmount0(sqrtRatioAX96, sqrtRatioBX96, amount0); - } else if (sqrtRatioCurrentX96 < sqrtRatioBX96) { - const liquidity0 = maxLiquidityForAmount0( - sqrtRatioCurrentX96, - sqrtRatioBX96, - amount0 - ); - const liquidity1 = maxLiquidityForAmount1( - sqrtRatioAX96, - sqrtRatioCurrentX96, - amount1 - ); - return liquidity0 < liquidity1 ? liquidity0 : liquidity1; - } else { - return maxLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, amount1); - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/route/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/route/index.ts deleted file mode 100644 index 23bcf1b6a..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/route/index.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { - ChainId, - Pool, - Route, - Token, - Price as PriceType, - Args_createRoute, - Args_routeChainId, - Args_routeMidPrice, -} from "../wrap"; -import { poolChainId, poolInvolvesToken } from "../pool"; -import { tokenEquals, _wrapToken } from "../token"; -import { Price } from "../utils"; - -class MidPriceStep { - nextInput: Token; - price: Price; -} - -/** - * Constructs and validates a Route - * @param args.pools the ordered list of pools from which to construct the route - * @param args.inToken the input token - * @param args.outToken the output token - */ -export function createRoute(args: Args_createRoute): Route { - const pools: Pool[] = args.pools; - const inToken: Token = args.inToken; - const outToken: Token = args.outToken; - - if (pools.length == 0) { - throw new Error("POOLS: pools cannot be an empty array"); - } - - const chainId: ChainId = poolChainId({ pool: pools[0] }); - let allOnSameChain: boolean = true; - for (let i = 0; i < pools.length; i++) { - if (poolChainId({ pool: pools[i] }) != chainId) { - allOnSameChain = false; - break; - } - } - if (!allOnSameChain) { - throw new Error("CHAIN_IDS: all pools must be on the same chain"); - } - - const wrappedInput: Token = _wrapToken(inToken); - if (!poolInvolvesToken({ pool: pools[0], token: wrappedInput })) { - throw new Error( - "INPUT: the first pool in pools must involve the input token" - ); - } - - const wrappedOutput: Token = _wrapToken(outToken); - if ( - !poolInvolvesToken({ pool: pools[pools.length - 1], token: wrappedOutput }) - ) { - throw new Error( - "OUTPUT: the last pool in pools must involve the output token" - ); - } - - // Normalizes token0-token1 order and selects the next token/fee step to add to the path - const path: Token[] = [wrappedInput]; - for (let i = 0; i < pools.length; i++) { - const pool: Pool = pools[i]; - const currentInputToken: Token = path[i]; - if (!poolInvolvesToken({ pool: pool, token: currentInputToken })) { - throw new Error( - "PATH: pools does not constitute a valid path, wherein each pool has a token in common with its adjacent pool" - ); - } - const nextToken: Token = tokenEquals({ - tokenA: currentInputToken, - tokenB: pool.token0, - }) - ? pool.token1 - : pool.token0; - path.push(nextToken); - } - - return { - pools: pools, - path: path, - input: inToken, - output: outToken, - midPrice: routeMidPrice({ pools, inToken, outToken }), - }; -} - -/** - * Returns the chain id of the tokens in the route - */ -export function routeChainId(args: Args_routeChainId): ChainId { - return poolChainId({ pool: args.route.pools[0] }); -} - -/** - * Returns the mid price of the route - */ -export function routeMidPrice(args: Args_routeMidPrice): PriceType { - const pools: Pool[] = args.pools; - const inToken: Token = args.inToken; - const outToken: Token = args.outToken; - - const price: Price = pools.slice(1).reduce( - (step: MidPriceStep, pool: Pool) => { - const nextInput: Token = step.nextInput; - const price: Price = step.price; - return tokenEquals({ - tokenA: nextInput, - tokenB: pool.token0, - }) - ? { - nextInput: pool.token1, - price: price.mul(Price.from(pool.token0Price)), - } - : { - nextInput: pool.token0, - price: price.mul(Price.from(pool.token1Price)), - }; - }, - tokenEquals({ - tokenA: pools[0].token0, - tokenB: _wrapToken(inToken), - }) - ? { - nextInput: pools[0].token1, - price: Price.from(pools[0].token0Price), - } - : { - nextInput: pools[0].token0, - price: Price.from(pools[0].token1Price), - } - ).price; - - return new Price( - inToken, - outToken, - price.denominator, - price.numerator - ).toPriceType(); -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/router/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/router/index.ts deleted file mode 100644 index 8d7e889fc..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/router/index.ts +++ /dev/null @@ -1,381 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { - Ethereum_Module, - Args_swapCallParameters, - MethodParameters, - Route, - SwapOptions, - Token, - TokenAmount, - Trade, - TradeType, -} from "../wrap"; -import { _isNative, _wrapToken, tokenEquals } from "../token"; -import { tradeMaximumAmountIn, tradeMinimumAmountOut } from "../trade"; -import { - _getFeeAmount, - getChecksumAddress, - ADDRESS_ZERO, - ZERO_HEX, -} from "../utils"; -import { - encodePermit, - encodeRouteToPath, - encodeMulticall, - encodeRefundETH, - encodeSweepToken, - encodeUnwrapWETH9, - toHex, -} from "./utils"; - -import { BigInt } from "@polywrap/wasm-as"; - -export * from "./utils"; - -class ExactInputSingleParams { - tokenIn: string; - tokenOut: string; - fee: u32; - recipient: string; - deadline: string; - amountIn: string; - amountOutMinimum: string; - sqrtPriceLimitX96: string; -} - -class ExactOutputSingleParams { - tokenIn: string; - tokenOut: string; - fee: u32; - recipient: string; - deadline: string; - amountOut: string; - amountInMaximum: string; - sqrtPriceLimitX96: string; -} - -class ExactInputParams { - path: string; - recipient: string; - deadline: string; - amountIn: string; - amountOutMinimum: string; -} - -class ExactOutputParams { - path: string; - recipient: string; - deadline: string; - amountOut: string; - amountInMaximum: string; -} - -/** - * Produces the on-chain method name to call and the hex encoded parameters to pass as arguments for a given trade - * @param args.trades trades to produce call parameters for - * @param args.options options for the call parameters - */ -export function swapCallParameters( - args: Args_swapCallParameters -): MethodParameters { - const trades: Trade[] = args.trades; - const options: SwapOptions = args.options; - - const sampleTrade: Trade = trades[0]; - - // All trades should have the same starting token. - const tokenIn: Token = _wrapToken(sampleTrade.inputAmount.token); - for (let i = 1; i < trades.length; i++) { - const tokenA: Token = _wrapToken(trades[i].inputAmount.token); - if (!tokenEquals({ tokenA, tokenB: tokenIn })) { - throw new Error( - "TOKEN_IN_DIFF: the input token of the trades must match" - ); - } - } - // All trades should have the same ending token. - const tokenOut: Token = _wrapToken(sampleTrade.outputAmount.token); - for (let i = 1; i < trades.length; i++) { - const tokenA: Token = _wrapToken(trades[i].outputAmount.token); - if (!tokenEquals({ tokenA, tokenB: tokenOut })) { - throw new Error( - "TOKEN_OUT_DIFF: the output token of the trades must match" - ); - } - } - - const calldatas: string[] = []; - - let sumAmountOut: BigInt = BigInt.ZERO; - for (let i = 0; i < trades.length; i++) { - const minOut: BigInt = tradeMinimumAmountOut({ - slippageTolerance: options.slippageTolerance, - amountOut: trades[i].outputAmount, - tradeType: trades[i].tradeType, - }).amount; - sumAmountOut = sumAmountOut.add(minOut); - } - const totalAmountOut: TokenAmount = { - token: trades[0].outputAmount.token, - amount: sumAmountOut, - }; - - // flag for whether a refund needs to happen - const mustRefund: boolean = - _isNative(sampleTrade.inputAmount.token) && - sampleTrade.tradeType == TradeType.EXACT_OUTPUT; - const inputIsNative: boolean = _isNative(sampleTrade.inputAmount.token); - // flags for whether funds should be sent first to the router - const outputIsNative: boolean = _isNative(sampleTrade.outputAmount.token); - const routerMustCustody: boolean = outputIsNative || options.fee !== null; - - let sumValue: BigInt = BigInt.ZERO; - if (inputIsNative) { - for (let i = 0; i < trades.length; i++) { - const maxIn: BigInt = tradeMaximumAmountIn({ - slippageTolerance: options.slippageTolerance, - amountIn: trades[i].inputAmount, - tradeType: trades[i].tradeType, - }).amount; - sumValue = sumValue.add(maxIn); - } - } - const totalValue: TokenAmount = { - token: trades[0].inputAmount.token, - amount: sumValue, - }; - - // encode permit if necessary - if (options.inputTokenPermit !== null) { - if (_isNative(sampleTrade.inputAmount.token)) { - throw new Error( - "NON_TOKEN_PERMIT: cannot encode permit of native currency (e.g. Ether)" - ); - } - calldatas.push( - encodePermit({ - token: sampleTrade.inputAmount.token, - options: options.inputTokenPermit!, - }) - ); - } - - const recipient: string = getChecksumAddress(options.recipient); - const deadline: string = toHex({ value: options.deadline }); - - for (let i = 0; i < trades.length; i++) { - const trade: Trade = trades[i]; - for (let j = 0; j < trade.swaps.length; j++) { - const route: Route = trade.swaps[j].route; - const inputAmount: TokenAmount = trade.swaps[j].inputAmount; - const outputAmount: TokenAmount = trade.swaps[j].outputAmount; - - const amountIn: string = toHex({ - value: tradeMaximumAmountIn({ - slippageTolerance: options.slippageTolerance, - amountIn: inputAmount, - tradeType: trade.tradeType, - }).amount, - }); - const amountOut: string = toHex({ - value: tradeMinimumAmountOut({ - slippageTolerance: options.slippageTolerance, - amountOut: outputAmount, - tradeType: trade.tradeType, - }).amount, - }); - - // flag for whether the trade is single hop or not - const singleHop = route.pools.length == 1; - - if (singleHop) { - if (trade.tradeType == TradeType.EXACT_INPUT) { - const exactInputSingleParams: ExactInputSingleParams = { - tokenIn: route.path[0].address, - tokenOut: route.path[1].address, - fee: _getFeeAmount(route.pools[0].fee), - recipient: routerMustCustody ? ADDRESS_ZERO : recipient, - deadline, - amountIn, - amountOutMinimum: amountOut, - sqrtPriceLimitX96: - options.sqrtPriceLimitX96 === null - ? ZERO_HEX - : toHex({ value: options.sqrtPriceLimitX96! }), - }; - - calldatas.push( - Ethereum_Module.encodeFunction({ - method: routerAbi("exactInputSingle"), - args: [paramsToJsonString(exactInputSingleParams)], - }).unwrap() - ); - } else { - const exactOutputSingleParams: ExactOutputSingleParams = { - tokenIn: route.path[0].address, - tokenOut: route.path[1].address, - fee: _getFeeAmount(route.pools[0].fee), - recipient: routerMustCustody ? ADDRESS_ZERO : recipient, - deadline, - amountOut, - amountInMaximum: amountIn, - sqrtPriceLimitX96: - options.sqrtPriceLimitX96 === null - ? ZERO_HEX - : toHex({ value: options.sqrtPriceLimitX96! }), - }; - - calldatas.push( - Ethereum_Module.encodeFunction({ - method: routerAbi("exactOutputSingle"), - args: [paramsToJsonString(exactOutputSingleParams)], - }).unwrap() - ); - } - } else { - if (options.sqrtPriceLimitX96 !== null) { - throw new Error( - "MULTIHOP_PRICE_LIMIT: sqrtPriceLimitX96 option must be null for multi-hop trades" - ); - } - - const path: string = encodeRouteToPath({ - route: route, - exactOutput: trade.tradeType == TradeType.EXACT_OUTPUT, - }); - - if (trade.tradeType == TradeType.EXACT_INPUT) { - const exactInputParams: ExactInputParams = { - path, - recipient: routerMustCustody ? ADDRESS_ZERO : recipient, - deadline, - amountIn, - amountOutMinimum: amountOut, - }; - - calldatas.push( - Ethereum_Module.encodeFunction({ - method: routerAbi("exactInput"), - args: [paramsToJsonString(exactInputParams)], - }).unwrap() - ); - } else { - const exactOutputParams: ExactOutputParams = { - path, - recipient: routerMustCustody ? ADDRESS_ZERO : recipient, - deadline, - amountOut, - amountInMaximum: amountIn, - }; - - calldatas.push( - Ethereum_Module.encodeFunction({ - method: routerAbi("exactOutput"), - args: [paramsToJsonString(exactOutputParams)], - }).unwrap() - ); - } - } - } - } - - // unwrap - if (routerMustCustody) { - if (options.fee !== null) { - if (outputIsNative) { - calldatas.push( - encodeUnwrapWETH9({ - amountMinimum: totalAmountOut.amount, - recipient: recipient, - feeOptions: options.fee, - }) - ); - } else { - calldatas.push( - encodeSweepToken({ - token: _wrapToken(sampleTrade.outputAmount.token), - amountMinimum: totalAmountOut.amount, - recipient: recipient, - feeOptions: options.fee, - }) - ); - } - } else { - calldatas.push( - encodeUnwrapWETH9({ - amountMinimum: totalAmountOut.amount, - recipient: recipient, - feeOptions: null, - }) - ); - } - } - - // refund - if (mustRefund) { - calldatas.push(encodeRefundETH({})); - } - - return { - calldata: encodeMulticall({ calldatas }), - value: toHex({ value: totalValue.amount }), - }; -} - -function routerAbi(methodName: string): string { - if (methodName == "exactInputSingle") { - return "function exactInputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) calldata params) external payable returns (uint256 amountOut)"; - } else if (methodName == "exactOutputSingle") { - return "function exactOutputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) calldata params) external payable returns (uint256 amountIn)"; - } else if (methodName == "exactInput") { - return "function exactInput(tuple(bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum) calldata params) external payable returns (uint256 amountOut)"; - } else if (methodName == "exactOutput") { - return "function exactOutput(tuple(bytes path, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum) calldata params) external payable returns (uint256 amountIn)"; - } else { - throw new Error("Invalid method name: " + methodName); - } -} - -function paramsToJsonString(params: T): string { - if (params instanceof ExactInputSingleParams) { - return `{ - "tokenIn": "${params.tokenIn}", - "tokenOut": "${params.tokenOut}", - "fee": ${params.fee}, - "recipient": "${params.recipient}", - "deadline": "${params.deadline}", - "amountIn": "${params.amountIn}", - "amountOutMinimum": "${params.amountOutMinimum}", - "sqrtPriceLimitX96": "${params.sqrtPriceLimitX96}" - }`; - } else if (params instanceof ExactOutputSingleParams) { - return `{ - "tokenIn": "${params.tokenIn}", - "tokenOut": "${params.tokenOut}", - "fee": ${params.fee}, - "recipient": "${params.recipient}", - "deadline": "${params.deadline}", - "amountOut": "${params.amountOut}", - "amountInMaximum": "${params.amountInMaximum}", - "sqrtPriceLimitX96": "${params.sqrtPriceLimitX96}" - }`; - } else if (params instanceof ExactInputParams) { - return `{ - "path": "${params.path}", - "recipient": "${params.recipient}", - "deadline": "${params.deadline}", - "amountIn": "${params.amountIn}", - "amountOutMinimum": "${params.amountOutMinimum}" - }`; - } else if (params instanceof ExactOutputParams) { - return `{ - "path": "${params.path}", - "recipient": "${params.recipient}", - "deadline": "${params.deadline}", - "amountOut": "${params.amountOut}", - "amountInMaximum": "${params.amountInMaximum}" - }`; - } else { - throw new Error("unknown router parameters type"); - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/router/utils.ts b/protocol/ethereum/uniswapv3/wrapper/src/router/utils.ts deleted file mode 100644 index a4ae61ef6..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/router/utils.ts +++ /dev/null @@ -1,219 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { - Ethereum_Module, - FeeOptions, - Args_encodeMulticall, - Args_encodePermit, - Args_encodeRouteToPath, - Args_encodeSweepToken, - Args_encodeUnwrapWETH9, - Args_toHex, - PermitOptions, - Pool, - Route, - Token, - Args_encodeRefundETH, -} from "../wrap"; -import { tokenEquals, _wrapToken } from "../token"; -import { - _getFeeAmount, - _getPermitV, - Fraction, - getChecksumAddress, -} from "../utils"; - -import { BigInt } from "@polywrap/wasm-as"; - -class EncodeRouteStep { - inToken: Token; - path: string[]; - types: string[]; -} - -/** - * Converts a big int to a hex string - * @param args.bigint - */ -export function toHex(args: Args_toHex): string { - const hex: string = args.value.toString(16); - if (hex.length % 2 != 0) { - return "0x0" + hex; - } - return "0x" + hex; -} - -/** - * Converts a route to a hex encoded path - * @param args.route the v3 path to convert to an encoded path - * @param args.exactOutput whether the route should be encoded in reverse, for making exact output swaps - */ -export function encodeRouteToPath(args: Args_encodeRouteToPath): string { - const route: Route = args.route; - const exactOutput = args.exactOutput; - - const finalStep: EncodeRouteStep = route.pools.reduce( - (step: EncodeRouteStep, pool: Pool, index): EncodeRouteStep => { - const outToken: Token = tokenEquals({ - tokenA: step.inToken, - tokenB: pool.token0, - }) - ? pool.token1 - : pool.token0; - const fee: string = _getFeeAmount(pool.fee).toString(); - - if (index === 0) { - return { - inToken: outToken, - types: ["address", "uint24", "address"], - path: [step.inToken.address, fee, outToken.address], - }; - } else { - return { - inToken: outToken, - types: step.types.concat(["uint24", "address"]), - path: step.path.concat([fee, outToken.address]), - }; - } - }, - { inToken: _wrapToken(route.input), path: [], types: [] } - ); - - if (exactOutput) { - finalStep.types.reverse(); - finalStep.path.reverse(); - } - - return Ethereum_Module.solidityPack({ - types: finalStep.types, - values: finalStep.path, - }).unwrap(); -} - -export function encodePermit(args: Args_encodePermit): string { - const token: Token = args.token; - const options: PermitOptions = args.options; - const isAllowedPermit: boolean = options.nonce !== null; - - return isAllowedPermit - ? Ethereum_Module.encodeFunction({ - method: selfPermitAbi("selfPermitAllowed"), - args: [ - token.address, - toHex({ value: options.nonce! }), - toHex({ value: options.expiry! }), - _getPermitV(options.v).toString(), - options.r, - options.s, - ], - }).unwrap() - : Ethereum_Module.encodeFunction({ - method: selfPermitAbi("selfPermit"), - args: [ - token.address, - toHex({ value: options.amount! }), - toHex({ value: options.deadline! }), - _getPermitV(options.v).toString(), - options.r, - options.s, - ], - }).unwrap(); -} - -export function encodeUnwrapWETH9(args: Args_encodeUnwrapWETH9): string { - const amountMinimum: BigInt = args.amountMinimum; - const recipient: string = getChecksumAddress(args.recipient); - const feeOptions: FeeOptions | null = args.feeOptions; - - if (feeOptions !== null) { - const feeBips: string = encodeFeeBips(feeOptions.fee); - const feeRecipient: string = getChecksumAddress(feeOptions.recipient); - - return Ethereum_Module.encodeFunction({ - method: paymentsAbi("unwrapWETH9WithFee"), - args: [toHex({ value: amountMinimum }), recipient, feeBips, feeRecipient], - }).unwrap(); - } else { - return Ethereum_Module.encodeFunction({ - method: paymentsAbi("unwrapWETH9"), - args: [toHex({ value: amountMinimum }), recipient], - }).unwrap(); - } -} - -export function encodeSweepToken(args: Args_encodeSweepToken): string { - const token: Token = args.token; - const amountMinimum: BigInt = args.amountMinimum; - const recipient: string = getChecksumAddress(args.recipient); - const feeOptions: FeeOptions | null = args.feeOptions; - - if (feeOptions !== null) { - const feeBips: string = encodeFeeBips(feeOptions.fee); - const feeRecipient: string = getChecksumAddress(feeOptions.recipient); - - return Ethereum_Module.encodeFunction({ - method: paymentsAbi("sweepTokenWithFee"), - args: [ - token.address, - toHex({ value: amountMinimum }), - recipient, - feeBips, - feeRecipient, - ], - }).unwrap(); - } else { - return Ethereum_Module.encodeFunction({ - method: paymentsAbi("sweepToken"), - args: [token.address, toHex({ value: amountMinimum }), recipient], - }).unwrap(); - } -} - -export function encodeRefundETH(_: Args_encodeRefundETH): string { - return Ethereum_Module.encodeFunction({ - method: paymentsAbi("refundETH"), - args: null, - }).unwrap(); -} - -export function encodeMulticall(args: Args_encodeMulticall): string { - const calldatas: string[] = args.calldatas; - return calldatas.length == 1 - ? calldatas[0] - : Ethereum_Module.encodeFunction({ - method: - "function multicall(bytes[] calldata data) external payable returns (bytes[] memory results)", - args: ['["' + calldatas.join('", "') + '"]'], - }).unwrap(); -} - -function selfPermitAbi(methodName: string): string { - if (methodName == "selfPermit") { - return "function selfPermit(address token, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external payable"; - } else if (methodName == "selfPermitAllowed") { - return "function selfPermitAllowed(address token, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external payable"; - } else { - throw new Error("Invalid method name: " + methodName); - } -} - -function encodeFeeBips(fee: string): string { - const feeFraction: Fraction = Fraction.fromString(fee); - const tenK: Fraction = new Fraction(BigInt.fromUInt32(10000)); - return toHex({ value: feeFraction.mul(tenK).quotient() }); -} - -function paymentsAbi(methodName: string): string { - if (methodName == "unwrapWETH9WithFee") { - return "function unwrapWETH9WithFee(uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) external payable"; - } else if (methodName == "unwrapWETH9") { - return "function unwrapWETH9(uint256 amountMinimum, address recipient) external payable"; - } else if (methodName == "sweepTokenWithFee") { - return "function sweepTokenWithFee(address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient) external payable"; - } else if (methodName == "sweepToken") { - return "function sweepToken(address token, uint256 amountMinimum, address recipient) external payable"; - } else if (methodName == "refundETH") { - return "function refundETH() external payable"; - } else { - throw new Error("Invalid method name: " + methodName); - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/schema.graphql b/protocol/ethereum/uniswapv3/wrapper/src/schema.graphql deleted file mode 100644 index 73e8402a0..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/schema.graphql +++ /dev/null @@ -1,1332 +0,0 @@ -#import { Module, TxResponse } into Ethereum from "wrap://ens/ethereum.polywrap.eth" -#import { Module } into SHA3 from "wrap://ens/sha3.polywrap.eth" -#import { Module } into Subgraph from "wrap://ens/graph-node.polywrap.eth" - -type Module { - """Call the approve(...) function of an ERC20 token contract on-chain, allowing the Uniswap router contract to transfer tokens""" - approve( - """Token for which to approve the Uniswap router contract to transfer""" - token: Token! - """The amount to approve for transfer; defaults to maximum amount if null""" - amount: BigInt - """Transaction gas configuration""" - gasOptions: GasOptions - ): Ethereum_TxResponse! - - """Send an Ethereum transaction to the given address""" - execCall( - """Transaction calldata and Ether value""" - parameters: MethodParameters! - """Address of the target Ethereum contract""" - address: String! - """Id of the chain on which to execute the transaction""" - chainId: ChainId! - """Transaction gas configuration""" - gasOptions: GasOptions - ): Ethereum_TxResponse! - - """Perform an on-chain swap with one or more trades in a single transaction""" - execSwap( - """Trades to encode into calldata""" - trades: [Trade!]! - """Swap configuration""" - swapOptions: SwapOptions! - """Transaction gas configuration""" - gasOptions: GasOptions - ): Ethereum_TxResponse! - - """Perform an on-chain swap within a single pool by using token and fee amount information to find the correct pool""" - swap( - """Input token of the pool""" - inToken: Token! - """Output token of the pool""" - outToken: Token! - """Fee amount of the pool being used for the swap""" - fee: FeeAmount! - """Amount being swapped in or out, depending on trade type""" - amount: BigInt! - """Type of trade, either exact input or exact output""" - tradeType: TradeType! - """Swap configuration""" - swapOptions: SwapOptions! - """Transaction gas configuration""" - gasOptions: GasOptions - ): Ethereum_TxResponse! - - """Perform an on-chain swap using a single pool at provided address; requires ERC20-compliant input and output (i.e. no Ether)""" - swapWithPool( - """Ethereum address of the pool used for the swap""" - address: String! - """Token amount being swapped in or out, depending on trade type""" - amount: TokenAmount! - """Type of trade, either exact input or exact output""" - tradeType: TradeType! - """Swap configuration""" - swapOptions: SwapOptions! - """Transaction gas configuration""" - gasOptions: GasOptions - ): Ethereum_TxResponse! - - """Deploy a pool contract on-chain""" - deployPool( - """A representation of the pool to deploy""" - pool: Pool! - """Transaction gas configuration""" - gasOptions: GasOptions - ): Ethereum_TxResponse! - - """Deploy a pool contract on chain for the given tokens and fee amount""" - deployPoolFromTokens( - """The first token of the pool, irrespective of sort order""" - tokenA: Token! - """The second token of the pool, irrespective of sort order""" - tokenB: Token! - """The fee tier of the pool""" - fee: FeeAmount! - """Transaction gas configuration""" - gasOptions: GasOptions - ): Ethereum_TxResponse! - ## Token - """Returns true if the currencies are equivalent, false otherwise""" - currencyEquals( - currencyA: Currency! - currencyB: Currency! - ): Boolean! - - """Returns true if the tokens are equivalent, false otherwise""" - tokenEquals( - tokenA: Token! - tokenB: Token! - ): Boolean! - - """Returns true if the token amounts are equivalent, false otherwise""" - tokenAmountEquals( - tokenAmountA: TokenAmount! - tokenAmountB: TokenAmount! - ): Boolean! - - """Returns true if the address of tokenA would precede the address of token B when sorted alphabetically""" - tokenSortsBefore( - tokenA: Token! - tokenB: Token! - ): Boolean! - - ## Token Utils - - """Returns a native token (e.g. Ether) on the specified chain""" - getNative( - chainId: ChainId! - ): Token! - - """Returns a wrapped native token (WETH or WMATIC) on the specified chain""" - getWrappedNative( - chainId: ChainId! - ): Token! - - """Returns true if the token is native (e.g. Ether), false otherwise. A token representing Ether must have an empty string in its address field.""" - isNative( - token: Token! - ): Boolean! - - """If the input token is Ether, the return value is Wrapped Ether; otherwise, the return value is the same as the input value.""" - wrapToken( - token: Token! - ): Token! - - """If the input token amount represents an amount of Ether, the return value represents the same amount in Wrapped Ether; otherwise, the return value is the same as the input value.""" - wrapAmount( - amount: TokenAmount! - ): TokenAmount! - - ## TickDataProvider - - """Validates a tick list, returning true of the tick list is valid. Throws an exception if the tick list is not valid.""" - validateTickList( - """A list of ticks to validate""" - ticks: [Tick!]! - """The tick spacing of the list""" - tickSpacing: Int32! - ): Boolean! - - """Returns the tick at the requested index""" - getTick( - """A list of ticks to search""" - tickDataProvider: [Tick!]! - """The tick index of the requested tick""" - tickIndex: Int32! - ): Tick! - - """Returns next initialized tick, or max or min tick. Returns true if a tick is found at index.""" - nextInitializedTickWithinOneWord( - """Tick list to search""" - tickDataProvider: [Tick!]! - """Current tick index""" - tick: Int32! - """True of returned tick index should be less than or equal to current tick index""" - lte: Boolean! - """Tick spacing of tick list""" - tickSpacing: Int32! - ): NextTickResult! - - ## Pool - - """Constructs and validates a Pool""" - createPool( - """The first token of the pool, irrespective of sort order""" - tokenA: Token! - """The second token of the pool, irrespective of sort order""" - tokenB: Token! - """Fee amount for swaps through the pool""" - fee: FeeAmount! - """Encoded representation of current swap price""" - sqrtRatioX96: BigInt! - """The total liquidity available in the pool""" - liquidity: BigInt! - """Current pool tick""" - tickCurrent: Int32! - """A validated list of all ticks in the pool""" - ticks: [Tick!] - ): Pool! - - """Returns the Ethereum address of the Pool contract""" - getPoolAddress( - """The first token of the pool, irrespective of sort order""" - tokenA: Token! - """The second token of the pool, irrespective of sort order""" - tokenB: Token! - """The fee tier of the pool""" - fee: FeeAmount! - """Override the init code hash used to compute the pool address if necessary""" - initCodeHashManualOverride: String - ): String! - - """Returns true if the token is in the Pool (i.e. pool.token0 or pool.token1)""" - poolInvolvesToken( - pool: Pool! - token: Token! - ): Boolean! - - """Returns the current mid price of the pool in terms of token0, i.e. the ratio of token1 over token0""" - poolToken0Price( - """The first token of the pool, i.e. pool.token0""" - token0: Token! - """The second token of the pool, i.e. pool.token1""" - token1: Token! - """Encoded representation of the current price in the pool, i.e. pool.sqrtRatioX96""" - sqrtRatioX96: BigInt! - ): Price! - - """Returns the current mid price of the pool in terms of token1, i.e. the ratio of token0 over token1""" - poolToken1Price( - """The first token of the pool, i.e. pool.token0""" - token0: Token! - """The second token of the pool, i.e. pool.token1""" - token1: Token! - """Encoded representation of the current price in the pool, i.e. pool.sqrtRatioX96""" - sqrtRatioX96: BigInt! - ): Price! - - """Returns the price of the given token in terms of the other token in the pool""" - poolPriceOf( - """Pool that involves the token""" - pool: Pool! - """The token to return the price of""" - token: Token! - ): Price! - - """Returns the chain ID of the tokens in the pool""" - poolChainId( - pool: Pool! - ): ChainId! - - """Given an input amount of a token, return the computed output amount, and a pool with state updated after the trade""" - getPoolOutputAmount( - """Pool that involves input and output tokens""" - pool: Pool! - """The input amount for which to quote the output amount""" - inputAmount: TokenAmount! - """The Q64.96 sqrt price limit""" - sqrtPriceLimitX96: BigInt - ): PoolChangeResult! - - """Given a desired output amount of a token, return the computed input amount and a pool with state updated after the trade""" - getPoolInputAmount( - """Pool that involves input and output tokens""" - pool: Pool! - """The output amount for which to quote the input amount""" - outputAmount: TokenAmount! - """The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this value after the swap. If one for zero, the price cannot be greater than this value after the swap.""" - sqrtPriceLimitX96: BigInt - ): PoolChangeResult! - - """Returns the tick spacing of ticks in the pool""" - getPoolTickSpacing( - pool: Pool! - ): Int32! - - ## Route - - """Constructs and validates a Route""" - createRoute( - """The ordered list of pools from which to construct the route""" - pools: [Pool!]! - """The input token""" - inToken: Token! - """The output token""" - outToken: Token! - ): Route! - - """Returns the chain id of the tokens in the route""" - routeChainId( - route: Route! - ): ChainId! - - """Returns the mid price of the route""" - routeMidPrice( - """The ordered list of pools from which to calculate the mid price""" - pools: [Pool!]! - """The input token""" - inToken: Token! - """The output token""" - outToken: Token! - ): Price! - - ## Trade - - """Constructs an exact in trade with the given amount in and route""" - createTradeExactIn( - """The route of the exact in trade and the amount being passed in""" - tradeRoute: TradeRoute! - ): Trade! - - """Constructs an exact out trade with the given amount out and route""" - createTradeExactOut( - """The route of the exact out trade and the amount returned""" - tradeRoute: TradeRoute! - ): Trade! - - """Constructs a trade by simulating swaps through the given route""" - createTradeFromRoute( - """The route to swap through and the amount specified, either input or output, depending on the trade type""" - tradeRoute: TradeRoute! - """Whether the trade is an exact input or exact output swap""" - tradeType: TradeType! - ): Trade! - - """Constructs a trade by simulating swaps through the given routes""" - createTradeFromRoutes( - """The routes to swap through and how much of the amount should be routed through each""" - tradeRoutes: [TradeRoute!]! - """Whether the trade is an exact input or exact output swap""" - tradeType: TradeType! - ): Trade! - - """Creates a trade without computing the result of swapping through the route. Useful when you have simulated the trade elsewhere and do not have any tick data""" - createUncheckedTrade( - """The route to swap through, the amount being passed in, and the amount returned when the trade is executed""" - swap: TradeSwap! - """The type of the trade, either exact in or exact out""" - tradeType: TradeType! - ): Trade! - - """Creates a trade without computing the result of swapping through the routes. Useful when you have simulated the trade elsewhere and do not have any tick data""" - createUncheckedTradeWithMultipleRoutes( - """The routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed""" - swaps: [TradeSwap!]! - """The type of the trade, either exact in or exact out""" - tradeType: TradeType! - ): Trade! - - """The input amount for the trade assuming no slippage""" - tradeInputAmount( - """The routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed""" - swaps: [TradeSwap!]! - ): TokenAmount! - - """The output amount for the trade assuming no slippage""" - tradeOutputAmount( - """The routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed""" - swaps: [TradeSwap!]! - ): TokenAmount! - - """The price expressed in terms of output amount/input amount""" - tradeExecutionPrice( - """The trade input amount, e.g. from Trade object or tradeInputAmount(...)""" - inputAmount: TokenAmount! - """The trade output amount, e.g. from Trade object or tradeOutputAmount(...)""" - outputAmount: TokenAmount! - ): Price! - - """Returns the percent difference between the route's mid price and the price impact""" - tradePriceImpact( - """The routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed""" - swaps: [TradeSwap!]! - """The trade output amount, e.g. from Trade object or tradeOutputAmount(...)""" - outputAmount: TokenAmount! - ): Fraction! - - """Get the minimum amount that must be received from the trade for the given slippage tolerance""" - tradeMinimumAmountOut( - """The tolerance of unfavorable slippage from the execution price of this trade; a decimal number between 0 and 1 (e.g. '0.03') that represents a percentage""" - slippageTolerance: String! - """The output amount of the trade, before slippage, e.g. from Trade object or tradeOutputAmount(...)""" - amountOut: TokenAmount! - """The type of the trade, either exact in or exact out""" - tradeType: TradeType! - ): TokenAmount! - - """Get the maximum amount in that can be spent via the trade for the given slippage tolerance""" - tradeMaximumAmountIn( - """The tolerance of unfavorable slippage from the execution price of this trade; a decimal number between 0 and 1 (e.g. '0.03') that represents a percentage""" - slippageTolerance: String! - """The input amount of the trade, before slippage, e.g. from Trade object or tradeInputAmount(...)""" - amountIn: TokenAmount! - """The type of the trade, either exact in or exact out""" - tradeType: TradeType! - ): TokenAmount! - - """Return the execution price after accounting for slippage tolerance""" - tradeWorstExecutionPrice( - """Trade for which to calculate execution price""" - trade: Trade! - """The allowed tolerated slippage""" - slippageTolerance: String! - ): Price! - - """ - Given a list of pools, and a fixed amount in, returns the top 'maxNumResults' trades that go from an input token - amount to an output token, making at most 'maxHops' hops. - Note this does not consider aggregation, as routes are linear. It's possible a better route exists by splitting - the amount in among multiple routes. - """ - bestTradeExactIn( - """The pools to consider in finding the best trade""" - pools: [Pool!]! - """Exact amount of input currency to spend""" - amountIn: TokenAmount! - """The desired currency out""" - tokenOut: Token! - """Options used when determining the best trade""" - options: BestTradeOptions - ): [Trade!]! - - """ - similar to bestTradeExactIn(...) but instead targets a fixed output amount - given a list of pools, and a fixed amount out, returns the top 'maxNumResults' trades that go from an input token - to an output token amount, making at most 'maxHops' hops - note this does not consider aggregation, as routes are linear. it's possible a better route exists by splitting - the amount in among multiple routes. - """ - bestTradeExactOut( - """The pools to consider in finding the best trade""" - pools: [Pool!]! - """The currency to spend""" - tokenIn: Token! - """The desired currency amount out""" - amountOut: TokenAmount! - """Options used when determining the best trade""" - options: BestTradeOptions - ): [Trade!]! - - ## Position - - """Constructs and validates a liquidity Position for a given Pool with the given liquidity""" - createPosition( - """For which pool the liquidity is assigned""" - pool: Pool! - """The lower tick of the position""" - tickLower: Int32! - """The upper tick of the position""" - tickUpper: Int32! - """The amount of liquidity that is in the position""" - liquidity: BigInt! - ): Position! - - """Computes the maximum amount of liquidity received for a given amount of token0, token1, and the prices at the tick boundaries""" - createPositionFromAmounts( - """The pool for which the position should be created""" - pool: Pool! - """The lower tick of the position""" - tickLower: Int32! - """The upper tick of the position""" - tickUpper: Int32! - """The amount of the first token of the pool""" - amount0: BigInt! - """The amount of the second token of the pool""" - amount1: BigInt! - """If false, liquidity will be maximized according to what the router can calculate, not what core can theoretically support""" - useFullPrecision: Boolean! - ): Position! - - """Computes a position with the maximum amount of liquidity received for a given amount of token0, assuming an unlimited amount of token1""" - createPositionFromAmount0( - """The pool for which the position should be created""" - pool: Pool! - """The lower tick of the position""" - tickLower: Int32! - """The upper tick of the position""" - tickUpper: Int32! - """The desired amount of token0""" - amount0: BigInt! - """If false, liquidity will be maximized according to what the router can calculate, not what core can theoretically support""" - useFullPrecision: Boolean! - ): Position! - - """Computes a position with the maximum amount of liquidity received for a given amount of token1, assuming an unlimited amount of token0. Always uses full precision.""" - createPositionFromAmount1( - """The pool for which the position should be created""" - pool: Pool! - """The lower tick of the position""" - tickLower: Int32! - """The upper tick of the position""" - tickUpper: Int32! - """The desired amount of token1""" - amount1: BigInt! - ): Position! - - """Returns the price of token0 at the lower tick""" - positionToken0PriceLower( - """The pool for which the liquidity is assigned""" - pool: Pool! - """The lower tick of the position""" - tickLower: Int32! - ): Price! - - """Returns the price of token0 at the upper tick""" - positionToken0PriceUpper( - """The pool for which the liquidity is assigned""" - pool: Pool! - """The upper tick of the position""" - tickUpper: Int32! - ): Price! - - """Returns the amount of token0 that this position's liquidity could be burned for at the current pool price""" - positionAmount0( - """For which pool the liquidity is assigned""" - pool: Pool! - """The lower tick of the position""" - tickLower: Int32! - """The upper tick of the position""" - tickUpper: Int32! - """The amount of liquidity that is in the position""" - liquidity: BigInt! - ): TokenAmount! - - """Returns the amount of token1 that this position's liquidity could be burned for at the current pool price""" - positionAmount1( - """For which pool the liquidity is assigned""" - pool: Pool! - """The lower tick of the position""" - tickLower: Int32! - """The upper tick of the position""" - tickUpper: Int32! - """The amount of liquidity that is in the position""" - liquidity: BigInt! - ): TokenAmount! - - """Returns the minimum amounts that must be sent in order to mint the amount of liquidity held by the position at the current price for the pool""" - mintAmounts( - """For which pool the liquidity is assigned""" - pool: Pool! - """The lower tick of the position""" - tickLower: Int32! - """The upper tick of the position""" - tickUpper: Int32! - """The amount of liquidity that is in the position""" - liquidity: BigInt! - ): MintAmounts! - - """Returns the minimum amounts that must be sent in order to safely mint the amount of liquidity held by the position with the given slippage tolerance""" - mintAmountsWithSlippage( - """Position for which to calculate mint amounts""" - position: Position! - """Tolerance of unfavorable slippage from the current price""" - slippageTolerance: String! - ): MintAmounts! - - """Returns the minimum amounts that should be requested in order to safely burn the amount of liquidity held by the position with the given slippage tolerance""" - burnAmountsWithSlippage( - """Position for which to calculate burn amounts""" - position: Position! - """Tolerance of unfavorable slippage from the current price""" - slippageTolerance: String! - ): MintAmounts! - - ## Router - - """Encodes arguments and returns transaction calldata to make a swap on an Uniswap's V3 Router contract""" - swapCallParameters( - """Trades for which to produce call parameters""" - trades: [Trade!]! - """Configuration options for the swap call""" - options: SwapOptions! - ): MethodParameters! - - ## Router Utils: Encode route, SelfPermit, Payments, MultiCall - - """Converts a route to a hex encoded path""" - encodeRouteToPath( - """The v3 path to convert to an encoded path""" - route: Route! - """Whether the route should be encoded in reverse, for making exact output swaps""" - exactOutput: Boolean! - ): String! - - """Encodes arguments and returns transaction calldata to call selfPermit or selfPermitAllowed on an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - encodePermit( - token: Token! - options: PermitOptions! - ): String! - - """Encodes arguments and returns transaction calldata to call unwrapWETH9 or unwrapWETH9WithFee on an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - encodeUnwrapWETH9( - amountMinimum: BigInt! - recipient: String! - feeOptions: FeeOptions - ): String! - - """Encodes arguments and returns transaction calldata to call sweepToken or sweepTokenWithFee on an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - encodeSweepToken( - token: Token! - amountMinimum: BigInt! - recipient: String! - feeOptions: FeeOptions - ): String! - - """Encodes arguments and returns transaction calldata to call refundEth on an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - encodeRefundETH: String! - - """Encodes multiple calldatas into a single calldata for making multiple calls in one transaction using a contract implementing the necessary interface, such as an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - encodeMulticall( - calldatas: [String!]! - ): String! - - ## Staker - - """Returns transaction calldata for calling 'unstakeToken', 'claimReward', and 'stakeToken' in a single transaction on Uniswap's Staker contract. - Note: A 'tokenId' can be staked in many programs but to claim rewards and continue the program you must unstake, claim, and then restake.""" - collectRewards( - """An array of IncentiveKeys that 'tokenId' is staked in; claims rewards for each program.""" - incentiveKeys: [IncentiveKey!]! - """ClaimOptions to specify tokenId, recipient, and amount wanting to collect. Note that you can only specify one amount and one recipient across the various programs if you are collecting from multiple programs at once.""" - options: ClaimOptions! - ): MethodParameters! - - """Returns transaction calldata for unstaking, claiming, and withdrawing in a single transaction on Uniswap's Staker contract.""" - withdrawToken( - """A list of incentiveKeys to unstake from. Should include all incentiveKeys (unique staking programs) that 'options.tokenId' is staked in.""" - incentiveKeys: [IncentiveKey!]! - """Options for producing claim calldata and withdraw calldata. Can't withdraw without unstaking all programs for 'tokenId'.""" - options: FullWithdrawOptions! - ): MethodParameters! - - """Returns an encoded IncentiveKey as a string""" - encodeDeposit( - """An array of IncentiveKeys to be encoded and used in the data parameter in 'safeTransferFrom'""" - incentiveKeys: [IncentiveKey!]! - ): String! - - ## Quoter - - """Produces the on-chain method name of the appropriate function within QuoterV2, and the relevant hex encoded parameters.""" - quoteCallParameters( - """The swap route, a list of pools through which a swap can occur""" - route: Route! - """The amount of the quote, either an amount in, or an amount out""" - amount: TokenAmount! - """The trade type, either exact input or exact output""" - tradeType: TradeType! - """Optional configuration""" - options: QuoteOptions - ): MethodParameters! - - ## NonfungiblePositionManager - - """Returns calldata for creating a pool on-chain using an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - createCallParameters( - """An off-chain representation of the pool to create on-chain""" - pool: Pool! - ): MethodParameters! - - """Returns calldata for minting or adding liquidity to a pool on-chain using an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol. Optionally creates the pool if it doesn't exist.""" - addCallParameters( - """Liquidity position to add to pool""" - position: Position! - """Required transaction configuration""" - options: AddLiquidityOptions! - ): MethodParameters! - - """Returns calldata for collecting liquidity provider rewards using an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - collectCallParameters( - """Required transaction configuration""" - options: CollectOptions! - ): MethodParameters! - - """Returns calldata for completely or partially exiting a liquidity position using an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - removeCallParameters( - """The position to exit""" - position: Position! - """Additional information necessary for generating the calldata""" - options: RemoveLiquidityOptions! - ): MethodParameters! - - """Returns calldata for safely transferring an NFT using an instance of Uniswap's NonfungiblePositionManager contract: https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol""" - safeTransferFromParameters( - """Required transaction configuration""" - options: SafeTransferOptions! - ): MethodParameters! - - ## Utils - - """Converts a big int to a hex string""" - toHex( - value: BigInt! - ): String! - - """Computes a pool address""" - computePoolAddress( - """The Uniswap V3 factory address""" - factoryAddress: String! - """The first token of the pool, irrespective of sort order""" - tokenA: Token! - """The second token of the pool, irrespective of sort order""" - tokenB: Token! - """The fee tier of the pool""" - fee: FeeAmount! - """Override the init code hash used to compute the pool address if necessary""" - initCodeHashManualOverride: String - ): String! - - """Returns the sqrt ratio as a Q64.96 corresponding to a given ratio of amount1 and amount0""" - encodeSqrtRatioX96( - """The numerator amount i.e., the amount of token1""" - amount1: BigInt! - """The denominator amount i.e., the amount of token0""" - amount0: BigInt! - ): BigInt! - - """Returns (a * b) / denominator""" - mulDivRoundingUp( - a: BigInt! - b: BigInt! - denominator: BigInt! - ): BigInt! - - """Returns x + y""" - addDelta( - x: BigInt! - y: BigInt! - ): BigInt! - - """Computes the maximum amount of liquidity received for a given amount of token0, token1, and the prices at the tick boundaries.""" - maxLiquidityForAmounts( - """Encoded representation of the current price""" - sqrtRatioCurrentX96: BigInt! - """Encoded representation of the price at lower tick boundary""" - sqrtRatioAX96: BigInt! - """Encoded representation of the price at upper tick boundary""" - sqrtRatioBX96: BigInt! - """Amount for the first token of the pool""" - amount0: BigInt! - """Amount for the second token of the pool""" - amount1: BigInt! - """If false, liquidity will be maximized according to what the router can calculate, not what core can theoretically support""" - useFullPrecision: Boolean! - ): BigInt! - - """Returns the most significant bit of a positive integer, starting with first bit = 0""" - mostSignificantBit( - x: BigInt! - ): UInt32! - - """Returns the closest tick that is nearest a given tick and usable for the given tick spacing""" - nearestUsableTick( - """The target tick""" - tick: Int32! - """The spacing of the pool""" - tickSpacing: Int32! - ): Int32! - - """Returns a price object corresponding to the input tick and the base/quote token. Inputs must be tokens because the address order is used to interpret the price represented by the tick.""" - tickToPrice( - """The base token of the price""" - baseToken: Token! - """The quote token of the price""" - quoteToken: Token! - """The tick for which to return the price""" - tick: Int32! - ): Price! - - """Returns the first tick for which the given price is greater than or equal to the tick price.""" - priceToClosestTick( - """Price for which to return the closest tick that represents a price less than or equal to the input price, i.e. the price of the returned tick is less than or equal to the input price. - Note that a string price is not used as input here, so the 'price' property of the Price type can have any value without affecting the results.""" - price: Price! - ): Int32! - - """Used to facilitate liquidity math using sqrtRatioX96 values""" - getAmount0Delta( - sqrtRatioAX96: BigInt! - sqrtRatioBX96: BigInt! - liquidity: BigInt! - roundUp: Boolean! - ): BigInt! - - """Used to facilitate liquidity math using sqrtRatioX96 values""" - getAmount1Delta( - sqrtRatioAX96: BigInt! - sqrtRatioBX96: BigInt! - liquidity: BigInt! - roundUp: Boolean! - ): BigInt! - - """Used to facilitate liquidity math using sqrtRatioX96 values""" - getNextSqrtPriceFromInput( - sqrtPX96: BigInt! - liquidity: BigInt! - amountIn: BigInt! - zeroForOne: Boolean! - ): BigInt! - - """Used to facilitate liquidity math using sqrtRatioX96 values""" - getNextSqrtPriceFromOutput( - sqrtPX96: BigInt! - liquidity: BigInt! - amountOut: BigInt! - zeroForOne: Boolean! - ): BigInt! - - """Returns true if the tick index is smaller than all tick indices in the list""" - tickIsBelowSmallest( - """Tick list to check""" - ticks: [Tick!]! - """Input tick index""" - tick: Int32! - ): Boolean! - - """Returns true if the tick index is greater than or equal to all tick indices in the list""" - tickIsAtOrAboveLargest( - """Tick list to check""" - ticks: [Tick!]! - """Input tick index""" - tick: Int32! - ): Boolean! - - """Returns next initialized tick following the input tick""" - nextInitializedTick( - """Tick list to check""" - ticks: [Tick!]! - """Input tick index""" - tick: Int32! - """If true, searches list for next initialized tick that has index less than or equal to the input tick index""" - lte: Boolean! - ): Tick! - - """Returns true if a tick list is sorted by tick index""" - tickListIsSorted( - """The tick list""" - ticks: [Tick!]! - ): Boolean! - - """Returns the sqrt ratio as a Q64.96 for the given tick. The sqrt ratio is computed as sqrt(1.0001)^tick""" - getSqrtRatioAtTick( - """The tick for which to compute the sqrt ratio""" - tick: Int32! - ): BigInt! - - """Returns the tick corresponding to a given sqrt ratio, such that getSqrtRatioAtTick(tick) <= sqrtRatioX96 and getSqrtRatioAtTick(tick + 1) > sqrtRatioX96""" - getTickAtSqrtRatio( - """The sqrt ratio as a Q64.96 for which to compute the tick""" - sqrtRatioX96: BigInt! - ): Int32! - - ## Fetch - - """Returns token object constructed from the on-chain token contract at the given address""" - fetchToken( - """The Ethereum address of token's ERC20 contract""" - address: String! - """The id of the chain to be queried""" - chainId: ChainId! - ): Token! - - """Returns pool object constructed from the on-chain pool contract associated with the tokens and fee amount""" - fetchPoolFromTokens( - """A token in the pool""" - tokenA: Token! - """The other token in the pool""" - tokenB: Token! - """The pool's fee amount""" - fee: FeeAmount! - """If true, the full list of pool ticks will be fetched""" - fetchTicks: Boolean! - ): Pool! - - """Returns pool object constructed from the on-chain pool contract at the given address""" - fetchPoolFromAddress( - """The Ethereum address of the pool contract""" - address: String! - """The id of the chain to be queried""" - chainId: ChainId! - """If true, the full list of pool ticks will be fetched""" - fetchTicks: Boolean! - ): Pool! - - """Returns array of ticks from the on-chain pool contract at the given address""" - fetchTickList( - """The Ethereum address of the pool contract""" - address: String! - """The id of the chain to be queried""" - chainId: ChainId! - ): [Tick!]! - - ## Enum Utils - - """Returns the tick spacing associated with a FeeAmount enum value""" - feeAmountToTickSpacing( - feeAmount: FeeAmount! - ): Int32! - - """Returns the fee (in one-hundred-thousandths of a percent) associated with a FeeAmount enum value""" - getFeeAmount( - feeAmount: FeeAmount! - ): UInt32! - - """Returns v value associated with a PermitV enum value""" - getPermitV( - permitV: PermitV! - ): Int32! - - """The address of Uniswap's pool factory contract""" - FACTORY_ADDRESS: String! - - """Pool creation byte code hash used for computing pool address""" - POOL_INIT_CODE_HASH: String! - - """Smallest valid tick index in a pool""" - MIN_TICK: Int32! - - """Largest valid tick index in a pool""" - MAX_TICK: Int32! - - """Smallest valid sqrtRatioX96 in a pool""" - MIN_SQRT_RATIO: BigInt! - - """Largest valid sqrtRatioX96 in a pool""" - MAX_SQRT_RATIO: BigInt! -} - - -"""Ethereum chain supported by the wrapper""" -enum ChainId { - MAINNET - ROPSTEN - RINKEBY - GOERLI - KOVAN - OPTIMISM - OPTIMISTIC_KOVAN - ARBITRUM_ONE - ARBITRUM_RINKEBY - POLYGON - POLYGON_MUMBAI -} - -"""Pool swap fee amount""" -enum FeeAmount { - LOWEST - LOW - MEDIUM - HIGH -} - -"""Type of trade, either exact input or exact output""" -enum TradeType { - EXACT_INPUT - EXACT_OUTPUT -} - -"""Valid v value of Permit""" -enum PermitV { - v_0 - v_1 - v_27 - v_28 -} - -"""ERC20-compliant token or Ether""" -type Token { - """Id of chain where token exists""" - chainId: ChainId! - """Address of token's ERC20 contract""" - address: String! - """Token description""" - currency: Currency! -} - -"""Describes a token""" -type Currency { - """Token decimals""" - decimals: UInt8! - """Token symbol""" - symbol: String - """Token name""" - name: String -} - -"""Represents price of a token in terms of another token. When used as a function argument, the 'price' property is ignored.""" -type Price { - """The base token of the price""" - baseToken: Token! - """The quote token of the price""" - quoteToken: Token! - """Amount of base token used to calculate price""" - denominator: BigInt! - """Amount of quote token used to calculate price""" - numerator: BigInt! - """A decimal string representation of the price""" - price: String! -} - -"""Represents fraction, typically a percent.""" -type Fraction { - """Numerator of fraction""" - numerator: BigInt! - """Denominator of fraction""" - denominator: BigInt! - """A decimal string representation of the fraction""" - quotient: String! -} - -"""An amount of a token""" -type TokenAmount { - """Token""" - token: Token! - """Raw amount of the token, not adjusted for the token's decimals""" - amount: BigInt! -} - -"""A pool tick marks a section of the price curve. A liquidity provider may hold a position on a tick, rather than the full curve.""" -type Tick { - """Tick index""" - index: Int32! - """Gross liquidity in Pool at tick position""" - liquidityGross: BigInt! - """Net liquidity in Pool at tick position""" - liquidityNet: BigInt! -} - -"""A liquidity pool involving two tokens which can be exchanged for a price determined by a price curve and market dynamics""" -type Pool { - """The first token of the pool""" - token0: Token! - """The second token of the pool""" - token1: Token! - """The fee amount liquidity providers receive as a share of swaps made in the pool""" - fee: FeeAmount! - """An encoded representation of the current swap price""" - sqrtRatioX96: BigInt! - """The total liquidity available in the pool""" - liquidity: BigInt! - """The current tick""" - tickCurrent: Int32! - """A list of all ticks in the pool""" - tickDataProvider: [Tick!]! - """The current mid price of the pool in terms of token0, i.e. the ratio of token1 over token0""" - token0Price: Price! - """The current mid price of the pool in terms of token1, i.e. the ratio of token0 over token1""" - token1Price: Price! -} - -"""An ordered path of pools through which a swap can occur""" -type Route { - """A list of pools, wherein each pool in the list has a token in common with its adjacent pool(s)""" - pools: [Pool!]! - """The path of tokens that are swapped through the pools""" - path: [Token!]! - """The input token, where the route begins""" - input: Token! - """The output token, where the route ends""" - output: Token! - """The mid price of the output token, in terms of the input token, for this route""" - midPrice: Price! -} - -"""Options used when determining the best trade in bestTradeExactIn(...) and bestTradeExactOut(...)""" -type BestTradeOptions { - """Maximum number of results to return""" - maxNumResults: UInt32 - """Maximum number of hops a returned trade can make, e.g. 1 hop goes through a single pool""" - maxHops: UInt32 -} - -"""A route, input, and output amount that compose the core elements of a trade""" -type TradeSwap { - """The route of the trade""" - route: Route! - """The amount being passed in""" - inputAmount: TokenAmount! - """The amount returned by the trade when executed""" - outputAmount: TokenAmount! -} - -"""A trade contains the information necessary to create an on-chain exchange of tokens""" -type Trade { - """A list of swaps to be executed atomically, all of which must have the same input and output tokens""" - swaps: [TradeSwap!]! - """Type of trade, either exact input or exact output""" - tradeType: TradeType! - """The total input amount (sum of input amounts in swaps)""" - inputAmount: TokenAmount! - """The total output amount (sum of output amounts in swaps)""" - outputAmount: TokenAmount! - """The price of the trade, in terms of the input token""" - executionPrice: Price! - """The percent difference between the route's mid price and the price impact""" - priceImpact: Fraction! -} - -"""The minimum amounts that must be sent in order to mint the amount of liquidity held by the position at the current price for the pool""" -type MintAmounts { - """Amount of the first token in the pool""" - amount0: BigInt! - """Amount of the second token in the pool""" - amount1: BigInt! -} - -"""A liquidity position between two ticks in a pool""" -type Position { - """The pool on which the position is held""" - pool: Pool! - """The lower tick, marking the lower boundary of the position""" - tickLower: Int32! - """The upper tick, marking the upper boundary of the position""" - tickUpper: Int32! - """The maximum amount of liquidity received for a given amount of token0, token1, and the prices at the tick boundaries""" - liquidity: BigInt! - """The amount in this position of the first token of the pool""" - token0Amount: TokenAmount! - """The amount in this position of the second token of the pool""" - token1Amount: TokenAmount! - """The minimum amounts that must be sent in order to mint the amount of liquidity held by the position at the current price for the pool""" - mintAmounts: MintAmounts! - """The price of token0 at the lower tick""" - token0PriceLower: Price! - """The price of token0 at the upper tick""" - token0PriceUpper: Price! -} - -#type StandardPermitArguments { -# v: PermitV! -# r: String! -# s: String! -# amount: BigInt! -# deadline: BigInt! -#} -# -#type AllowedPermitArguments { -# v: PermitV! -# r: String! -# s: String! -# nonce: BigInt! -# expiry: BigInt! -#} - -# TODO: Use a union type once union type support is merged -"""Parameters for a permit allowing the transfer of tokens. Either amount and deadline OR nonce and expiry are required.""" -type PermitOptions { - v: PermitV! - r: String! - s: String! - amount: BigInt - deadline: BigInt - nonce: BigInt - expiry: BigInt -} - -"""Fee configuration for encodeUnwrapWETH9(...) and encodeSweepToken(...)""" -type FeeOptions { - """The percent of the output that will be taken as a fee.""" - fee: String! - """The recipient of the fee.""" - recipient: String! -} - -"""Configuration for creating swap transaction calldata using swapCallParameters(...)""" -type SwapOptions { - """How much the execution price is allowed to move unfavorably from the trade execution price.""" - slippageTolerance: String! - """The account that should receive the output.""" - recipient: String! - """When the transaction expires, in epoch seconds.""" - deadline: BigInt! - """The optional permit parameters for spending the input.""" - inputTokenPermit: PermitOptions - """The optional price limit for the trade.""" - sqrtPriceLimitX96: BigInt - """Optional information for taking a fee on output.""" - fee: FeeOptions -} - -"""Transaction calldata and an ether value to be sent with the transaction""" -type MethodParameters { - """The hex encoded calldata to perform the given operation""" - calldata: String! - """The amount of ether (wei) to send in hex.""" - value: String! -} - -"""Transaction gas configuration""" -type GasOptions { - """The gas price to set for the transaction""" - gasPrice: BigInt - """The gas limit to set for the transaction""" - gasLimit: BigInt -} - -"""Return value of nextInitializedTickWithinOneWord(...)""" -type NextTickResult { - """Tick index of returned next tick""" - index: Int32! - """True if the returned tick index represents an initialized tick, or false if max or min tick are returned instead""" - found: Boolean! -} - -"""Input or output amount and next pool state; return value of getPoolInputAmount(...) and getPoolOutputAmount(...)""" -type PoolChangeResult { - """input or output amount resulting from simulated swap""" - amount: TokenAmount! - """Pool state after simulated swap""" - nextPool: Pool! -} - -"""Input used to create a trade""" -type TradeRoute { - """The route of the trade""" - route: Route! - """The amount being passed in or out, depending on the trade type""" - amount: TokenAmount! -} - -"""Represents a unique staking program.""" -type IncentiveKey { - """The token rewarded for participating in the staking program.""" - rewardToken: Token! - """The pool that the staked positions must provide in.""" - pool: Pool! - """The time when the incentive program begins.""" - startTime: BigInt! - """The time that the incentive program ends.""" - endTime: BigInt! - """The address which receives any remaining reward tokens at 'endTime'.""" - refundee: String! -} - -"""Options to specify when claiming rewards.""" -type ClaimOptions { - """The id of the NFT""" - tokenId: BigInt! - """Address to send rewards to.""" - recipient: String! - """The amount of 'rewardToken' to claim. 0 claims all.""" - amount: BigInt -} - -"""Options to specify when withdrawing tokens""" -type FullWithdrawOptions implements ClaimOptions { - """Set when withdrawing. The position will be sent to 'owner' on withdraw.""" - owner: String! - """Set when withdrawing. 'data' is passed to 'safeTransferFrom' when transferring the position from contract back to owner.""" - data: String -} - -"""Optional arguments to send to the quoter.""" -type QuoteOptions { - """The optional price limit for the trade.""" - sqrtPriceLimitX96: BigInt -} - -"""Options for producing the calldata to add liquidity.""" -type CommonAddLiquidityOptions { - """How much the pool price is allowed to move.""" - slippageTolerance: String! - """When the transaction expires, in epoch seconds.""" - deadline: BigInt! - """Whether to spend ether. If true, one of the pool tokens must be WETH, by default false""" - useNative: Token - """The optional permit parameters for spending token0""" - token0Permit: PermitOptions - """The optional permit parameters for spending token1""" - token1Permit: PermitOptions -} - -#type MintOptions implements CommonAddLiquidityOptions { -# recipient: String! # The account that should receive the minted NFT. -# createPool: Boolean # Creates pool if not initialized before mint. -#} -# -#type IncreaseOptions implements CommonAddLiquidityOptions { -# tokenId: BigInt! # Indicates the ID of the position to increase liquidity for. -#} - -# TODO: Use union type once union type support is merged -"""Union of MintOptions and IncreaseOptions; one of either recipient or tokenId is required.""" -type AddLiquidityOptions implements CommonAddLiquidityOptions { - """The account that should receive the minted NFT.""" - recipient: String - """Creates pool if not initialized before mint. Ignored if recipient is not null.""" - createPool: Boolean - """Indicates the ID of the position to increase liquidity for. Ignored if recipient is not null.""" - tokenId: BigInt -} - -"""Options to specify when calling safeTransferFrom(...) to transfer an NFT""" -type SafeTransferOptions { - """The account sending the NFT.""" - sender: String! - """The account that should receive the NFT.""" - recipient: String! - """The id of the token being sent.""" - tokenId: BigInt! - """The optional parameter that passes data to the 'onERC721Received' call for the staker""" - data: String -} - -"""Options to specify when calling collectCallParameters(...) to collect liquidity provider rewards or removeCallParameters(...) to exit a liquidity position.""" -type CollectOptions { - """Indicates the ID of the position to collect for. Ignored when CollectOptions is as property of RemoveLiquidityOptions for use in removeCallParameters(...).""" - tokenId: BigInt! - """Expected value of tokensOwed0, including as-of-yet-unaccounted-for fees/liquidity value to be burned""" - expectedCurrencyOwed0: TokenAmount! - """Expected value of tokensOwed1, including as-of-yet-unaccounted-for fees/liquidity value to be burned""" - expectedCurrencyOwed1: TokenAmount! - """The account that should receive the tokens.""" - recipient: String! -} - -"""Permission parameters for NFT transfers, in case the transaction is being sent by an account that does not own the NFT""" -type NFTPermitOptions { - v: PermitV! - r: String! - s: String! - deadline: BigInt! - spender: String! -} - -"""Options for producing the calldata to exit a position.""" -type RemoveLiquidityOptions { - """The ID of the token to exit""" - tokenId: BigInt! - """The percentage of position liquidity to exit.""" - liquidityPercentage: String! - """How much the pool price is allowed to move.""" - slippageTolerance: String! - """When the transaction expires, in epoch seconds.""" - deadline: BigInt! - """Whether the NFT should be burned if the entire position is being exited, by default false.""" - burnToken: Boolean - """The optional permit of the token ID being exited, in case the exit transaction is being sent by an account that does not own the NFT""" - permit: NFTPermitOptions - """Parameters to be passed on to collect; tokenId is ignored.""" - collectOptions: CollectOptions! -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/swap/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/swap/index.ts deleted file mode 100644 index 3650fa8ca..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/swap/index.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { - Ethereum_TxResponse, - FeeAmount, - GasOptions, - Args_execSwap, - Args_swap, - Args_swapWithPool, - MethodParameters, - Pool, - Route, - SwapOptions, - Token, - TokenAmount, - Trade, - TradeType, -} from "../wrap"; -import { ROUTER_ADDRESS, execCall, fetchPoolFromAddress } from "../utils"; -import { _wrapToken, tokenEquals } from "../token"; -import { swapCallParameters } from "../router"; -import { createRoute } from "../route"; -import { getPoolAddress } from "../pool"; -import { createTradeExactIn, createTradeExactOut } from "../trade"; - -import { BigInt } from "@polywrap/wasm-as"; - -export function execSwap(args: Args_execSwap): Ethereum_TxResponse { - const trades: Trade[] = args.trades; - const swapOptions: SwapOptions = args.swapOptions; - const gasOptions: GasOptions | null = args.gasOptions; - - const parameters: MethodParameters = swapCallParameters({ - trades, - options: swapOptions, - }); - return execCall({ - parameters, - address: ROUTER_ADDRESS, - chainId: args.trades[0].inputAmount.token.chainId, - gasOptions, - }); -} - -export function swap(args: Args_swap): Ethereum_TxResponse { - const inToken: Token = args.inToken; - const outToken: Token = args.outToken; - const fee: FeeAmount = args.fee; - const amountNum: BigInt = args.amount; - const tradeType: TradeType = args.tradeType; - const swapOptions: SwapOptions = args.swapOptions; - const gasOptions: GasOptions | null = args.gasOptions; - - const address: string = getPoolAddress({ - tokenA: _wrapToken(inToken), - tokenB: _wrapToken(outToken), - fee: fee, - initCodeHashManualOverride: null, - }); - const pool: Pool = fetchPoolFromAddress({ - chainId: inToken.chainId, - address: address, - fetchTicks: true, - }); - const route: Route = createRoute({ - pools: [pool], - inToken, - outToken, - }); - - let trade: Trade; - if (tradeType == TradeType.EXACT_INPUT) { - trade = createTradeExactIn({ - tradeRoute: { - route, - amount: { - token: inToken, - amount: amountNum, - }, - }, - }); - } else { - trade = createTradeExactOut({ - tradeRoute: { - route, - amount: { - token: outToken, - amount: amountNum, - }, - }, - }); - } - return execSwap({ - trades: [trade], - swapOptions: swapOptions, - gasOptions: gasOptions, - }); -} - -export function swapWithPool(args: Args_swapWithPool): Ethereum_TxResponse { - const address: string = args.address; - const amount: TokenAmount = args.amount; - const tradeType: TradeType = args.tradeType; - const swapOptions: SwapOptions = args.swapOptions; - const gasOptions: GasOptions | null = args.gasOptions; - - const pool: Pool = fetchPoolFromAddress({ - chainId: amount.token.chainId, - address: address, - fetchTicks: true, - }); - const dependentToken = tokenEquals({ - tokenA: amount.token, - tokenB: pool.token0, - }) - ? pool.token1 - : pool.token0; - - let trade: Trade; - if (tradeType == TradeType.EXACT_INPUT) { - trade = createTradeExactIn({ - tradeRoute: { - route: createRoute({ - pools: [pool], - inToken: amount.token, - outToken: dependentToken, - }), - amount, - }, - }); - } else { - trade = createTradeExactOut({ - tradeRoute: { - route: createRoute({ - pools: [pool], - inToken: dependentToken, - outToken: amount.token, - }), - amount, - }, - }); - } - - return execSwap({ - trades: [trade], - swapOptions: swapOptions, - gasOptions: gasOptions, - }); -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/tickList/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/tickList/index.ts deleted file mode 100644 index f246f0243..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/tickList/index.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { - Args_getTick, - Args_nextInitializedTickWithinOneWord, - NextTickResult, - Tick, -} from "../wrap"; -import * as TickListUtils from "./utils"; - -export * from "./utils"; -export * from "./tickUtils"; - -/** - * returns tick at requested index - */ -export function getTick(args: Args_getTick): Tick { - const tickIndex: i32 = args.tickIndex; - const ticks: Tick[] = args.tickDataProvider; - return TickListUtils.findTick(ticks, tickIndex); -} - -/** - * returns next initialized tick, or max or min tick. Returns true if a tick is found at index - */ -export function nextInitializedTickWithinOneWord( - args: Args_nextInitializedTickWithinOneWord -): NextTickResult { - const tick: i32 = args.tick; - const lte = args.lte; - const tickSpacing: i32 = args.tickSpacing; - const ticks: Tick[] = args.tickDataProvider; - - const compressed: i32 = Math.floor(tick / tickSpacing); - - if (lte) { - const wordPos: i32 = compressed >> 8; - const minimum: i32 = (wordPos << 8) * tickSpacing; - - if (TickListUtils.tickIsBelowSmallest({ ticks: ticks, tick: tick })) { - return { - index: minimum, - found: false, - }; - } - - const index: i32 = TickListUtils.nextInitializedTick({ - ticks: ticks, - tick: tick, - lte: lte, - }).index; - const nextInitializedTick: i32 = index > minimum ? index : minimum; - return { - index: nextInitializedTick, - found: nextInitializedTick == index, - }; - } else { - const wordPos = (compressed + 1) >> 8; - const maximum = ((wordPos + 1) << 8) * tickSpacing - 1; - - if (TickListUtils.tickIsAtOrAboveLargest({ ticks: ticks, tick: tick })) { - return { - index: maximum, - found: false, - }; - } - - const index: i32 = TickListUtils.nextInitializedTick({ - ticks: ticks, - tick: tick, - lte: lte, - }).index; - const nextInitializedTick = maximum < index ? maximum : index; - return { - index: nextInitializedTick, - found: nextInitializedTick == index, - }; - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/tickList/tickUtils.ts b/protocol/ethereum/uniswapv3/wrapper/src/tickList/tickUtils.ts deleted file mode 100644 index 0346df569..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/tickList/tickUtils.ts +++ /dev/null @@ -1,247 +0,0 @@ -import { - Args_getSqrtRatioAtTick, - Args_getTickAtSqrtRatio, - Args_nearestUsableTick, - Args_priceToClosestTick, - Args_tickToPrice, - Price as PriceType, - Token, -} from "../wrap"; -import { tokenSortsBefore } from "../token"; -import { - mostSignificantBit, - encodeSqrtRatioX96, - Price, - _MAX_SQRT_RATIO, - _MAX_TICK, - MAX_UINT_256, - _MIN_SQRT_RATIO, - _MIN_TICK, - Q192, - Q32, -} from "../utils"; - -import { BigInt } from "@polywrap/wasm-as"; - -/** - * Returns the closest tick that is nearest a given tick and usable for the given tick spacing - * @param args.tick the target tick - * @param args.tickSpacing the spacing of the pool - */ -export function nearestUsableTick(args: Args_nearestUsableTick): i32 { - const tick: i32 = args.tick; - const tickSpacing: i32 = args.tickSpacing; - if (tickSpacing <= 0) { - throw new Error("TICK_SPACING: tick spacing must be greater than 0"); - } - if (tick < _MIN_TICK || tick > _MAX_TICK) { - throw new Error( - `TICK_BOUND: tick index is out of range ${_MIN_TICK} to ${_MAX_TICK}` - ); - } - - const rounded: i32 = Math.round(tick / tickSpacing) * tickSpacing; - - if (rounded < _MIN_TICK) return rounded + tickSpacing; - else if (rounded > _MAX_TICK) return rounded - tickSpacing; - else return rounded; -} - -/** - * Returns a price object corresponding to the input tick and the base/quote token. Inputs must be tokens because the address order is used to interpret the price represented by the tick. - * @param args.baseToken the base token of the price - * @param args.quoteToken the quote token of the price - * @param args.tick the tick for which to return the price - */ -export function tickToPrice(args: Args_tickToPrice): PriceType { - return _tickToPrice(args).toPriceType(); -} - -function _tickToPrice(args: Args_tickToPrice): Price { - const baseToken: Token = args.baseToken; - const quoteToken: Token = args.quoteToken; - const tick: i32 = args.tick; - - const sqrtRatioX96: BigInt = getSqrtRatioAtTick({ tick: tick }); - const ratioX192: BigInt = BigInt.mul(sqrtRatioX96, sqrtRatioX96); - - return tokenSortsBefore({ tokenA: baseToken, tokenB: quoteToken }) - ? new Price(baseToken, quoteToken, Q192, ratioX192) - : new Price(baseToken, quoteToken, ratioX192, Q192); -} - -/** - * Returns the first tick for which the given price is greater than or equal to the tick price - * @param args.price price for which to return the closest tick that represents a price less than or equal to the input price, i.e. the price of the returned tick is less than or equal to the input price - */ -export function priceToClosestTick(args: Args_priceToClosestTick): i32 { - const price: Price = new Price( - args.price.baseToken, - args.price.quoteToken, - args.price.denominator, - args.price.numerator - ); - - const sorted: boolean = tokenSortsBefore({ - tokenA: price.baseToken, - tokenB: price.quoteToken, - }); - - const sqrtRatioX96: BigInt = sorted - ? encodeSqrtRatioX96({ - amount1: price.numerator, - amount0: price.denominator, - }) - : encodeSqrtRatioX96({ - amount1: price.denominator, - amount0: price.numerator, - }); - - let tick: i32 = getTickAtSqrtRatio({ sqrtRatioX96: sqrtRatioX96 }); - const nextTickPrice: Price = _tickToPrice({ - baseToken: price.baseToken, - quoteToken: price.quoteToken, - tick: tick + 1, - }); - if (sorted) { - if (!price.lt(nextTickPrice)) { - tick++; - } - } else { - if (!price.gt(nextTickPrice)) { - tick++; - } - } - return tick; -} - -/** - * Returns the sqrt ratio as a Q64.96 for the given tick. The sqrt ratio is computed as sqrt(1.0001)^tick - * @param args.tick the tick for which to compute the sqrt ratio - */ -export function getSqrtRatioAtTick(args: Args_getSqrtRatioAtTick): BigInt { - const tick: i32 = args.tick; - if (tick < _MIN_TICK || tick > _MAX_TICK) { - throw new Error( - `TICK_BOUND: tick index is out of range ${_MIN_TICK} to ${_MAX_TICK}` - ); - } - const absTick: i32 = tick < 0 ? tick * -1 : tick; - - let ratio: BigInt = - (absTick & 0x1) != 0 - ? BigInt.fromString("fffcb933bd6fad37aa2d162d1a594001", 16) - : BigInt.fromString("100000000000000000000000000000000", 16); - if ((absTick & 0x2) != 0) - ratio = mulShift(ratio, "fff97272373d413259a46990580e213a"); - if ((absTick & 0x4) != 0) - ratio = mulShift(ratio, "fff2e50f5f656932ef12357cf3c7fdcc"); - if ((absTick & 0x8) != 0) - ratio = mulShift(ratio, "ffe5caca7e10e4e61c3624eaa0941cd0"); - if ((absTick & 0x10) != 0) - ratio = mulShift(ratio, "ffcb9843d60f6159c9db58835c926644"); - if ((absTick & 0x20) != 0) - ratio = mulShift(ratio, "ff973b41fa98c081472e6896dfb254c0"); - if ((absTick & 0x40) != 0) - ratio = mulShift(ratio, "ff2ea16466c96a3843ec78b326b52861"); - if ((absTick & 0x80) != 0) - ratio = mulShift(ratio, "fe5dee046a99a2a811c461f1969c3053"); - if ((absTick & 0x100) != 0) - ratio = mulShift(ratio, "fcbe86c7900a88aedcffc83b479aa3a4"); - if ((absTick & 0x200) != 0) - ratio = mulShift(ratio, "f987a7253ac413176f2b074cf7815e54"); - if ((absTick & 0x400) != 0) - ratio = mulShift(ratio, "f3392b0822b70005940c7a398e4b70f3"); - if ((absTick & 0x800) != 0) - ratio = mulShift(ratio, "e7159475a2c29b7443b29c7fa6e889d9"); - if ((absTick & 0x1000) != 0) - ratio = mulShift(ratio, "d097f3bdfd2022b8845ad8f792aa5825"); - if ((absTick & 0x2000) != 0) - ratio = mulShift(ratio, "a9f746462d870fdf8a65dc1f90e061e5"); - if ((absTick & 0x4000) != 0) - ratio = mulShift(ratio, "70d869a156d2a1b890bb3df62baf32f7"); - if ((absTick & 0x8000) != 0) - ratio = mulShift(ratio, "31be135f97d08fd981231505542fcfa6"); - if ((absTick & 0x10000) != 0) - ratio = mulShift(ratio, "9aa508b5b7a84e1c677de54f3e99bc9"); - if ((absTick & 0x20000) != 0) - ratio = mulShift(ratio, "5d6af8dedb81196699c329225ee604"); - if ((absTick & 0x40000) != 0) - ratio = mulShift(ratio, "2216e584f5fa1ea926041bedfe98"); - if ((absTick & 0x80000) != 0) - ratio = mulShift(ratio, "48a170391f7dc42444e8fa2"); - - if (tick > 0) { - ratio = BigInt.div(MAX_UINT_256, ratio); - } - - // back to Q96 - return BigInt.mod(ratio, Q32) > BigInt.ZERO - ? BigInt.add(BigInt.div(ratio, Q32), BigInt.ONE) - : BigInt.div(ratio, Q32); -} - -/** - * Returns the tick corresponding to a given sqrt ratio, s.t. #getSqrtRatioAtTick(tick) <= sqrtRatioX96 and #getSqrtRatioAtTick(tick + 1) > sqrtRatioX96 - * @param args.sqrtRatioX96 the sqrt ratio as a Q64.96 for which to compute the tick - */ -export function getTickAtSqrtRatio(args: Args_getTickAtSqrtRatio): i32 { - const sqrtRatioX96: BigInt = args.sqrtRatioX96; - if (sqrtRatioX96 < _MIN_SQRT_RATIO || sqrtRatioX96 > _MAX_SQRT_RATIO) { - throw new Error( - `SQRT_RATIO_BOUND: sqrt ratio is out of range ${_MIN_SQRT_RATIO} to ${_MAX_SQRT_RATIO}` - ); - } - - const sqrtRatioX128: BigInt = sqrtRatioX96.leftShift(32); - - const msb: u32 = mostSignificantBit({ x: sqrtRatioX128 }); - const biMsb: BigInt = BigInt.fromUInt32(msb); - const bi128: BigInt = BigInt.fromUInt16(128); - - let r: BigInt; - if (biMsb >= bi128) { - r = sqrtRatioX128.rightShift(msb - 127); - } else { - r = sqrtRatioX128.leftShift(127 - msb); - } - - let log2: BigInt = biMsb.sub(bi128).leftShift(64); - - for (let i = 0; i < 14; i++) { - r = r.mul(r).rightShift(127); - const f: BigInt = r.rightShift(128); - log2 = BigInt.bitwiseOr(log2, f.leftShift(63 - i)); - r = r.rightShift(f.toInt32()); - } - - const logSqrt10001 = BigInt.mul( - log2, - BigInt.fromString("255738958999603826347141") - ); - - const tickLow: i32 = logSqrt10001 - .sub(BigInt.fromString("3402992956809132418596140100660247210")) - .rightShift(128) - .toInt32(); - const tickHigh: i32 = logSqrt10001 - .add(BigInt.fromString("291339464771989622907027621153398088495")) - .rightShift(128) - .toInt32(); - - return tickLow == tickHigh - ? tickLow - : getSqrtRatioAtTick({ tick: tickHigh }) <= sqrtRatioX96 - ? tickHigh - : tickLow; -} - -/** - * Multiplies a value by a hex string and shifts right by 128 bits - * @param val the base value - * @param mulBy a hex (i.e. base 16) string representing the amount that val is multiplied by - */ -function mulShift(val: BigInt, mulBy: string): BigInt { - const biMulBy: BigInt = BigInt.fromString(mulBy, 16); - return val.mul(biMulBy).rightShift(128); -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/tickList/utils.ts b/protocol/ethereum/uniswapv3/wrapper/src/tickList/utils.ts deleted file mode 100644 index 702ddec57..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/tickList/utils.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { - Args_nextInitializedTick, - Args_tickIsAtOrAboveLargest, - Args_tickIsBelowSmallest, - Args_tickListIsSorted, - Args_validateTickList, - Tick, -} from "../wrap"; - -import { BigInt } from "@polywrap/wasm-as"; - -export function validateTickList(args: Args_validateTickList): boolean { - const ticks: Tick[] = args.ticks; - const tickSpacing: i32 = args.tickSpacing; - if (tickSpacing <= 0) { - throw new Error( - "TICK_SPACING_NONZERO: Tick spacing must be greater than zero" - ); - } - // ensure ticks are spaced appropriately - for (let i = 0; i < ticks.length; i++) { - if (ticks[i].index % tickSpacing != 0) { - throw new Error( - "TICK_SPACING: Tick indices must be multiples of tickSpacing" - ); - } - } - // ensure tick liquidity deltas sum to 0 - if ( - BigInt.ne( - ticks.reduce( - (accumulator: BigInt, tick: Tick) => - BigInt.add(accumulator, tick.liquidityNet), - BigInt.ZERO - ), - BigInt.ZERO - ) - ) { - throw new Error("ZERO_NET: tick net liquidity values must sum to 0"); - } - if (!isSorted(ticks, tickComparator)) { - throw new Error("SORTED: tick list must be sorted by index"); - } - return true; -} - -export function tickIsBelowSmallest(args: Args_tickIsBelowSmallest): boolean { - const ticks: Tick[] = args.ticks; - const tick: i32 = args.tick; - if (ticks.length == 0) { - throw new Error("LENGTH: Tick list is empty"); - } - return tick < ticks[0].index; -} - -export function tickIsAtOrAboveLargest( - args: Args_tickIsAtOrAboveLargest -): boolean { - const ticks: Tick[] = args.ticks; - const tick: i32 = args.tick; - if (ticks.length == 0) { - throw new Error("LENGTH: Tick list is empty"); - } - return tick >= ticks[ticks.length - 1].index; -} - -/** - * Finds the largest tick in the list of ticks that is less than or equal to tick - * @param ticks list of ticks - * @param tick tick to find the largest tick that is less than or equal to tick - * @private - */ -function binarySearch(ticks: Tick[], tick: i32): i32 { - if (tickIsBelowSmallest({ ticks: ticks, tick: tick })) { - throw new Error( - "BELOW_SMALLEST: target tick index is below smallest tick index in list" - ); - } - let l: i32 = 0; - let r: i32 = ticks.length - 1; - // eslint-disable-next-line no-constant-condition - while (true) { - const i: i32 = Math.floor((l + r) / 2); - - if ( - ticks[i].index <= tick && - (i === ticks.length - 1 || ticks[i + 1].index > tick) - ) { - return i; - } - - if (ticks[i].index < tick) { - l = i + 1; - } else { - r = i - 1; - } - } -} - -export function findTick(ticks: Tick[], index: u32): Tick { - const tick: Tick = ticks[binarySearch(ticks, index)]; - if (tick.index != index) { - throw new Error("NOT_CONTAINED: requested tick not found in tick list"); - } - return tick; -} - -export function nextInitializedTick(args: Args_nextInitializedTick): Tick { - const ticks: Tick[] = args.ticks; - const tick: i32 = args.tick; - const lte: boolean = args.lte; - - if (lte) { - if (tickIsBelowSmallest({ ticks: ticks, tick: tick })) { - throw new Error( - "BELOW_SMALLEST: tick is below smallest tick index in the list" - ); - } - if (tickIsAtOrAboveLargest({ ticks: ticks, tick: tick })) { - return ticks[ticks.length - 1]; - } - const index: i32 = binarySearch(ticks, tick); - return ticks[index]; - } else { - if (tickIsAtOrAboveLargest({ ticks: ticks, tick: tick })) { - throw new Error( - "AT_OR_ABOVE_LARGEST: tick is at or above largest tick index in the list" - ); - } - if (tickIsBelowSmallest({ ticks: ticks, tick: tick })) { - return ticks[0]; - } - const index: i32 = binarySearch(ticks, tick); - return ticks[index + 1]; - } -} - -/** - * Returns true if a tick list is sorted by tick index - * @param args.ticks the tick list - * @returns true if sorted - */ -export function tickListIsSorted(args: Args_tickListIsSorted): boolean { - return isSorted(args.ticks, tickComparator); -} - -function tickComparator(a: Tick, b: Tick): i32 { - return a.index - b.index; -} - -function isSorted(list: Array, comparator: (a: T, b: T) => i32): boolean { - for (let i = 0; i < list.length - 1; i++) { - if (comparator(list[i], list[i + 1]) > 0) { - return false; - } - } - return true; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/token/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/token/index.ts deleted file mode 100644 index e2c91ef7d..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/token/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - Currency, - Args_currencyEquals, - Args_tokenAmountEquals, - Args_tokenEquals, - Args_tokenSortsBefore, - Token, - TokenAmount, -} from "../wrap"; - -export * from "./utils"; - -// Checks if the current instance is equal to another (has an identical chainId and address). -export function currencyEquals(args: Args_currencyEquals): boolean { - const currencyA: Currency = args.currencyA; - const currencyB: Currency = args.currencyB; - return ( - currencyA.name == currencyB.name && - currencyA.symbol == currencyB.symbol && - currencyA.decimals == currencyB.decimals - ); -} - -// Checks if the current instance is equal to another (has an identical chainId and address). -export function tokenEquals(args: Args_tokenEquals): boolean { - const tokenA: Token = args.tokenA; - const tokenB: Token = args.tokenB; - return tokenA.chainId == tokenB.chainId && tokenA.address == tokenB.address; -} - -// compares two TokenAmount types for equality, returning true if they have the -// same token and same amount -export function tokenAmountEquals(args: Args_tokenAmountEquals): boolean { - const amtA: TokenAmount = args.tokenAmountA; - const amtB: TokenAmount = args.tokenAmountB; - return ( - tokenEquals({ tokenA: amtA.token, tokenB: amtB.token }) && - amtA.amount == amtB.amount - ); -} - -// Checks if the current instance sorts before another, by address. -export function tokenSortsBefore(args: Args_tokenSortsBefore): boolean { - const tokenA: Token = args.tokenA; - const tokenB: Token = args.tokenB; - const tokenAddress: string = tokenA.address.toLowerCase(); - const otherAddress: string = tokenB.address.toLowerCase(); - return tokenAddress.localeCompare(otherAddress) < 0; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/token/utils.ts b/protocol/ethereum/uniswapv3/wrapper/src/token/utils.ts deleted file mode 100644 index 5cf2e508c..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/token/utils.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { - Args_getNative, - Args_getWrappedNative, - Args_isNative, - Args_wrapAmount, - Args_wrapToken, - ChainId, - Currency, - Token, - TokenAmount, -} from "../wrap"; -import { currencyEquals } from "./index"; - -export function getNative(args: Args_getNative): Token { - return _getNative(args.chainId); -} - -export function getWrappedNative(args: Args_getWrappedNative): Token { - return _getWrappedNative(args.chainId); -} - -export function isNative(args: Args_isNative): boolean { - return _isNative(args.token); -} - -export function wrapToken(args: Args_wrapToken): Token { - return _wrapToken(args.token); -} - -export function wrapAmount(args: Args_wrapAmount): TokenAmount { - return _wrapAmount(args.amount); -} - -const ETHER: Currency = { - decimals: 18, - name: "Ether", - symbol: "ETH", -}; - -const wEthCurrency: Currency = { - decimals: 18, - name: "Wrapped Ether", - symbol: "WETH", -}; - -const MATIC: Currency = { - decimals: 18, - name: "Polygon Matic", - symbol: "MATIC", -}; - -const wMaticCurrency: Currency = { - decimals: 18, - name: "Wrapped MATIC", - symbol: "WMATIC", -}; - -function isMatic(chainId: ChainId): boolean { - return chainId == ChainId.POLYGON || chainId == ChainId.POLYGON_MUMBAI; -} - -export function _isNative(token: Token): boolean { - if (token.address != "") { - return false; - } - const currencyA = token.currency; - const currencyB = isMatic(token.chainId) ? MATIC : ETHER; - return currencyEquals({ currencyA, currencyB }); -} - -function _getNative(chainId: ChainId): Token { - if (chainId < 0 || chainId >= ChainId._MAX_) { - throw new Error("Unknown chain ID"); - } - const currency: Currency = isMatic(chainId) - ? copyCurrency(MATIC) - : copyCurrency(ETHER); - return { - chainId, - address: "", - currency, - }; -} - -function _getWrappedNativeAddress(chainId: ChainId): string { - switch (chainId) { - case ChainId.MAINNET: - return "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"; - case ChainId.ROPSTEN: - case ChainId.RINKEBY: - return "0xc778417E063141139Fce010982780140Aa0cD5Ab"; - case ChainId.GOERLI: - return "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6"; - case ChainId.KOVAN: - return "0xd0A1E359811322d97991E03f863a0C30C2cF029C"; - case ChainId.OPTIMISM: - case ChainId.OPTIMISTIC_KOVAN: - return "0x4200000000000000000000000000000000000006"; - case ChainId.ARBITRUM_ONE: - return "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"; - case ChainId.ARBITRUM_RINKEBY: - return "0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681"; - case ChainId.POLYGON: - return "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"; - case ChainId.POLYGON_MUMBAI: - return "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889"; - default: - throw new Error("Unknown chain ID"); - } -} - -function _getWrappedNative(chainId: ChainId): Token { - const address = _getWrappedNativeAddress(chainId); - const currency = isMatic(chainId) - ? copyCurrency(wMaticCurrency) - : copyCurrency(wEthCurrency); - return { chainId, address, currency }; -} - -// check if need to wrap ether -export function _wrapToken(token: Token): Token { - if (_isNative(token)) { - return _getWrappedNative(token.chainId); - } - return token; -} - -// check if need to wrap ether -export function _wrapAmount(tokenAmount: TokenAmount): TokenAmount { - return { - token: _wrapToken(tokenAmount.token), - amount: tokenAmount.amount, - }; -} - -function copyCurrency(currency: Currency): Currency { - return { - name: currency.name, - symbol: currency.symbol, - decimals: currency.decimals, - }; -} - -function copyToken(token: Token): Token { - return { - chainId: token.chainId, - address: token.address, - currency: copyCurrency(token.currency), - }; -} - -export function copyTokenAmount(tokenAmount: TokenAmount): TokenAmount { - return { - token: copyToken(tokenAmount.token), - amount: tokenAmount.amount.copy(), - }; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/trade/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/trade/index.ts deleted file mode 100644 index f25530068..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/trade/index.ts +++ /dev/null @@ -1,696 +0,0 @@ -import { - BestTradeOptions, - Args_bestTradeExactIn, - Args_bestTradeExactOut, - Args_createTradeExactIn, - Args_createTradeExactOut, - Args_createTradeFromRoute, - Args_createTradeFromRoutes, - Args_createUncheckedTrade, - Args_createUncheckedTradeWithMultipleRoutes, - Args_tradeExecutionPrice, - Args_tradeInputAmount, - Args_tradeMaximumAmountIn, - Args_tradeMinimumAmountOut, - Args_tradeOutputAmount, - Args_tradePriceImpact, - Args_tradeWorstExecutionPrice, - Pool, - PoolChangeResult, - Price as PriceType, - Fraction as FractionType, - Route, - Token, - TokenAmount, - Trade, - TradeRoute, - TradeSwap, - TradeType, -} from "../wrap"; -import { - tokenAmountEquals, - tokenEquals, - copyTokenAmount, - _wrapAmount, - _wrapToken, -} from "../token"; -import { - getPoolInputAmount, - getPoolOutputAmount, - poolInvolvesToken, -} from "../pool"; -import { Price, Fraction, PriorityQueue } from "../utils"; -import { createRoute } from "../route"; - -import { BigInt, Box } from "@polywrap/wasm-as"; - -/** - * private constructor; constructs and validates trade - * @param swaps the routes to swap through, the amount being passed in, and the amount returned when the trade is executed - * @param tradeType the type of the trade, either exact in or exact out - */ -function createTrade(swaps: TradeSwap[], tradeType: TradeType): Trade { - // All routes should have the same starting token. - const tokenIn: Token = _wrapToken(swaps[0].inputAmount.token); - for (let i = 0; i < swaps.length; i++) { - const tokenA: Token = _wrapToken(swaps[i].route.input); - if (!tokenEquals({ tokenA, tokenB: tokenIn })) { - throw new Error( - "INPUT_CURRENCY_MATCH: the input token of the trade and all its routes must match" - ); - } - } - // All routes should have the same ending token. - const tokenOut: Token = _wrapToken(swaps[0].outputAmount.token); - for (let i = 0; i < swaps.length; i++) { - const tokenA: Token = _wrapToken(swaps[i].route.output); - if (!tokenEquals({ tokenA, tokenB: tokenOut })) { - throw new Error( - "OUTPUT_CURRENCY_MATCH: the output token of the trade and all its routes must match" - ); - } - } - - const numPools: i32 = swaps - .map((route: TradeSwap) => route.route.pools.length) - .reduce((total, cur) => total + cur, 0); - const poolAddressSet = new Set(); - for (let i = 0; i < swaps.length; i++) { - const route: Route = swaps[i].route; - for (let j = 0; j < route.pools.length; j++) { - const pool: Pool = route.pools[j]; - // TODO: can't run unit tests with getPoolAddress because it relies on sha3 plugin; is this really necessary? - // const address: string = getPoolAddress({ - // tokenA: pool.token0, - // tokenB: pool.token1, - // fee: pool.fee, - // initCodeHashManualOverride: null, - // }); - const address: string = - pool.token0.address + pool.token1.address + pool.fee.toString(); - poolAddressSet.add(address); - } - } - if (numPools != poolAddressSet.size) { - throw new Error( - "POOLS_DUPLICATED: pools must be unique within and across routes" - ); - } - - const inputAmount: TokenAmount = tradeInputAmount({ swaps: swaps }); - const outputAmount: TokenAmount = tradeOutputAmount({ swaps: swaps }); - const executionPrice: PriceType = tradeExecutionPrice({ - inputAmount, - outputAmount, - }); - const priceImpact: FractionType = tradePriceImpact({ swaps, outputAmount }); - - return { - swaps, - tradeType, - inputAmount, - outputAmount, - executionPrice, - priceImpact, - }; -} - -/** - * private helper function used to create a TradeSwap - * @param route the route to swap through - * @param amount the amount being passed in or out, depending on the trade type - * @param tradeType the type of the trade, either exact in or exact out - * @returns TradeSwap the route to swap through, the amount being passed in, and the amount returned when the trade is executed - */ -function createTradeSwap( - route: Route, - amount: TokenAmount, - tradeType: TradeType -): TradeSwap { - const amounts: TokenAmount[] = new Array(route.path.length); - let inputAmount: TokenAmount; - let outputAmount: TokenAmount; - - if (tradeType === TradeType.EXACT_INPUT) { - if (!tokenEquals({ tokenA: amount.token, tokenB: route.input })) { - throw new Error( - "INPUT: the input amount token does not match the route input token" - ); - } - amounts[0] = _wrapAmount(amount); - for (let i = 0; i < route.path.length - 1; i++) { - amounts[i + 1] = getPoolOutputAmount({ - pool: route.pools[i], - inputAmount: amounts[i], - sqrtPriceLimitX96: null, - }).amount; - } - inputAmount = { - token: route.input, - amount: amount.amount, - }; - outputAmount = { - token: route.output, - amount: amounts[amounts.length - 1].amount, - }; - } else { - if (!tokenEquals({ tokenA: amount.token, tokenB: route.output })) { - throw new Error( - "OUTPUT: the output amount token does not match the route output token" - ); - } - amounts[amounts.length - 1] = _wrapAmount(amount); - for (let i = route.path.length - 1; i > 0; i--) { - amounts[i - 1] = getPoolInputAmount({ - pool: route.pools[i - 1], - outputAmount: amounts[i], - sqrtPriceLimitX96: null, - }).amount; - } - inputAmount = { - token: route.input, - amount: amounts[0].amount, - }; - outputAmount = { - token: route.output, - amount: amount.amount, - }; - } - return { route, inputAmount, outputAmount }; -} - -/** - * Constructs an exact in trade with the given amount in and route - * @param args.route the route of the exact in trade and the amount being passed in - */ -export function createTradeExactIn(args: Args_createTradeExactIn): Trade { - const tradeRoute: TradeRoute = args.tradeRoute; - return createTradeFromRoute({ - tradeRoute: tradeRoute, - tradeType: TradeType.EXACT_INPUT, - }); -} - -/** - * Constructs an exact out trade with the given amount out and route - * @param args.route the route of the exact out trade and the amount returned - */ -export function createTradeExactOut(args: Args_createTradeExactOut): Trade { - const tradeRoute: TradeRoute = args.tradeRoute; - return createTradeFromRoute({ - tradeRoute: tradeRoute, - tradeType: TradeType.EXACT_OUTPUT, - }); -} - -/** - * Constructs a trade by simulating swaps through the given route - * @param args.route the route to swap through and the amount specified, either input or output, depending on the trade type - * @param args.tradeType whether the trade is an exact input or exact output swap - */ -export function createTradeFromRoute(args: Args_createTradeFromRoute): Trade { - const route: Route = args.tradeRoute.route; - const amount: TokenAmount = args.tradeRoute.amount; - const tradeType: TradeType = args.tradeType; - return createTrade([createTradeSwap(route, amount, tradeType)], tradeType); -} - -/** - * Constructs a trade by simulating swaps through the given routes - * @param args.routes the routes to swap through and how much of the amount should be routed through each - * @param args.tradeType whether the trade is an exact input or exact output swap - */ -export function createTradeFromRoutes(args: Args_createTradeFromRoutes): Trade { - const tradeRoutes: TradeRoute[] = args.tradeRoutes; - const tradeType: TradeType = args.tradeType; - - const populatedRoutes: TradeSwap[] = []; - for (let i = 0; i < tradeRoutes.length; i++) { - const route: Route = tradeRoutes[i].route; - const amount: TokenAmount = tradeRoutes[i].amount; - populatedRoutes.push(createTradeSwap(route, amount, tradeType)); - } - - return createTrade(populatedRoutes, tradeType); -} - -/** - * Creates a trade without computing the result of swapping through the route. Useful when you have simulated the trade elsewhere and do not have any tick data - * @param args.swap the route to swap through, the amount being passed in, and the amount returned when the trade is executed - * @param args.tradeType the type of the trade, either exact in or exact out - */ -export function createUncheckedTrade(args: Args_createUncheckedTrade): Trade { - return createTrade([args.swap], args.tradeType); -} - -/** - * Creates a trade without computing the result of swapping through the routes. Useful when you have simulated the trade elsewhere and do not have any tick data - * @param args.routes the routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed - * @param args.tradeType the type of the trade, either exact in or exact out - */ -export function createUncheckedTradeWithMultipleRoutes( - args: Args_createUncheckedTradeWithMultipleRoutes -): Trade { - return createTrade(args.swaps, args.tradeType); -} - -/** - * The input amount for the trade assuming no slippage. - * @param args.swaps the routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed - */ -export function tradeInputAmount(args: Args_tradeInputAmount): TokenAmount { - const swaps: TradeSwap[] = args.swaps; - const inputCurrency: Token = swaps[0].inputAmount.token; - const totalInputFromRoutes: BigInt = swaps - .map((swap: TradeSwap) => swap.inputAmount.amount) - .reduce((total, cur) => total.add(cur), BigInt.ZERO); - return { - token: inputCurrency, - amount: totalInputFromRoutes, - }; -} - -/** - * The output amount for the trade assuming no slippage - * @param args.swaps the routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed - */ -export function tradeOutputAmount(args: Args_tradeOutputAmount): TokenAmount { - const swaps: TradeSwap[] = args.swaps; - const outputCurrency: Token = swaps[0].outputAmount.token; - const totalOutputFromRoutes: BigInt = swaps - .map((swap: TradeSwap) => swap.outputAmount.amount) - .reduce((total, cur) => total.add(cur), BigInt.ZERO); - return { - token: outputCurrency, - amount: totalOutputFromRoutes, - }; -} - -/** - * The price expressed in terms of output amount/input amount. - * @param args.inputAmount the trade input amount, e.g. from Trade object or tradeInputAmount(...) - * @param args.outputAmount the trade output amount, e.g. from Trade object or tradeOutputAmount(...) - */ -export function tradeExecutionPrice(args: Args_tradeExecutionPrice): PriceType { - const inputAmount: TokenAmount = args.inputAmount; - const outputAmount: TokenAmount = args.outputAmount; - return new Price( - inputAmount.token, - outputAmount.token, - inputAmount.amount, - outputAmount.amount - ).toPriceType(); -} - -/** - * Returns the percent difference between the route's mid price and the price impact - * @param args.swaps the routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed - * @param args.outputAmount the trade output amount, e.g. from Trade object or tradeOutputAmount(...) - */ -export function tradePriceImpact(args: Args_tradePriceImpact): FractionType { - const swaps: TradeSwap[] = args.swaps; - const outputAmount: TokenAmount = args.outputAmount; - - let spotOutputAmount: Fraction = new Fraction(BigInt.ZERO); - - for (let i = 0; i < swaps.length; i++) { - const route: Route = swaps[i].route; - const inputAmount: TokenAmount = swaps[i].inputAmount; - const midPrice: Price = Price.from(route.midPrice); - const quote: Fraction = midPrice.quote(inputAmount); - spotOutputAmount = spotOutputAmount.add(quote); - } - - const tradeOutputFraction: Fraction = new Fraction(outputAmount.amount); - const priceImpact: Fraction = spotOutputAmount - .sub(tradeOutputFraction) - .div(spotOutputAmount); - - return { - numerator: priceImpact.numerator, - denominator: priceImpact.denominator, - quotient: priceImpact.toFixed(18), - }; -} - -/** - * Get the minimum amount that must be received from this trade for the given slippage tolerance - * @param args.slippageTolerance The tolerance of unfavorable slippage from the execution price of this trade; a decimal number between 0 and 1 (e.g. "0.03") that represents a percentage - * @param args.amountOut The output amount of the trade, before slippage, e.g. from Trade object or tradeOutputAmount(...) - * @param args.tradeType The type of the trade, either exact in or exact out - */ -export function tradeMinimumAmountOut( - args: Args_tradeMinimumAmountOut -): TokenAmount { - const tolerance: Fraction = Fraction.fromString(args.slippageTolerance); - const amountOut: TokenAmount = args.amountOut; - const tradeType: TradeType = args.tradeType; - - if (tolerance.lt(new Fraction(BigInt.ZERO))) { - throw new RangeError( - "SLIPPAGE_TOLERANCE: slippage tolerance cannot be less than zero" - ); - } - - if (tradeType == TradeType.EXACT_OUTPUT) { - return amountOut; - } else { - const amountOutFraction: Fraction = new Fraction(amountOut.amount); - const slippageAdjustedAmountOut: BigInt = new Fraction(BigInt.ONE) - .add(tolerance) - .invert() - .mul(amountOutFraction) - .quotient(); - return { - token: amountOut.token, - amount: slippageAdjustedAmountOut, - }; - } -} - -/** - * Get the maximum amount in that can be spent via this trade for the given slippage tolerance - * @param args.slippageTolerance The tolerance of unfavorable slippage from the execution price of this trade; a decimal number between 0 and 1 (e.g. "0.03") that represents a percentage - * @param args.amountIn The input amount of the trade, before slippage, e.g. from Trade object or tradeInputAmount(...) - * @param args.tradeType The type of the trade, either exact in or exact out - */ -export function tradeMaximumAmountIn( - args: Args_tradeMaximumAmountIn -): TokenAmount { - const tolerance: Fraction = Fraction.fromString(args.slippageTolerance); - const amountIn: TokenAmount = args.amountIn; - const tradeType: TradeType = args.tradeType; - - if (tolerance.lt(new Fraction(BigInt.ZERO))) { - throw new RangeError( - "SLIPPAGE_TOLERANCE: slippage tolerance cannot be less than zero" - ); - } - - if (tradeType === TradeType.EXACT_INPUT) { - return amountIn; - } else { - const amountInFraction: Fraction = new Fraction(amountIn.amount); - const slippageAdjustedAmountIn: BigInt = new Fraction(BigInt.ONE) - .add(tolerance) - .mul(amountInFraction) - .quotient(); - return { - token: amountIn.token, - amount: slippageAdjustedAmountIn, - }; - } -} - -/** - * Return the execution price after accounting for slippage tolerance - * @param args.swaps the routes to swap through, the amounts being passed in, and the amounts returned when the trade is executed - * @param args.tradeType the type of the trade, either exact in or exact out - * @param args.amountIn the trade input amount, e.g. from Trade object or tradeInputAmount(...) - * @param args.amountOut the trade output amount, e.g. from Trade object or tradeOutputAmount(...) - * @param args.slippageTolerance the allowed tolerated slippage - */ -export function tradeWorstExecutionPrice( - args: Args_tradeWorstExecutionPrice -): PriceType { - const swaps: TradeSwap[] = args.trade.swaps; - const tradeType: TradeType = args.trade.tradeType; - const amountIn: TokenAmount = args.trade.inputAmount; - const amountOut: TokenAmount = args.trade.outputAmount; - const slippageTolerance: string = args.slippageTolerance; - - return new Price( - swaps[0].inputAmount.token, - swaps[0].outputAmount.token, - tradeMaximumAmountIn({ slippageTolerance, amountIn, tradeType }).amount, - tradeMinimumAmountOut({ slippageTolerance, amountOut, tradeType }).amount - ).toPriceType(); -} - -/** - * Given a list of pools, and a fixed amount in, returns the top `maxNumResults` trades that go from an input token - amount to an output token, making at most `maxHops` hops. - Note this does not consider aggregation, as routes are linear. It's possible a better route exists by splitting - the amount in among multiple routes. - * @param args.pools the pools to consider in finding the best trade - * @param args.amountIn exact amount of input currency to spend - * @param args.tokenOut the desired currency out - * @param args.options options used when determining the best trade - */ -export function bestTradeExactIn(args: Args_bestTradeExactIn): Trade[] { - const pools: Pool[] = args.pools; - const amountIn: TokenAmount = args.amountIn; - const tokenOut: Token = args.tokenOut; - const options: BestTradeOptions = fillBestTradeOptions(args.options); - - if (pools.length == 0) { - throw new Error("POOLS: pools array is empty"); - } - if (options.maxHops!.unwrap() == 0) { - throw new Error("MAX_HOPS: maxHops must be greater than zero"); - } - - return _bestTradeExactIn(pools, amountIn, tokenOut, options) - .toArray() - .slice(0, options.maxNumResults!.unwrap()); -} - -function _bestTradeExactIn( - pools: Pool[], - currencyAmountIn: TokenAmount, - currencyOut: Token, - options: BestTradeOptions, - // used in recursion - currentPools: Pool[] = [], - nextAmountIn: TokenAmount = copyTokenAmount(currencyAmountIn), - bestTrades: PriorityQueue = new PriorityQueue(tradeComparator) -): PriorityQueue { - if ( - !( - tokenAmountEquals({ - tokenAmountA: currencyAmountIn, - tokenAmountB: nextAmountIn, - }) || currentPools.length > 0 - ) - ) { - throw new Error("INVALID_RECURSION"); - } - - const amountIn = _wrapAmount(nextAmountIn); - const tokenOut = _wrapToken(currencyOut); - for (let i = 0; i < pools.length; i++) { - const pool = pools[i]; - // pool irrelevant - if (!poolInvolvesToken({ pool, token: amountIn.token })) continue; - - const amountOut: TokenAmount = getPoolOutputAmount({ - pool, - inputAmount: amountIn, - sqrtPriceLimitX96: null, - }).amount; - - // we have arrived at the output token, so this is the final trade of one of the paths - if (tokenEquals({ tokenA: amountOut.token, tokenB: tokenOut })) { - const newTrade = createTradeFromRoute({ - tradeRoute: { - route: createRoute({ - pools: currentPools.concat([pool]), - inToken: currencyAmountIn.token, - outToken: currencyOut, - }), - amount: currencyAmountIn, - }, - tradeType: TradeType.EXACT_INPUT, - }); - bestTrades.insert(newTrade); - } else if (options.maxHops!.unwrap() > 1 && pools.length > 1) { - const poolsExcludingThisPool: Pool[] = pools - .slice(0, i) - .concat(pools.slice(i + 1)); - - // otherwise, consider all the other paths that lead from this token as long as we have not exceeded maxHops - _bestTradeExactIn( - poolsExcludingThisPool, - currencyAmountIn, - currencyOut, - { - maxNumResults: options.maxNumResults, - maxHops: options.maxHops!.postDec(), - }, - currentPools.concat([pool]), - amountOut, - bestTrades - ); - } - } - - return bestTrades; -} - -/** - * Similar to bestTradeExactIn(...) but instead targets a fixed output amount - given a list of pools, and a fixed amount out, returns the top `maxNumResults` trades that go from an input token - to an output token amount, making at most `maxHops` hops. - Note this does not consider aggregation, as routes are linear. It's possible a better route exists by splitting - the amount in among multiple routes. - * @param args.pools the pools to consider in finding the best trade - * @param args.tokenIn the currency to spend - * @param args.amountOut the desired currency amount out - * @param args.options options used when determining the best trade - */ -export function bestTradeExactOut(args: Args_bestTradeExactOut): Trade[] { - const pools: Pool[] = args.pools; - const tokenIn: Token = args.tokenIn; - const amountOut: TokenAmount = args.amountOut; - const options: BestTradeOptions = fillBestTradeOptions(args.options); - - if (pools.length == 0) { - throw new Error("POOLS: pools array is empty"); - } - if (options.maxHops!.unwrap() == 0) { - throw new Error("MAX_HOPS: maxHops must be greater than zero"); - } - - return _bestTradeExactOut(pools, tokenIn, amountOut, options) - .toArray() - .slice(0, options.maxNumResults!.unwrap()); -} - -function _bestTradeExactOut( - pools: Pool[], - currencyIn: Token, - currencyAmountOut: TokenAmount, - options: BestTradeOptions, - // used in recursion - currentPools: Pool[] = [], - nextAmountOut: TokenAmount = copyTokenAmount(currencyAmountOut), - bestTrades: PriorityQueue = new PriorityQueue(tradeComparator) -): PriorityQueue { - if ( - !( - tokenAmountEquals({ - tokenAmountA: currencyAmountOut, - tokenAmountB: nextAmountOut, - }) || currentPools.length > 0 - ) - ) { - throw new Error("INVALID_RECURSION"); - } - - const amountOut: TokenAmount = _wrapAmount(nextAmountOut); - const tokenIn: Token = _wrapToken(currencyIn); - for (let i = 0; i < pools.length; i++) { - const pool = pools[i]; - // pool irrelevant - if (!poolInvolvesToken({ pool, token: amountOut.token })) continue; - - const poolChangeResult: PoolChangeResult = getPoolInputAmount({ - pool, - outputAmount: amountOut, - sqrtPriceLimitX96: null, - }); - const amountIn: TokenAmount = poolChangeResult.amount; - const nextPoolState: Pool = poolChangeResult.nextPool; - // TODO: is this a valid test for insufficient liquidity? - // insufficient liquidity - if (nextPoolState.liquidity.isZero()) { - continue; - } - - // we have arrived at the input token, so this is the first trade of one of the paths - if (tokenEquals({ tokenA: amountIn.token, tokenB: tokenIn })) { - const newTrade = createTradeFromRoute({ - tradeRoute: { - route: createRoute({ - pools: [pool].concat(currentPools), - inToken: currencyIn, - outToken: currencyAmountOut.token, - }), - amount: currencyAmountOut, - }, - tradeType: TradeType.EXACT_OUTPUT, - }); - bestTrades.insert(newTrade); - } else if (options.maxHops!.unwrap() > 1 && pools.length > 1) { - const poolsExcludingThisPool: Pool[] = pools - .slice(0, i) - .concat(pools.slice(i + 1)); - - // otherwise, consider all the other paths that arrive at this token as long as we have not exceeded maxHops - _bestTradeExactOut( - poolsExcludingThisPool, - currencyIn, - currencyAmountOut, - { - maxNumResults: options.maxNumResults, - maxHops: options.maxHops!.postDec(), - }, - [pool].concat(currentPools), - amountIn, - bestTrades - ); - } - } - - return bestTrades; -} - -function tradeComparator(a: Trade, b: Trade): i32 { - const aInput = a.inputAmount; - const bInput = b.inputAmount; - if (!tokenEquals({ tokenA: aInput.token, tokenB: bInput.token })) { - throw new Error( - "INPUT_CURRENCY: To be compared, trades must the same input token" - ); - } - - const aOutput = a.outputAmount; - const bOutput = b.outputAmount; - if (!tokenEquals({ tokenA: aOutput.token, tokenB: bOutput.token })) { - throw new Error( - "OUTPUT_CURRENCY: To be compared, trades must the same output token" - ); - } - - const aOutputBI = aOutput.amount; - const bOutputBI = bOutput.amount; - const aInputBI = aInput.amount; - const bInputBI = bInput.amount; - - if (aOutputBI.eq(bOutputBI)) { - if (aInputBI.eq(bInputBI)) { - // consider the number of hops since each hop costs gas - const aHops = a.swaps.reduce((x, cur) => x + cur.route.path.length, 0); - const bHops = b.swaps.reduce((x, cur) => x + cur.route.path.length, 0); - return bHops - aHops; - } - // trade A requires less input than trade B, so A should come first - if (aInputBI.lt(bInputBI)) { - return 1; - } else { - return -1; - } - } else { - // tradeA has less output than trade B, so should come second - if (aOutputBI.lt(bOutputBI)) { - return -1; - } else { - return 1; - } - } -} - -function fillBestTradeOptions( - options: BestTradeOptions | null -): BestTradeOptions { - return options === null - ? { - maxNumResults: new Box(3), - maxHops: new Box(3), - } - : { - maxNumResults: - options.maxNumResults === null ? new Box(3) : options.maxNumResults, - maxHops: options.maxHops === null ? new Box(3) : options.maxHops, - }; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/Fraction.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/Fraction.ts deleted file mode 100644 index da36458a9..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/Fraction.ts +++ /dev/null @@ -1,143 +0,0 @@ -// translated to AS from https://github.com/Uniswap/uniswap-sdk-core/blob/main/src/entities/fractions/fraction.ts - -import { Rounding } from "./enumUtils"; - -import { BigInt, BigNumber, Rounding as BNRounding } from "@polywrap/wasm-as"; - -export class Fraction { - public readonly numerator: BigInt; - public readonly denominator: BigInt; - - public constructor(numerator: BigInt, denominator: BigInt = BigInt.ONE) { - this.numerator = numerator; - this.denominator = denominator; - } - - public static fromString(decimalNumber: string): Fraction { - const index = decimalNumber.indexOf("."); - if (index == -1) { - return new Fraction(BigInt.fromString(decimalNumber)); - } - const numerator = BigInt.fromString( - decimalNumber.substring(0, index) + decimalNumber.substring(index + 1) - ); - const e: i32 = decimalNumber.length - index - 1; - let denomStr = "1"; - for (let i = 0; i < e; i++) { - denomStr += "0"; - } - const denominator = BigInt.fromString(denomStr); - return new Fraction(numerator, denominator); - } - - // performs floor division - public quotient(): BigInt { - return BigInt.div(this.numerator, this.denominator); - } - - public invert(): Fraction { - return new Fraction(this.denominator, this.numerator); - } - - public add(other: Fraction): Fraction { - if (this.denominator.eq(other.denominator)) { - const numeratorSum: BigInt = BigInt.add(this.numerator, other.numerator); - return new Fraction(numeratorSum, this.denominator); - } - return new Fraction( - BigInt.add( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ), - BigInt.mul(this.denominator, other.denominator) - ); - } - - public sub(other: Fraction): Fraction { - if (BigInt.eq(this.denominator, other.denominator)) { - const numeratorSub: BigInt = BigInt.sub(this.numerator, other.numerator); - return new Fraction(numeratorSub, this.denominator); - } - return new Fraction( - BigInt.sub( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ), - BigInt.mul(this.denominator, other.denominator) - ); - } - - public lt(other: Fraction): boolean { - return BigInt.lt( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ); - } - - public eq(other: Fraction): boolean { - return BigInt.eq( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ); - } - - public gt(other: Fraction): boolean { - return BigInt.gt( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(other.numerator, this.denominator) - ); - } - - public mul(other: Fraction): Fraction { - return new Fraction( - BigInt.mul(this.numerator, other.numerator), - BigInt.mul(this.denominator, other.denominator) - ); - } - - public div(other: Fraction): Fraction { - return new Fraction( - BigInt.mul(this.numerator, other.denominator), - BigInt.mul(this.denominator, other.numerator) - ); - } - - public toSignificant( - significantDigits: i32, - rounding: Rounding = Rounding.ROUND_HALF_UP - ): string { - if (significantDigits < 0) { - throw new Error( - significantDigits.toString() + " is not a positive integer." - ); - } - return BigNumber.fromFraction( - this.numerator, - this.denominator - ).toSignificant(significantDigits, Fraction.mapRounding(rounding)); - } - - public toFixed( - decimalPlaces: i32, - rounding: Rounding = Rounding.ROUND_HALF_UP - ): string { - if (decimalPlaces < 0) { - throw new Error(decimalPlaces.toString() + " is negative."); - } - return BigNumber.fromFraction(this.numerator, this.denominator).toFixed( - decimalPlaces, - Fraction.mapRounding(rounding) - ); - } - - private static mapRounding(rounding: Rounding): BNRounding { - switch (rounding) { - case Rounding.ROUND_DOWN: - return BNRounding.DOWN; - case Rounding.ROUND_UP: - return BNRounding.UP; - default: - return BNRounding.HALF_UP; - } - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/Price.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/Price.ts deleted file mode 100644 index 794e4b853..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/Price.ts +++ /dev/null @@ -1,136 +0,0 @@ -// translated to AS from https://github.com/Uniswap/uniswap-sdk-core/blob/main/src/entities/fractions/fraction.ts - -import { Rounding } from "./enumUtils"; -import { Token, TokenAmount, Price as PriceType } from "../wrap"; -import { Fraction } from "./Fraction"; -import { tokenEquals } from "../token"; - -import { BigInt } from "@polywrap/wasm-as"; - -export class Price extends Fraction { - public readonly baseToken: Token; // input i.e. denominator - public readonly quoteToken: Token; // output i.e. numerator - public readonly scalar: Fraction; // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token - - // denominator and numerator _must_ be raw, i.e. in the native representation - public constructor( - baseToken: Token, - quoteToken: Token, - denominator: BigInt, - numerator: BigInt - ) { - super(numerator, denominator); - - this.baseToken = baseToken; - this.quoteToken = quoteToken; - this.scalar = new Fraction( - BigInt.pow(BigInt.fromUInt16(10), baseToken.currency.decimals), - BigInt.pow(BigInt.fromUInt16(10), quoteToken.currency.decimals) - ); - } - - public static from(price: T): Price { - if (price instanceof Price) return price; - if (price instanceof PriceType) return Price.fromPriceType(price); - throw new TypeError("Unsupported generic type " + nameof(price)); - } - - public static fromPriceType(price: PriceType): Price { - return new Price( - price.baseToken, - price.quoteToken, - price.denominator, - price.numerator - ); - } - - // doesn't work: although this produces an equivalent value, the correct numerator and denominator cannot be recovered - // public static fromString( - // baseToken: Token, - // quoteToken: Token, - // price: string - // ): Price { - // const priceFraction: Fraction = Fraction.fromString(price).div( - // new Fraction( - // BigInt.pow(BigInt.fromUInt16(10), baseToken.currency.decimals), - // BigInt.pow(BigInt.fromUInt16(10), quoteToken.currency.decimals) - // ) - // ); - // return new Price( - // baseToken, - // quoteToken, - // priceFraction.denominator, - // priceFraction.numerator - // ); - // } - - public raw(): Fraction { - return new Fraction(this.numerator, this.denominator); - } - - public adjusted(): Fraction { - return super.mul(this.scalar); - } - - public invert(): Price { - return new Price( - this.quoteToken, - this.baseToken, - this.numerator, - this.denominator - ); - } - - public mul(other: Price): Price { - if (!tokenEquals({ tokenA: this.quoteToken, tokenB: other.baseToken })) - throw new Error( - "Price multiply error: quoteToken of 'left' must be the same as baseToken of 'right'" - ); - const fraction = super.mul(other); - return new Price( - this.baseToken, - other.quoteToken, - fraction.denominator, - fraction.numerator - ); - } - - // quote function does not work the same as in JS sdk - public quote(tokenAmount: TokenAmount): Fraction { - if (!tokenEquals({ tokenA: tokenAmount.token, tokenB: this.baseToken })) { - throw new Error("Token of tokenAmount must be the same as baseToken"); - } - const biAmount = tokenAmount.amount; - return super.mul(new Fraction(biAmount)); - } - - public toSignificant( - significantDigits: i32 = 6, - rounding: Rounding = Rounding.ROUND_HALF_UP - ): string { - return this.adjusted().toSignificant(significantDigits, rounding); - } - - public toFixed( - decimalPlaces: i32 = 4, - rounding: Rounding = Rounding.ROUND_HALF_UP - ): string { - return this.adjusted().toFixed(decimalPlaces, rounding); - } - - public toPriceType( - placesOrDigits: i32 = 18, - rounding: Rounding = Rounding.ROUND_HALF_UP, - toSignificant: boolean = false - ): PriceType { - return { - baseToken: this.baseToken, - quoteToken: this.quoteToken, - denominator: this.denominator, - numerator: this.numerator, - price: toSignificant - ? this.toSignificant(placesOrDigits, rounding) - : this.toFixed(placesOrDigits, rounding), - }; - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/PriorityQueue.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/PriorityQueue.ts deleted file mode 100644 index ec7691904..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/PriorityQueue.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - Heap priority queue that sorts by max priority, determined by priority function comapareTo. - compareTo is a sorting function that takes two values and returns: - a negative number if left < right, - a positive number if left > right, - or zero if left = right. - To sort by min priority, simply write compareTo to flip the sign of the result before returning. - It is assumed that any mutations of Key don't change sort order. -*/ -export class PriorityQueue { - private readonly _pq: (Key | null)[]; - private _n: i32 = 0; - private readonly _compareTo: (left: Key, right: Key) => i32; - - constructor(comparator: (left: Key, right: Key) => i32, capacity: i32 = 0) { - this._pq = new Array(capacity + 1); - this._pq[0] = null; // 0 index must be null for heap tree math - this._compareTo = comparator; - } - - public toArray(): Key[] { - const result: Key[] = new Array(this._n); - let i: i32 = 0; - let val: Key | null = this.delMax(); - while (val !== null) { - result[i++] = val; - val = this.delMax(); - } - return result; - } - - public isEmpty(): boolean { - return this._n == 0; - } - - public get length(): i32 { - return this._n; - } - - public insert(v: Key): void { - this._pq.push(v); - this._swim(++this._n); - } - - public delMax(): Key | null { - if (this._n < 1) return null; - const max: Key | null = this._pq[1]; - this._exch(1, this._n--); - this._pq.pop(); - this._sink(1); - return max; - } - - private _less(i: i32, j: i32): boolean { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this._compareTo(this._pq[i]!, this._pq[j]!) < 0; - } - - private _exch(i: i32, j: i32): void { - const t: Key | null = this._pq[i]; - this._pq[i] = this._pq[j]; - this._pq[j] = t; - } - - private _swim(k: i32): void { - while (k > 1 && this._less(k / 2, k)) { - this._exch(k / 2, k); - k = k / 2; - } - } - - private _sink(k: i32): void { - while (2 * k <= this._n) { - let j: i32 = 2 * k; - if (j < this._n && this._less(j, j + 1)) j++; - if (!this._less(k, j)) break; - this._exch(k, j); - k = j; - } - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/addressUtils.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/addressUtils.ts deleted file mode 100644 index fc27a2320..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/addressUtils.ts +++ /dev/null @@ -1,61 +0,0 @@ -// https://github.com/ethers-io/ethers.js/blob/master/packages/address/src.ts/index.ts#L143 -import { SHA3_Module } from "../wrap"; - -export function getChecksumAddress(address: string): string { - if (address.startsWith("0x")) { - address = address.substring(2); - } - address = address.toLowerCase(); - const chars: string[] = address.split(""); - - const expanded: Uint8Array = new Uint8Array(40); - for (let i = 0; i < 40; i++) { - expanded[i] = chars[i].charCodeAt(0); - } - - const hashed: string = SHA3_Module.buffer_keccak_256({ - message: expanded.buffer, - }).unwrap(); - const hashedArr: Uint8Array = arrayify(hashed); - - for (let i = 0; i < 40; i += 2) { - if (hashedArr[i >> 1] >> 4 >= 8) { - chars[i] = chars[i].toUpperCase(); - } - if ((hashedArr[i >> 1] & 0x0f) >= 8) { - chars[i + 1] = chars[i + 1].toUpperCase(); - } - } - return "0x" + chars.join(""); -} - -// https://github.com/ethers-io/ethers.js/blob/d395d16fa357ec5dda9b59922cf21c39dc34c071/packages/bytes/lib.esm/index.js#L43 -function arrayify(hex: string): Uint8Array { - if (hex.startsWith("0x")) { - hex = hex.substring(2); - } - const result: Uint8Array = new Uint8Array(hex.length / 2); - let j: i32 = 0; - for (let i = 0; i < hex.length; i += 2) { - result[j++] = U8.parseInt(hex.substring(i, i + 2), 16); - } - return result; -} - -// https://github.com/ethers-io/ethers.js/blob/d395d16fa357ec5dda9b59922cf21c39dc34c071/packages/bytes/lib.esm/index.js#L89 -export function concat(items: string[]): Uint8Array { - const objects: Uint8Array[] = items.map((item: string) => - arrayify(item) - ); - const length = objects.reduce( - (accum: i32, item: Uint8Array) => accum + item.length, - 0 - ); - const result = new Uint8Array(length); - let offset: i32 = 0; - for (let i = 0; i < objects.length; i++) { - result.set(objects[i], offset); - offset += objects[i].length; - } - return result; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/call.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/call.ts deleted file mode 100644 index 3f17a277d..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/call.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { - ChainId, - Ethereum_Module, - Ethereum_TxResponse, - GasOptions, - getChainIdKey, - Args_approve, - Args_execCall, - MethodParameters, -} from "../wrap"; -import { MAX_UINT_256, ROUTER_ADDRESS } from "../utils"; -import { toHex } from "../router"; - -import { BigInt } from "@polywrap/wasm-as"; - -export function execCall(args: Args_execCall): Ethereum_TxResponse { - const methodParameters: MethodParameters = args.parameters; - const chainId: ChainId = args.chainId; - const address: string = args.address; - const gasOptions: GasOptions | null = args.gasOptions; - - return Ethereum_Module.sendTransaction({ - tx: { - to: address, - _from: null, - nonce: null, - gasLimit: gasOptions === null ? null : gasOptions.gasLimit, - gasPrice: gasOptions === null ? null : gasOptions.gasPrice, - data: methodParameters.calldata, - value: BigInt.fromString(methodParameters.value, 16), - chainId: null, - _type: null, - }, - connection: { - node: null, - networkNameOrChainId: getChainIdKey(chainId), - }, - }).unwrap(); -} - -export function approve(args: Args_approve): Ethereum_TxResponse { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const amount: BigInt = args.amount === null ? MAX_UINT_256 : args.amount!; - const gasOptions: GasOptions | null = args.gasOptions; - - return Ethereum_Module.callContractMethod({ - address: args.token.address, - method: - "function approve(address spender, uint value) external returns (bool)", - args: [ROUTER_ADDRESS, toHex({ value: amount })], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(args.token.chainId), - }, - txOverrides: { - value: null, - gasLimit: gasOptions === null ? null : gasOptions.gasLimit, - gasPrice: gasOptions === null ? null : gasOptions.gasPrice, - }, - }).unwrap(); -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/constants.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/constants.ts deleted file mode 100644 index e0e7bcae3..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/constants.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { BigInt } from "@polywrap/wasm-as"; - -/* SDK CORE CONSTANTS */ - -export const MAX_UINT_256: BigInt = BigInt.fromString( - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - 16 -); - -/* V3 SDK PUBLIC CONSTANTS */ - -export const ROUTER_ADDRESS = "0xE592427A0AEce92De3Edee1F18E0157C05861564"; -export const _FACTORY_ADDRESS = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; -export const NFPM_ADDRESS = "0xC36442b4a4522E871399CD717aBDD847Ab11FE88"; -export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; -export const _POOL_INIT_CODE_HASH = - "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54"; - -/* V3 SDK INTERNAL CONSTANTS */ - -// used in liquidity amount math -// export const Q96 = BigInt.pow(BigInt.fromUInt16(2), 96); -export const Q96: BigInt = BigInt.ONE.leftShift(96); -export const Q192: BigInt = BigInt.pow(Q96, 2); - -/* TICK MATH CONSTANTS */ - -// export const Q32: BigInt = BigInt.pow(BigInt.fromUInt16(2), 32); -export const Q32: BigInt = BigInt.ONE.leftShift(32); -// The minimum tick that can be used on any pool. -export const _MIN_TICK: i32 = -887272; -// The maximum tick that can be used on any pool. -export const _MAX_TICK: i32 = -_MIN_TICK; -// The sqrt ratio corresponding to the minimum tick that could be used on any pool. -export const _MIN_SQRT_RATIO: BigInt = BigInt.fromString("4295128739"); -// The sqrt ratio corresponding to the maximum tick that could be used on any pool. -export const _MAX_SQRT_RATIO: BigInt = BigInt.fromString( - "1461446703485210103287273052203988822378723970342" -); - -/* SWAP MATH CONSTANTS */ - -export const MAX_FEE: BigInt = BigInt.fromUInt32(10 ** 6); -export const MAX_UINT_160: BigInt = BigInt.fromString( - "ffffffffffffffffffffffffffffffffffffffff", - 16 -); - -// ROUTER AND QUOTER CONSTANTS - -export const ZERO_HEX: string = "0x00"; diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/deployPool.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/deployPool.ts deleted file mode 100644 index b13c59621..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/deployPool.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - Ethereum_TxResponse, - FeeAmount, - GasOptions, - Args_deployPool, - Args_deployPoolFromTokens, - MethodParameters, - Pool, - Token, -} from "../wrap"; -import { execCall } from "./call"; -import { NFPM_ADDRESS } from "../utils"; -import { createPool, poolChainId } from "../pool"; -import { createCallParameters } from "../position"; -import { getSqrtRatioAtTick } from "../tickList"; - -import { BigInt } from "@polywrap/wasm-as"; - -export function deployPool(args: Args_deployPool): Ethereum_TxResponse { - const pool: Pool = args.pool; - const gasOptions: GasOptions | null = args.gasOptions; - - const parameters: MethodParameters = createCallParameters({ pool }); - return execCall({ - parameters, - address: NFPM_ADDRESS, - chainId: poolChainId({ pool }), - gasOptions, - }); -} - -export function deployPoolFromTokens( - args: Args_deployPoolFromTokens -): Ethereum_TxResponse { - const tokenA: Token = args.tokenA; - const tokenB: Token = args.tokenB; - const fee: FeeAmount = args.fee; - const gasOptions: GasOptions | null = args.gasOptions; - - const pool: Pool = createPool({ - tokenA, - tokenB, - fee, - sqrtRatioX96: getSqrtRatioAtTick({ tick: 0 }), - liquidity: BigInt.ZERO, - tickCurrent: 0, - ticks: null, - }); - return deployPool({ pool, gasOptions }); -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/enumUtils.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/enumUtils.ts deleted file mode 100644 index 3edb8f840..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/enumUtils.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { - FeeAmount, - PermitV, - Args_feeAmountToTickSpacing, - Args_getFeeAmount, - Args_getPermitV, -} from "../wrap"; - -export enum Rounding { - ROUND_DOWN, - ROUND_HALF_UP, - ROUND_UP, - _MAX_, -} - -export function feeAmountToTickSpacing(args: Args_feeAmountToTickSpacing): i32 { - return _feeAmountToTickSpacing(args.feeAmount); -} - -export function getFeeAmount(args: Args_getFeeAmount): u32 { - return _getFeeAmount(args.feeAmount); -} - -export function getPermitV(args: Args_getPermitV): i32 { - return _getPermitV(args.permitV); -} - -export function _feeAmountToTickSpacing(feeAmount: FeeAmount): i32 { - switch (feeAmount) { - case FeeAmount.LOWEST: - return 1; - case FeeAmount.LOW: - return 10; - case FeeAmount.MEDIUM: - return 60; - case FeeAmount.HIGH: - return 200; - default: - throw new Error("Unknown FeeAmount"); - } -} - -export function _getFeeAmount(feeAmount: FeeAmount): u32 { - switch (feeAmount) { - case FeeAmount.LOWEST: - return 100; - case FeeAmount.LOW: - return 500; - case FeeAmount.MEDIUM: - return 3000; - case FeeAmount.HIGH: - return 10000; - default: - throw new Error("Unknown FeeAmount"); - } -} - -export function getFeeAmountEnum(feeAmount: u32): FeeAmount { - switch (feeAmount) { - case 100: - return FeeAmount.LOWEST; - case 500: - return FeeAmount.LOW; - case 3000: - return FeeAmount.MEDIUM; - case 10000: - return FeeAmount.HIGH; - default: - throw new Error("Unknown FeeAmount"); - } -} - -export function _getPermitV(permitV: PermitV): i32 { - switch (permitV) { - case PermitV.v_0: - return 0; - case PermitV.v_1: - return 1; - case PermitV.v_27: - return 27; - case PermitV.v_28: - return 28; - default: - throw new Error("Unknown value of 'v' in PermitOptions"); - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/fetch.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/fetch.ts deleted file mode 100644 index 952e8d8b2..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/fetch.ts +++ /dev/null @@ -1,219 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { - ChainId, - getChainIdKey, - Args_fetchPoolFromAddress, - Args_fetchToken, - Pool, - Token, - Tick, - Args_fetchTickList, - Args_fetchPoolFromTokens, - FeeAmount, - Ethereum_Module, - Ethereum_Connection, - Currency, -} from "../wrap"; -import { createPool, getPoolAddress } from "../pool"; -import { _wrapToken } from "../token"; -import { getFeeAmountEnum } from "./enumUtils"; -import { - getSubgraphEndpoint, - SubgraphEndpoint, - subgraphQuery, -} from "./subgraph"; -import { ethCallView, poolAbi, PoolImmutables, PoolState } from "./poolView"; - -import { BigInt, JSON } from "@polywrap/wasm-as"; - -/** - * returns token object constructed from on-chain token contract - * @param args.address the Ethereum address of token's ERC20 contract - * @param args.chainId the id of the chain to be queried - */ -export function fetchToken(args: Args_fetchToken): Token { - const chainId: ChainId = args.chainId; - const address: string = args.address; - - const connection: Ethereum_Connection = { - node: null, - networkNameOrChainId: getChainIdKey(chainId), - }; - - const name: string = Ethereum_Module.callContractView({ - connection, - address, - method: "function name() public view returns (string memory)", - args: null, - }).unwrap(); - - const symbol: string = Ethereum_Module.callContractView({ - connection, - address, - method: "function symbol() public view returns (string memory)", - args: null, - }).unwrap(); - - const decimalsString: string = Ethereum_Module.callContractView({ - connection, - address, - method: "function decimals() public view returns (uint8)", - args: null, - }).unwrap(); - const decimals: u8 = U8.parseInt(decimalsString); - - const currency: Currency = { decimals, symbol, name }; - return { chainId, address, currency }; -} - -/** - * returns pool object constructed from on-chain pool contract - * @param args.tokenA a token in the pool - * @param args.tokenB the other token in the pool - * @param args.fee the pool's fee amount - * @param args.fetchTicks if true, the full list of pool ticks will be fetched - */ -export function fetchPoolFromTokens(args: Args_fetchPoolFromTokens): Pool { - let tokenA: Token = args.tokenA; - let tokenB: Token = args.tokenB; - const fee: FeeAmount = args.fee; - const fetchTicks = args.fetchTicks; - // wrap if ether - tokenA = _wrapToken(tokenA); - tokenB = _wrapToken(tokenB); - // get pool address - const address = getPoolAddress({ - tokenA, - tokenB, - fee, - initCodeHashManualOverride: null, - }); - const chainId: ChainId = tokenA.chainId; - // fetch data - const state: PoolState = fetchPoolState(address, chainId); - const ticks: Tick[] | null = fetchTicks - ? fetchTickList({ address, chainId }) - : null; - - return createPool({ - tokenA: tokenA, - tokenB: tokenB, - fee: fee, - sqrtRatioX96: state.sqrtPriceX96, - liquidity: state.liquidity, - tickCurrent: state.tick, - ticks: ticks, - }); -} - -/** - * returns pool object constructed from on-chain pool contract - * @param args.address the Ethereum address of the pool contract - * @param args.chainId the id of the chain to be queried - * @param args.fetchTicks if true, the full list of pool ticks will be fetched - */ -export function fetchPoolFromAddress(args: Args_fetchPoolFromAddress): Pool { - const chainId: ChainId = args.chainId; - const address: string = args.address.toLowerCase(); - const fetchTicks = args.fetchTicks; - // fetch data - const immutables: PoolImmutables = fetchPoolImmutables(address, chainId); - const state: PoolState = fetchPoolState(address, chainId); - const ticks: Tick[] | null = fetchTicks - ? fetchTickList({ address, chainId }) - : null; - - return createPool({ - tokenA: fetchToken({ address: immutables.token0, chainId: chainId }), - tokenB: fetchToken({ address: immutables.token1, chainId: chainId }), - fee: immutables.fee, - sqrtRatioX96: state.sqrtPriceX96, - liquidity: state.liquidity, - tickCurrent: state.tick, - ticks: ticks, - }); -} - -/** - * returns array of ticks from on-chain pool contract at given address - * @param args.address the Ethereum address of the pool contract - * @param args.chainId the id of the chain to be queried - */ -export function fetchTickList(args: Args_fetchTickList): Tick[] { - return fetchAllTicks(args.address, args.chainId); -} - -function fetchPoolImmutables( - address: string, - chainId: ChainId -): PoolImmutables { - const token0: string = ethCallView(address, chainId, poolAbi("token0")); - const token1: string = ethCallView(address, chainId, poolAbi("token1")); - const fee: string = ethCallView(address, chainId, poolAbi("fee")); - return { - token0, - token1, - fee: getFeeAmountEnum(U32.parseInt(fee)), - }; -} - -function fetchPoolState(address: string, chainId: ChainId): PoolState { - const liquidity: string = ethCallView(address, chainId, poolAbi("liquidity")); - const slot0Str: string = ethCallView(address, chainId, poolAbi("slot0")); - const slot0: string[] = slot0Str - .replaceAll('"', "") - .replace("[", "") - .split(","); - return { - liquidity: BigInt.fromString(liquidity), - sqrtPriceX96: BigInt.fromString(slot0[0]), - tick: I32.parseInt(slot0[1]), - }; -} - -function fetchPoolTicksSubgraph( - address: string, - chainId: ChainId, - skip: i32 = 0 -): Tick[] { - const endpoint: SubgraphEndpoint = getSubgraphEndpoint(chainId); - const query: JSON.Obj = subgraphQuery({ - subgraphAuthor: endpoint.author, - subgraphName: endpoint.name, - query: ` - query { - ticks(first: 1000, skip: ${skip}, where: { poolAddress: "${address}" }, orderBy: tickIdx) { - tickIdx - liquidityGross - liquidityNet - } - }`, - }); - return query - .getArr("ticks")! - .valueOf() - .map( - (v: JSON.Value, _i: i32, _arr: JSON.Value[]): Tick => { - const jsonObj: JSON.Obj = v; - const index: string = jsonObj.getString("tickIdx")!.valueOf(); - const liqGross: string = jsonObj.getString("liquidityGross")!.valueOf(); - const liqNet: string = jsonObj.getString("liquidityNet")!.valueOf(); - return { - index: I32.parseInt(index), - liquidityGross: BigInt.fromString(liqGross), - liquidityNet: BigInt.fromString(liqNet), - }; - } - ); -} - -function fetchAllTicks(address: string, chainId: ChainId): Tick[] { - let skip: i32 = 0; - let ticks: Tick[] = fetchPoolTicksSubgraph(address, chainId, skip); - while (ticks.length % 1000 === 0) { - skip += 1000; - const query = fetchPoolTicksSubgraph(address, chainId, skip); - ticks = ticks.concat(query); - } - return ticks; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/index.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/index.ts deleted file mode 100644 index 8cb8ef251..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * from "./addressUtils"; -export * from "./call"; -export * from "./constants"; -export * from "./invokableConstants"; -export * from "./deployPool"; -export * from "./enumUtils"; -export * from "./fetch"; -export * from "./Fraction"; -export * from "./mathUtils"; -export * from "./Price"; -export * from "./PriorityQueue"; -export * from "./quoter"; -export * from "./staker"; diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/invokableConstants.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/invokableConstants.ts deleted file mode 100644 index e5490a95f..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/invokableConstants.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - _FACTORY_ADDRESS, - _POOL_INIT_CODE_HASH, - _MIN_TICK, - _MAX_TICK, - _MIN_SQRT_RATIO, - _MAX_SQRT_RATIO, -} from "./constants"; -import { - Args_FACTORY_ADDRESS, - Args_MAX_SQRT_RATIO, - Args_MAX_TICK, - Args_MIN_SQRT_RATIO, - Args_MIN_TICK, - Args_POOL_INIT_CODE_HASH, -} from "../wrap"; - -import { BigInt } from "@polywrap/wasm-as"; - -export const FACTORY_ADDRESS = (_: Args_FACTORY_ADDRESS): string => - _FACTORY_ADDRESS; - -export const POOL_INIT_CODE_HASH = (_: Args_POOL_INIT_CODE_HASH): string => - _POOL_INIT_CODE_HASH; - -export const MIN_TICK = (_: Args_MIN_TICK): i32 => _MIN_TICK; - -export const MAX_TICK = (_: Args_MAX_TICK): i32 => _MAX_TICK; - -export const MIN_SQRT_RATIO = (_: Args_MIN_SQRT_RATIO): BigInt => - _MIN_SQRT_RATIO; - -export const MAX_SQRT_RATIO = (_: Args_MAX_SQRT_RATIO): BigInt => - _MAX_SQRT_RATIO; diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/mathUtils.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/mathUtils.ts deleted file mode 100644 index 44f1a1dfb..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/mathUtils.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { - Args_addDelta, - Args_encodeSqrtRatioX96, - Args_getAmount0Delta, - Args_getAmount1Delta, - Args_getNextSqrtPriceFromInput, - Args_getNextSqrtPriceFromOutput, - Args_mostSignificantBit, - Args_mulDivRoundingUp, -} from "../wrap"; -import { MAX_UINT_160, MAX_UINT_256, Q96 } from "../utils"; - -import { BigInt } from "@polywrap/wasm-as"; - -/** - * Returns the most significant bit of a positive integer, starting with first bit = 0 - */ -export function mostSignificantBit(args: Args_mostSignificantBit): u32 { - const x: BigInt = args.x; - if (x.isNegative || x.isZero()) { - throw new Error("ZERO: input is less than or equal to zero"); - } - return x.countBits() - 1; -} - -/** - * Returns the sqrt ratio as a Q64.96 corresponding to a given ratio of amount1 and amount0 - * @param args.amount1 The numerator amount i.e., the amount of token1 - * @param args.amount0 The denominator amount i.e., the amount of token0 - */ -export function encodeSqrtRatioX96(args: Args_encodeSqrtRatioX96): BigInt { - const numerator: BigInt = args.amount1.leftShift(192); - const denominator: BigInt = args.amount0; - const ratioX192: BigInt = BigInt.div(numerator, denominator); - return ratioX192.sqrt(); -} - -/** - * fullMath - */ -export function mulDivRoundingUp(args: Args_mulDivRoundingUp): BigInt { - const a: BigInt = args.a; - const b: BigInt = args.b; - const denominator: BigInt = args.denominator; - - const product = BigInt.mul(a, b); - let result = BigInt.div(product, denominator); - if (product.mod(denominator) != BigInt.ZERO) { - result = result.add(BigInt.ONE); - } - return result; -} - -/** - * liquidityMath - */ -export function addDelta(args: Args_addDelta): BigInt { - const x: BigInt = args.x; - const y: BigInt = args.y; - // this if branch seems pointless since it's mathematically the same thing. Why does Uniswap SDK do this? - // positive y: x + y - // negative y: x - (-1 * -y) = x - y = x + -y; - // if (y.isNegative) { - // return x.sub(y.opposite()); - // } - return x.add(y); -} - -/** - * sqrtPriceMath - */ -export function getAmount0Delta(args: Args_getAmount0Delta): BigInt { - const liquidity: BigInt = args.liquidity; - const roundUp: boolean = args.roundUp; - - let sqrtRatioAX96: BigInt; - let sqrtRatioBX96: BigInt; - if (args.sqrtRatioAX96 <= args.sqrtRatioBX96) { - sqrtRatioAX96 = args.sqrtRatioAX96; - sqrtRatioBX96 = args.sqrtRatioBX96; - } else { - sqrtRatioAX96 = args.sqrtRatioBX96; - sqrtRatioBX96 = args.sqrtRatioAX96; - } - - const numerator1: BigInt = liquidity.leftShift(96); - const numerator2: BigInt = sqrtRatioBX96.sub(sqrtRatioAX96); - - if (roundUp) { - const a: BigInt = mulDivRoundingUp({ - a: numerator1, - b: numerator2, - denominator: sqrtRatioBX96, - }); - return mulDivRoundingUp({ - a: a, - b: BigInt.ONE, - denominator: sqrtRatioAX96, - }); - } - return numerator1.mul(numerator2).div(sqrtRatioBX96).div(sqrtRatioAX96); -} - -/** - * sqrtPriceMath - */ -export function getAmount1Delta(args: Args_getAmount1Delta): BigInt { - const liquidity: BigInt = args.liquidity; - const roundUp: boolean = args.roundUp; - - let sqrtRatioAX96: BigInt; - let sqrtRatioBX96: BigInt; - if (args.sqrtRatioAX96 <= args.sqrtRatioBX96) { - sqrtRatioAX96 = args.sqrtRatioAX96; - sqrtRatioBX96 = args.sqrtRatioBX96; - } else { - sqrtRatioAX96 = args.sqrtRatioBX96; - sqrtRatioBX96 = args.sqrtRatioAX96; - } - - return roundUp - ? mulDivRoundingUp({ - a: liquidity, - b: sqrtRatioBX96.sub(sqrtRatioAX96), - denominator: Q96, - }) - : sqrtRatioBX96.sub(sqrtRatioAX96).mul(liquidity).div(Q96); -} - -/** - * sqrtPriceMath - */ -export function getNextSqrtPriceFromInput( - args: Args_getNextSqrtPriceFromInput -): BigInt { - const sqrtPX96: BigInt = args.sqrtPX96; - const liquidity: BigInt = args.liquidity; - const amountIn: BigInt = args.amountIn; - const zeroForOne: boolean = args.zeroForOne; - - if (sqrtPX96 <= BigInt.ZERO) { - throw new Error("sqrtPX96 <= 0"); - } - if (liquidity <= BigInt.ZERO) { - throw new Error("liquidity <= 0"); - } - - return zeroForOne - ? getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountIn, true) - : getNextSqrtPriceFromAmount1RoundingDown( - sqrtPX96, - liquidity, - amountIn, - true - ); -} - -/** - * sqrtPriceMath - */ -export function getNextSqrtPriceFromOutput( - args: Args_getNextSqrtPriceFromOutput -): BigInt { - const sqrtPX96: BigInt = args.sqrtPX96; - const liquidity: BigInt = args.liquidity; - const amountOut: BigInt = args.amountOut; - const zeroForOne: boolean = args.zeroForOne; - - if (sqrtPX96 <= BigInt.ZERO) { - throw new Error("sqrtPX96 <= 0"); - } - if (liquidity <= BigInt.ZERO) { - throw new Error("liquidity <= 0"); - } - - return zeroForOne - ? getNextSqrtPriceFromAmount1RoundingDown( - sqrtPX96, - liquidity, - amountOut, - false - ) - : getNextSqrtPriceFromAmount0RoundingUp( - sqrtPX96, - liquidity, - amountOut, - false - ); -} - -/** - * sqrtPriceMath - */ -function multiplyIn256(x: BigInt, y: BigInt): BigInt { - const product: BigInt = x.mul(y); - return BigInt.bitwiseAnd(product, MAX_UINT_256); -} - -/** - * sqrtPriceMath - */ -function addIn256(x: BigInt, y: BigInt): BigInt { - const sum: BigInt = x.add(y); - return BigInt.bitwiseAnd(sum, MAX_UINT_256); -} - -/** - * sqrtPriceMath - */ -function getNextSqrtPriceFromAmount0RoundingUp( - sqrtPX96: BigInt, - liquidity: BigInt, - amount: BigInt, - add: boolean -): BigInt { - if (amount == BigInt.ZERO) { - return sqrtPX96; - } - const numerator1: BigInt = liquidity.leftShift(96); - const product: BigInt = multiplyIn256(amount, sqrtPX96); - - if (add) { - if (product.div(amount) == sqrtPX96) { - const denominator: BigInt = addIn256(numerator1, product); - if (denominator >= numerator1) { - return mulDivRoundingUp({ - a: numerator1, - b: sqrtPX96, - denominator: denominator, - }); - } - } - const denominator: BigInt = numerator1.div(sqrtPX96).add(amount); - return mulDivRoundingUp({ - a: numerator1, - b: BigInt.ONE, - denominator: denominator, - }); - } else { - if (product.div(amount) != sqrtPX96) { - throw new Error("SQRT_PRICE_MATH: invariant failed"); - } - if (numerator1 <= product) { - throw new Error("SQRT_PRICE_MATH: invariant failed"); - } - const denominator = numerator1.sub(product); - return mulDivRoundingUp({ - a: numerator1, - b: sqrtPX96, - denominator: denominator, - }); - } -} - -/** - * sqrtPriceMath - */ -function getNextSqrtPriceFromAmount1RoundingDown( - sqrtPX96: BigInt, - liquidity: BigInt, - amount: BigInt, - add: boolean -): BigInt { - if (add) { - const quotient: BigInt = - amount <= MAX_UINT_160 - ? amount.leftShift(96).div(liquidity) - : amount.mul(Q96).div(liquidity); - - return sqrtPX96.add(quotient); - } else { - const quotient: BigInt = mulDivRoundingUp({ - a: amount, - b: Q96, - denominator: liquidity, - }); - if (sqrtPX96 <= quotient) { - throw new Error("SQRT_PRICE_MATH: invariant failed"); - } - return sqrtPX96.sub(quotient); - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/poolView.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/poolView.ts deleted file mode 100644 index 899083c84..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/poolView.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { ChainId, Ethereum_Module, FeeAmount, getChainIdKey } from "../wrap"; - -import { BigInt } from "@polywrap/wasm-as"; - -export class PoolImmutables { - token0: string; - token1: string; - fee: FeeAmount; -} - -export class PoolState { - liquidity: BigInt; - sqrtPriceX96: BigInt; - tick: i32; -} - -export function poolAbi(methodName: string): string { - if (methodName == "token0") { - return "function token0() external view returns (address)"; - } else if (methodName == "token1") { - return "function token1() external view returns (address)"; - } else if (methodName == "fee") { - return "function fee() external view returns (uint24)"; - } else if (methodName == "liquidity") { - return "function liquidity() external view returns (uint128)"; - } else if (methodName == "slot0") { - return "function slot0() external view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)"; - } else if (methodName == "ticks") { - return "function ticks(int24 tick) external view returns (uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128, int56 tickCumulativeOutside, uint160 secondsPerLiquidityOutsideX128, uint32 secondsOutside, bool initialized)"; - } else { - throw new Error("Invalid method name: " + methodName); - } -} - -export function ethCallView( - address: string, - chainId: ChainId, - method: string -): string { - return Ethereum_Module.callContractView({ - address: address, - method: method, - args: [], - connection: { - node: null, - networkNameOrChainId: getChainIdKey(chainId), - }, - }).unwrap(); -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/quoter.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/quoter.ts deleted file mode 100644 index 2d1bbf0c5..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/quoter.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ - -import { - Ethereum_Module, - Args_quoteCallParameters, - MethodParameters, - QuoteOptions, - Route, - TokenAmount, - TradeType, -} from "../wrap"; -import { encodeRouteToPath, toHex } from "../router"; -import { _getFeeAmount, ZERO_HEX } from "../utils"; - -/** - * Produces the on-chain method name of the appropriate function within QuoterV2, and the relevant hex encoded parameters. - * @param args.route The swap route, a list of pools through which a swap can occur - * @param args.amount The amount of the quote, either an amount in, or an amount out - * @param args.tradeType The trade type, either exact input or exact output - */ -export function quoteCallParameters( - args: Args_quoteCallParameters -): MethodParameters { - const route: Route = args.route; - const tokenAmount: TokenAmount = args.amount; - const tradeType: TradeType = args.tradeType; - const options: QuoteOptions | null = args.options; - - const singleHop: boolean = route.pools.length == 1; - const quoteAmount: string = toHex({ value: tokenAmount.amount }); - let calldata: string; - - if (singleHop) { - if (tradeType == TradeType.EXACT_INPUT) { - calldata = Ethereum_Module.encodeFunction({ - method: quoterAbi("quoteExactInputSingle"), - args: [ - route.path[0].address, - route.path[1].address, - _getFeeAmount(route.pools[0].fee).toString(), - quoteAmount, - options !== null && options.sqrtPriceLimitX96 !== null - ? toHex({ value: options.sqrtPriceLimitX96! }) - : ZERO_HEX, - ], - }).unwrap(); - } else { - calldata = Ethereum_Module.encodeFunction({ - method: quoterAbi("quoteExactOutputSingle"), - args: [ - route.path[0].address, - route.path[1].address, - _getFeeAmount(route.pools[0].fee).toString(), - quoteAmount, - options !== null && options.sqrtPriceLimitX96 !== null - ? toHex({ value: options.sqrtPriceLimitX96! }) - : ZERO_HEX, - ], - }).unwrap(); - } - } else { - if (options !== null && options.sqrtPriceLimitX96 !== null) { - throw new Error( - "MULTIHOP_PRICE_LIMIT: cannot use price limit options with multi-hop quote" - ); - } - - const path: string = encodeRouteToPath({ - route, - exactOutput: tradeType == TradeType.EXACT_OUTPUT, - }); - - if (tradeType == TradeType.EXACT_INPUT) { - calldata = calldata = Ethereum_Module.encodeFunction({ - method: quoterAbi("quoteExactInput"), - args: [path, quoteAmount], - }).unwrap(); - } else { - calldata = calldata = Ethereum_Module.encodeFunction({ - method: quoterAbi("quoteExactOutput"), - args: [path, quoteAmount], - }).unwrap(); - } - } - return { - calldata, - value: ZERO_HEX, - }; -} - -function quoterAbi(methodName: string): string { - if (methodName == "quoteExactInputSingle") { - return "function quoteExactInputSingle(address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96) external returns (uint256 amountOut)"; - } else if (methodName == "quoteExactOutputSingle") { - return "function quoteExactOutputSingle(address tokenIn, address tokenOut, uint24 fee, uint256 amountOut, uint160 sqrtPriceLimitX96) external returns (uint256 amountIn)"; - } else if (methodName == "quoteExactInput") { - return "function quoteExactInput(bytes memory path, uint256 amountIn) external returns (uint256 amountOut)"; - } else if (methodName == "quoteExactOutput") { - return "function quoteExactOutput(bytes memory path, uint256 amountOut) external returns (uint256 amountIn)"; - } else { - throw new Error("Invalid method name: " + methodName); - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/staker.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/staker.ts deleted file mode 100644 index 1db1e8304..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/staker.ts +++ /dev/null @@ -1,189 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ - -import { - ClaimOptions, - Ethereum_Module, - FullWithdrawOptions, - IncentiveKey, - Args_collectRewards, - Args_encodeDeposit, - Args_withdrawToken, - MethodParameters, -} from "../wrap"; -import { encodeMulticall, toHex } from "../router"; -import { getChecksumAddress } from "./addressUtils"; -import { getPoolAddress } from "../pool"; -import { ZERO_HEX } from "./constants"; - -import { BigInt } from "@polywrap/wasm-as"; - -/** - * Returns the calldatas for 'unstakeToken', 'claimReward', and 'stakeToken'. - * Note: A `tokenId` can be staked in many programs but to claim rewards and continue the program you must unstake, claim, and then restake. - * @param args.incentiveKeys An array of IncentiveKeys that `tokenId` is staked in; claims rewards for each program. - * @param args.options ClaimOptions to specify tokenId, recipient, and amount wanting to collect. Note that you can only specify one amount and one recipient across the various programs if you are collecting from multiple programs at once. - */ -export function collectRewards(args: Args_collectRewards): MethodParameters { - const incentiveKeys: IncentiveKey[] = args.incentiveKeys; - const options: ClaimOptions = args.options; - - let calldatas: string[] = []; - - for (let i = 0; i < incentiveKeys.length; i++) { - // the unique program tokenId is staked in - const incentiveKey: IncentiveKey = incentiveKeys[i]; - // unstakes and claims for the unique program - calldatas = calldatas.concat(encodeClaim(incentiveKey, options)); - // re-stakes the position for the unique program - calldatas.push( - Ethereum_Module.encodeFunction({ - method: stakerAbi("stakeToken"), - args: [ - encodeIncentiveKey(incentiveKey), - toHex({ value: options.tokenId }), - ], - }).unwrap() - ); - } - return { - calldata: encodeMulticall({ calldatas }), - value: ZERO_HEX, - }; -} - -/** - * Returns calldata for unstaking, claiming, and withdrawing. - * @param args.incentiveKeys A list of incentiveKeys to unstake from. Should include all incentiveKeys (unique staking programs) that `options.tokenId` is staked in. - * @param args.options Options for producing claim calldata and withdraw calldata. Can't withdraw without unstaking all programs for `tokenId`. - */ -export function withdrawToken(args: Args_withdrawToken): MethodParameters { - const incentiveKeys: IncentiveKey[] = args.incentiveKeys; - const options: FullWithdrawOptions = args.options; - - let calldatas: string[] = []; - - const claimOptions: ClaimOptions = { - tokenId: options.tokenId, - recipient: options.recipient, - amount: options.amount, - }; - - for (let i = 0; i < incentiveKeys.length; i++) { - const incentiveKey: IncentiveKey = incentiveKeys[i]; - calldatas = calldatas.concat(encodeClaim(incentiveKey, claimOptions)); - } - const owner: string = getChecksumAddress(options.owner); - calldatas.push( - Ethereum_Module.encodeFunction({ - method: stakerAbi("withdrawToken"), - args: [ - toHex({ value: options.tokenId }), - owner, - options.data === null ? ZERO_HEX : options.data!, - ], - }).unwrap() - ); - return { - calldata: encodeMulticall({ calldatas }), - value: ZERO_HEX, - }; -} - -/** - * Returns an encoded IncentiveKey as a string - * @param args.incentiveKeys A single IncentiveKey or array of IncentiveKeys to be encoded and used in the data parameter in `safeTransferFrom` - */ -export function encodeDeposit(args: Args_encodeDeposit): string { - const incentiveKeys: IncentiveKey[] = args.incentiveKeys; - - let data: string; - - if (incentiveKeys.length > 1) { - const keys: string[] = []; - for (let i = 0; i < incentiveKeys.length; i++) { - keys.push(encodeIncentiveKey(incentiveKeys[i])); - } - data = Ethereum_Module.encodeParams({ - types: [`${stakerAbi("INCENTIVE_KEY_ABI")}[]`], - values: ["[" + keys.join(", ") + "]"], - }).unwrap(); - } else { - data = Ethereum_Module.encodeParams({ - types: [stakerAbi("INCENTIVE_KEY_ABI")], - values: [encodeIncentiveKey(incentiveKeys[0])], - }).unwrap(); - } - return data; -} - -/** - * To claim rewards, must unstake and then claim. - * @param incentiveKey The unique identifier of a staking program. - * @param options Options for producing the calldata to claim. Can't claim unless you unstake. - * @returns The calldatas for 'unstakeToken' and 'claimReward'. - */ -function encodeClaim( - incentiveKey: IncentiveKey, - options: ClaimOptions -): string[] { - const calldatas: string[] = []; - calldatas.push( - Ethereum_Module.encodeFunction({ - method: stakerAbi("unstakeToken"), - args: [ - encodeIncentiveKey(incentiveKey), - toHex({ value: options.tokenId }), - ], - }).unwrap() - ); - const recipient: string = getChecksumAddress(options.recipient); - const amount: BigInt = - options.amount === null ? BigInt.ZERO : options.amount!; - calldatas.push( - Ethereum_Module.encodeFunction({ - method: stakerAbi("claimReward"), - args: [ - incentiveKey.rewardToken.address, - recipient, - toHex({ value: amount }), - ], - }).unwrap() - ); - return calldatas; -} - -/** - * - * @param incentiveKey An `IncentiveKey` which represents a unique staking program. - * @returns An encoded IncentiveKey to be read by ethers - */ -function encodeIncentiveKey(incentiveKey: IncentiveKey): string { - return `{ - "rewardToken": "${incentiveKey.rewardToken.address}", - "pool": "${getPoolAddress({ - tokenA: incentiveKey.pool.token0, - tokenB: incentiveKey.pool.token1, - fee: incentiveKey.pool.fee, - initCodeHashManualOverride: null, - })}", - "startTime": "${toHex({ value: incentiveKey.startTime })}", - "endTime": "${toHex({ value: incentiveKey.endTime })}", - "refundee": "${getChecksumAddress(incentiveKey.refundee)}" - }`; -} - -function stakerAbi(methodName: string): string { - if (methodName == "INCENTIVE_KEY_ABI") { - return "tuple(address rewardToken, address pool, uint256 startTime, uint256 endTime, address refundee)"; - } else if (methodName == "unstakeToken") { - return `function unstakeToken(${stakerAbi("INCENTIVE_KEY_ABI")} memory key, uint256 tokenId) external`; // eslint-disable-line - } else if (methodName == "stakeToken") { - return `function stakeToken(${stakerAbi("INCENTIVE_KEY_ABI")} memory key, uint256 tokenId) external`; // eslint-disable-line - } else if (methodName == "claimReward") { - return "function claimReward(address rewardToken, address to, uint256 amountRequested) external returns (uint256 reward)"; - } else if (methodName == "withdrawToken") { - return "function withdrawToken(uint256 tokenId, address to, bytes memory data) external"; - } else { - throw new Error("Invalid method name: " + methodName); - } -} diff --git a/protocol/ethereum/uniswapv3/wrapper/src/utils/subgraph.ts b/protocol/ethereum/uniswapv3/wrapper/src/utils/subgraph.ts deleted file mode 100644 index 2544d1909..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/src/utils/subgraph.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ChainId, Subgraph_Module } from "../wrap"; - -import { JSON } from "@polywrap/wasm-as"; - -export class SubgraphEndpoint { - author: string; - name: string; -} - -export class QueryArgs { - subgraphAuthor: string; - subgraphName: string; - query: string; -} - -export function getSubgraphEndpoint(chainId: ChainId): SubgraphEndpoint { - switch (chainId) { - case ChainId.MAINNET: - case ChainId.RINKEBY: - return { author: "uniswap", name: "uniswap-v3" }; - case ChainId.OPTIMISM: - return { author: "ianlapham", name: "uniswap-optimism-dev" }; - case ChainId.ARBITRUM_ONE: - return { author: "ianlapham", name: "arbitrum-minimal" }; - default: - throw new Error("Unknown or Unsupported chain ID"); - } -} - -export function subgraphQuery(args: QueryArgs): JSON.Obj { - const response = Subgraph_Module.querySubgraph({ - subgraphAuthor: args.subgraphAuthor, - subgraphName: args.subgraphName, - query: args.query, - }).unwrap(); - - const json = JSON.parse(response); - - if (!json.isObj) { - throw new Error( - "Subgraph response is not an object.\n" + - `Author: ${args.subgraphAuthor}\n` + - `Subgraph: ${args.subgraphName}\n` + - `Query: ${args.query}\n` + - `Response: ${response}` - ); - } - - const obj = json as JSON.Obj; - return obj.valueOf().get("data") as JSON.Obj; -} diff --git a/protocol/ethereum/uniswapv3/wrapper/tsconfig.json b/protocol/ethereum/uniswapv3/wrapper/tsconfig.json deleted file mode 100644 index 5deb5ae5f..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./node_modules/assemblyscript/std/assembly.json", - "compilerOptions": { - "outDir": "build" - }, - "include": [ - "./src/**/*.ts", - ], - "exclude": [ - "./src/__tests__/e2e/**/*.ts" - ] -} \ No newline at end of file diff --git a/protocol/ethereum/uniswapv3/wrapper/tsconfig.ts.json b/protocol/ethereum/uniswapv3/wrapper/tsconfig.ts.json deleted file mode 100644 index 5b475c322..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/tsconfig.ts.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "compilerOptions": { - "lib": [ - "es2020", - "es2015", - "es5", - "dom" - ], - "esModuleInterop": true, - "outDir": "build", - "moduleResolution": "node", - "declaration": true, - "preserveSymlinks": true, - "preserveWatchOutput": true, - "pretty": false, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noUnusedLocals": true, - "module": "commonjs", - "sourceMap": true, - "target": "es5", - "resolveJsonModule": true, - "strictNullChecks": true - }, - "include": [ - "./src/__tests__/e2e/**/*.ts" - ], - "exclude": [ - "./src/__tests__/unit/**/*.ts", - ] -} diff --git a/protocol/ethereum/uniswapv3/wrapper/yarn.lock b/protocol/ethereum/uniswapv3/wrapper/yarn.lock deleted file mode 100644 index f37deb156..000000000 --- a/protocol/ethereum/uniswapv3/wrapper/yarn.lock +++ /dev/null @@ -1,7482 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@apidevtools/json-schema-ref-parser@9.0.9": - version "9.0.9" - resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#d720f9256e3609621280584f2b47ae165359268b" - integrity sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w== - dependencies: - "@jsdevtools/ono" "^7.1.3" - "@types/json-schema" "^7.0.6" - call-me-maybe "^1.0.1" - js-yaml "^4.1.0" - -"@as-covers/assembly@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@as-covers/assembly/-/assembly-0.2.0.tgz#6f335834483ddf91b21da06955bd86647f9e8db9" - integrity sha512-3Mo0pdLmaorJPqookq10LmJlWIpyXF/D9JWjphMtv5Th23yO537t6vMGi92uKe35d07k2xMOH/4WRHi04mlk6Q== - -"@as-covers/core@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@as-covers/core/-/core-0.2.1.tgz#362a4719a1901d416941f5425b63fa46288ce8e6" - integrity sha512-/GGTzPB850shvL6ZiidKDmIXSpBflYfzhYyipe7HA1eijBQKKluaLSRy/JLSN53f6kp3tLrCevPXN6HA2fyuBw== - dependencies: - "@as-covers/assembly" "^0.2.0" - "@as-covers/glue" "^0.2.0" - "@as-covers/transform" "^0.2.1" - -"@as-covers/glue@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@as-covers/glue/-/glue-0.2.0.tgz#c829491bcda643087259675361efba300d477615" - integrity sha512-oIRC3q5TA4zfNBv+UwNH10FKq1poAeRTrZUg5pmEcFNv2HpZfED30mb9fF0anNRbr7gmXrSY9iMsRSz6hkrmYQ== - dependencies: - csv-stringify "^5.6.2" - table "^6.7.1" - -"@as-covers/transform@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@as-covers/transform/-/transform-0.2.1.tgz#ea3cb56371493ba77b5761766d3ef46aba36d7c0" - integrity sha512-FutGj2yMIT2GOfqXrbnqSpeZ0eB5Bsnsg+BLnmqpEszthFhe/5/hKYmfNsiF2QBYZnqcIQ7dHw/z31+PlyUDug== - dependencies: - line-column "^1.0.2" - visitor-as "^0.6.0" - -"@as-pect/assembly@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@as-pect/assembly/-/assembly-6.2.0.tgz#29a0efa173df321354b76d92228e46944159ba95" - integrity sha512-jYr1jdlr0xNndIhOpTMBaPHmlhD/c3PcVCzow8wIkzLxgcSOzhBkqjip+LWPWGsiFK1vsZ8ZUaMTeK3fcnXQhw== - -"@as-pect/cli@6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@as-pect/cli/-/cli-6.2.4.tgz#83476d235a6bfb9052e78cef24e450c199ae9146" - integrity sha512-OSWehx90djGxgR4RxFZKixRyh9hsMLNM/6otayAljijEPjiD1zS2lxu3WCu/DiwSWIRJUYdGOUVzw15nqvdcZQ== - dependencies: - "@as-covers/core" "0.2.1" - "@as-pect/assembly" "^6.2.0" - "@as-pect/core" "^6.2.1" - chalk "^4.1.1" - glob "^7.1.7" - optionalDependencies: - "@as-pect/csv-reporter" "^6.2.1" - "@as-pect/json-reporter" "^6.2.1" - -"@as-pect/core@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@as-pect/core/-/core-6.2.1.tgz#fa1f3658e337506c19df7944f75a8ba7b13aed97" - integrity sha512-JnvUb55OhGP7CYUnYtsLXttUb+FGv+6kEN9NleTbIMvU73NFJzyTCGjoZuayPNpfiUzOF96j91XuMHuinJ8BAg== - dependencies: - "@as-pect/assembly" "^6.2.0" - "@as-pect/snapshots" "^6.2.1" - chalk "^4.1.1" - long "^4.0.0" - -"@as-pect/csv-reporter@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@as-pect/csv-reporter/-/csv-reporter-6.2.1.tgz#fe7e23ac2d811e2519006ccc82f5245adcaad526" - integrity sha512-jy8ka8dEP4UY/pK/OIjHFUqs4j2Hvw3r6no6XfX1AkOd9CRLlt/JIDddlzwEqCGEfF83GSBQfQ1At86FkE7RtA== - dependencies: - "@as-pect/core" "^6.2.1" - -"@as-pect/json-reporter@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@as-pect/json-reporter/-/json-reporter-6.2.1.tgz#a77c3257aed8e5b1e5175509fb1046c1f94851cf" - integrity sha512-vsTYOiqB42+WPpec0M3apm9P2SjstUe6MfXepDvVIu2DCZzt1rkEuIIXro13LLQCnOzwXgHO/00sn+uPEjsmSQ== - dependencies: - "@as-pect/core" "^6.2.1" - -"@as-pect/snapshots@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@as-pect/snapshots/-/snapshots-6.2.1.tgz#237ed3b958e85b3e527a0e9f43292813b6dbf789" - integrity sha512-a6xcOUaXMrR3f1n6vgGxMJxUUd6MIVm5vlQ3nZ2hDEMz1PFyEQ04OvGqqUIYHhKAeXIvD3iwz02cI8Wh9lDK7Q== - dependencies: - diff "^5.0.0" - nearley "^2.20.1" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - 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.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" - integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.10" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.10" - "@babel/types" "^7.18.10" - 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.18.10": - version "7.18.12" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" - integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== - dependencies: - "@babel/types" "^7.18.10" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - 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.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - 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-module-imports@^7.18.6": - version "7.18.6" - 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.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@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-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - 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-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - 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.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/highlight@^7.18.6": - version "7.18.6" - 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.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.11": - version "7.18.11" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" - integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - 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-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - 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-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3": - 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.10" - "@babel/types" "^7.18.10" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": - version "7.18.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" - integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.11" - "@babel/types" "^7.18.10" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" - integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@dorgjelli/graphql-schema-cycles@1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@dorgjelli/graphql-schema-cycles/-/graphql-schema-cycles-1.1.4.tgz#31f230c61f624f7c2ceca7e18fad8b2cb07d392f" - integrity sha512-U5ARitMQWKjOAvwn1+0Z52R9sbNe1wpbgAbj2hOfRFb/vupfPlRwZLbuUZAlotMpkoxbTbk+GRmoiNzGcJfyHw== - dependencies: - graphql "15.5.0" - graphql-json-transform "^1.1.0-alpha.0" - -"@eslint/eslintrc@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" - integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.19" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.12", "@ethersproject/abi@^5.6.3": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362" - integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== - dependencies: - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/abstract-provider@^5.0.0", "@ethersproject/abstract-provider@^5.0.3", "@ethersproject/abstract-provider@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" - integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.3" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/web" "^5.6.1" - -"@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.0.3", "@ethersproject/abstract-signer@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" - integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/address@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.7.tgz#ee7fd7d3b3a400dec6035c7b3f0b7e4652207308" - integrity sha512-+63DiYG+2og6rFNvQmLlLw8i5LtyT65n+jtHd06Ic81rLHc+JUKRpeZFhBa+gqh9f+P8V0xtKR5NI/EHXOfgSw== - dependencies: - "@ethersproject/bignumber" "^5.0.10" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/rlp" "^5.0.3" - -"@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.3", "@ethersproject/address@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" - integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.1" - -"@ethersproject/base64@^5.0.0", "@ethersproject/base64@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" - integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - -"@ethersproject/basex@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.7.tgz#2f7026b12c9dee6cdc7b7bf1805461836e635495" - integrity sha512-OsXnRsujGmYD9LYyJlX+cVe5KfwgLUbUJrJMWdzRWogrygXd5HvGd7ygX1AYjlu1z8W/+t2FoQnczDR/H2iBjA== - dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/properties" "^5.0.7" - -"@ethersproject/basex@^5.0.3", "@ethersproject/basex@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305" - integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.0.10", "@ethersproject/bignumber@^5.0.6", "@ethersproject/bignumber@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" - integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.0.9", "@ethersproject/bytes@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.0.3", "@ethersproject/constants@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" - integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - -"@ethersproject/contracts@^5.0.0": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc" - integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g== - dependencies: - "@ethersproject/abi" "^5.6.3" - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.2" - -"@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.0.3", "@ethersproject/hash@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" - integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/hdnode@^5.0.0", "@ethersproject/hdnode@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2" - integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/basex" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.1" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/wordlists" "^5.6.1" - -"@ethersproject/json-wallets@^5.0.0", "@ethersproject/json-wallets@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91" - integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hdnode" "^5.6.2" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.1" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" - integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== - dependencies: - "@ethersproject/bytes" "^5.6.1" - js-sha3 "0.8.0" - -"@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" - integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== - -"@ethersproject/networks@^5.0.0", "@ethersproject/networks@^5.0.3", "@ethersproject/networks@^5.6.3": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07" - integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/pbkdf2@^5.0.0", "@ethersproject/pbkdf2@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1" - integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/sha2" "^5.6.1" - -"@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.7", "@ethersproject/properties@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" - integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/providers@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.7.tgz#8dfb9eacb36d3c05c08831f71ad43fb46d2aaec6" - integrity sha512-lT+w/w2PKX9oyddX0DTBYl2CVHJTJONZP5HLJ3MzVvSA5dTOdiJ9Sx5rpqR7Tw+mxVA9xPjanoNCaPPIT7cykQ== - dependencies: - "@ethersproject/abstract-provider" "^5.0.3" - "@ethersproject/abstract-signer" "^5.0.3" - "@ethersproject/address" "^5.0.3" - "@ethersproject/basex" "^5.0.3" - "@ethersproject/bignumber" "^5.0.6" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.3" - "@ethersproject/hash" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/networks" "^5.0.3" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/random" "^5.0.3" - "@ethersproject/rlp" "^5.0.3" - "@ethersproject/sha2" "^5.0.3" - "@ethersproject/strings" "^5.0.3" - "@ethersproject/transactions" "^5.0.3" - "@ethersproject/web" "^5.0.4" - bech32 "1.1.4" - ws "7.2.3" - -"@ethersproject/providers@5.6.8", "@ethersproject/providers@^5.0.0": - version "5.6.8" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d" - integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/base64" "^5.6.1" - "@ethersproject/basex" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.3" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/rlp" "^5.6.1" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/web" "^5.6.1" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@^5.0.0", "@ethersproject/random@^5.0.3", "@ethersproject/random@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255" - integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/rlp@^5.0.0", "@ethersproject/rlp@^5.0.3", "@ethersproject/rlp@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" - integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/sha2@^5.0.0", "@ethersproject/sha2@^5.0.3", "@ethersproject/sha2@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656" - integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@^5.0.0", "@ethersproject/signing-key@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" - integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@^5.0.0", "@ethersproject/solidity@^5.0.9": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2" - integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.0.3", "@ethersproject/strings@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" - integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.3", "@ethersproject/transactions@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" - integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== - dependencies: - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - -"@ethersproject/units@^5.0.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f" - integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/wallet@5.6.2", "@ethersproject/wallet@^5.0.0": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c" - integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/hdnode" "^5.6.2" - "@ethersproject/json-wallets" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/wordlists" "^5.6.1" - -"@ethersproject/web@^5.0.0", "@ethersproject/web@^5.0.4", "@ethersproject/web@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" - integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== - dependencies: - "@ethersproject/base64" "^5.6.1" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/wordlists@^5.0.0", "@ethersproject/wordlists@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1" - integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@fetsorn/opentelemetry-console-exporter@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@fetsorn/opentelemetry-console-exporter/-/opentelemetry-console-exporter-0.0.3.tgz#c137629fecc610c7667e68b528926e498e152c0b" - integrity sha512-+UDrzHANOPcp0+47xK7dqeKIlYSh5a5WpFaswzM9S2MnjQfP0zOysAunWFRb6CFYSj1hTeFotYYXr8tYbyBpoA== - -"@formatjs/ecma402-abstract@1.6.2": - version "1.6.2" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.2.tgz#9d064a2cf790769aa6721e074fb5d5c357084bb9" - integrity sha512-aLBODrSRhHaL/0WdQ0T2UsGqRbdtRRHqqrs4zwNQoRsGBEtEAvlj/rgr6Uea4PSymVJrbZBoAyECM2Z3Pq4i0g== - dependencies: - tslib "^2.1.0" - -"@formatjs/intl-datetimeformat@3.2.12": - version "3.2.12" - resolved "https://registry.yarnpkg.com/@formatjs/intl-datetimeformat/-/intl-datetimeformat-3.2.12.tgz#c9b2e85f0267ee13ea615a8991995da3075e3b13" - integrity sha512-qvY5+dl3vlgH0iWRXwl8CG9UkSVB5uP2+HH//fyZZ01G4Ww5rxMJmia1SbUqatpoe/dX+Z+aLejCqUUyugyL2g== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -"@formatjs/intl-displaynames@4.0.10": - version "4.0.10" - resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-4.0.10.tgz#5bbd1bbcd64a036b4be27798b650c864dcf4466a" - integrity sha512-KmYJQHynGnnMeqIWVXhbzCMcEC8lg1TfGVdcO9May6paDT+dksZoOBQc741t7iXi/YVO/wXEZdmXhUNX7ODZug== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -"@formatjs/intl-listformat@5.0.10": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-5.0.10.tgz#9f8c4ad5e8a925240e151ba794c41fba01f742cc" - integrity sha512-FLtrtBPfBoeteRlYcHvThYbSW2YdJTllR0xEnk6cr/6FRArbfPRYMzDpFYlESzb5g8bpQMKZy+kFQ6V2Z+5KaA== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -"@formatjs/intl-relativetimeformat@8.1.2": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-8.1.2.tgz#119f3dce97458991f86bf34a736880e4a7bc1697" - integrity sha512-LZUxbc9GHVGmDc4sqGAXugoxhvZV7EG2lG2c0aKERup2ixvmDMbbEN3iEEr5aKkP7YyGxXxgqDn2dwg7QCPR6Q== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -"@formatjs/intl@1.8.2": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.8.2.tgz#6090e6c1826a92e70668dfe08b4ba30127ea3a85" - integrity sha512-9xHoNKPv4qQIQ5AVfpQbIPZanz50i7oMtZWrd6Fz7Q2GM/5uhBr9mrCrY1tz/+diP7uguKmhj1IweLYaxY3DTQ== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - "@formatjs/intl-datetimeformat" "3.2.12" - "@formatjs/intl-displaynames" "4.0.10" - "@formatjs/intl-listformat" "5.0.10" - "@formatjs/intl-relativetimeformat" "8.1.2" - fast-memoize "^2.5.2" - intl-messageformat "9.5.2" - intl-messageformat-parser "6.4.2" - tslib "^2.1.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" - slash "^3.0.0" - -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== - dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== - dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" - "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" - -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" - -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" - -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== - dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - 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" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - 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": - version "3.1.0" - 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.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - 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.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jsdevtools/ono@^7.1.3": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" - integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== - -"@msgpack/msgpack@2.7.2": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" - integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== - -"@multiformats/base-x@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - 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" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - 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.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" - -"@opentelemetry/api-metrics@0.32.0": - version "0.32.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-metrics/-/api-metrics-0.32.0.tgz#0f09f78491a4b301ddf54a8b8a38ffa99981f645" - integrity sha512-g1WLhpG8B6iuDyZJFRGsR+JKyZ94m5LEmY2f+duEJ9Xb4XRlLHrZvh6G34OH6GJ8iDHxfHb/sWjJ1ZpkI9yGMQ== - dependencies: - "@opentelemetry/api" "^1.0.0" - -"@opentelemetry/api@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.2.0.tgz#89ef99401cde6208cff98760b67663726ef26686" - integrity sha512-0nBr+VZNKm9tvNDZFstI3Pq1fCTEDK5OZTnVKNvBNAKgd0yIvmwsP4m61rEv7ZP+tOUjWJhROpxK5MsnlF911g== - -"@opentelemetry/api@^1.0.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.3.0.tgz#27c6f776ac3c1c616651e506a89f438a0ed6a055" - integrity sha512-YveTnGNsFFixTKJz09Oi4zYkiLT5af3WpZDu4aIUM7xX+2bHAkOJayFTVQd6zB8kkWPpbua4Ha6Ql00grdLlJQ== - -"@opentelemetry/core@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.6.0.tgz#c55f8ab7496acef7dbd8c4eedef6a4d4a0143c95" - integrity sha512-MsEhsyCTfYme6frK8/AqEWwbS9SB3Ta5bjgz4jPQJjL7ijUM3JiLVvqh/kHo1UlUjbUbLmGG7jA5Nw4d7SMcLQ== - dependencies: - "@opentelemetry/semantic-conventions" "1.6.0" - -"@opentelemetry/exporter-trace-otlp-http@0.32.0": - version "0.32.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.32.0.tgz#55773290a221855c4e8c422e8fb5e7ff4aa5f04e" - integrity sha512-8n44NDoEFoYG3mMToZxNyUKkHSGfzSShw6I2V5FApcH7rid20LmKiNuzc7lACneDIZBld+GGpLRuFhWniW8JhA== - dependencies: - "@opentelemetry/core" "1.6.0" - "@opentelemetry/otlp-exporter-base" "0.32.0" - "@opentelemetry/otlp-transformer" "0.32.0" - "@opentelemetry/resources" "1.6.0" - "@opentelemetry/sdk-trace-base" "1.6.0" - -"@opentelemetry/otlp-exporter-base@0.32.0": - version "0.32.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.32.0.tgz#37dde162835a8fd23fa040f07e2938deb335fc4b" - integrity sha512-Dscxu4VNKrkD1SwGKdc7bAtLViGFJC8ah6Dr/vZn22NFHXSa53lSzDdTKeSTNNWH9sCGu/65LS45VMd4PsRvwQ== - dependencies: - "@opentelemetry/core" "1.6.0" - -"@opentelemetry/otlp-transformer@0.32.0": - version "0.32.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.32.0.tgz#652c8f4c56c95f7d7ec39e20573b885d27ca13f1" - integrity sha512-PFAqfKgJpTOZryPe1UMm7R578PLxsK0wCAuKSt6m8v1bN/4DO8DX4HD7k3mYGZVU5jNg8tVZSwyIpY6ryrHDMQ== - dependencies: - "@opentelemetry/api-metrics" "0.32.0" - "@opentelemetry/core" "1.6.0" - "@opentelemetry/resources" "1.6.0" - "@opentelemetry/sdk-metrics" "0.32.0" - "@opentelemetry/sdk-trace-base" "1.6.0" - -"@opentelemetry/resources@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.6.0.tgz#9756894131b9b0dfbcc0cecb5d4bd040d9c1b09d" - integrity sha512-07GlHuq72r2rnJugYVdGumviQvfrl8kEPidkZSVoseLVfIjV7nzxxt5/vqs9pK7JItWOrvjRdr/jTBVayFBr/w== - dependencies: - "@opentelemetry/core" "1.6.0" - "@opentelemetry/semantic-conventions" "1.6.0" - -"@opentelemetry/sdk-metrics@0.32.0": - version "0.32.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-0.32.0.tgz#463cd3a2b267f044db9aaab85887a171710345a0" - integrity sha512-zC9RCOIsXRqOHWmWfcxArtDHbip2/jaIH1yu/OKau/shDZYFluAxY6zAEYIb4YEAzKKEF+fpaoRgpodDWNGVGA== - dependencies: - "@opentelemetry/api-metrics" "0.32.0" - "@opentelemetry/core" "1.6.0" - "@opentelemetry/resources" "1.6.0" - lodash.merge "4.6.2" - -"@opentelemetry/sdk-trace-base@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.6.0.tgz#8b1511c0b0f3e6015e345f5ed4a683adf03e3e3c" - integrity sha512-yx/uuzHdT0QNRSEbCgXHc0GONk90uvaFcPGaNowIFSl85rTp4or4uIIMkG7R8ckj8xWjDSjsaztH6yQxoZrl5g== - dependencies: - "@opentelemetry/core" "1.6.0" - "@opentelemetry/resources" "1.6.0" - "@opentelemetry/semantic-conventions" "1.6.0" - -"@opentelemetry/sdk-trace-web@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.6.0.tgz#ef243e3e1102b53bc0afa93c29c18fc7e2f66e52" - integrity sha512-iOgmygvooaZm4Vi6mh5FM7ubj/e+MqDn8cDPCNfk6V8Q2yWj0co8HKWPFo0RoxSLYyPaFnEEXOXWWuE4OTwLKw== - dependencies: - "@opentelemetry/core" "1.6.0" - "@opentelemetry/sdk-trace-base" "1.6.0" - "@opentelemetry/semantic-conventions" "1.6.0" - -"@opentelemetry/semantic-conventions@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz#ed410c9eb0070491cff9fe914246ce41f88d6f74" - integrity sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ== - -"@openzeppelin/contracts@3.4.1-solc-0.7-2": - version "3.4.1-solc-0.7-2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz#371c67ebffe50f551c3146a9eec5fe6ffe862e92" - integrity sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q== - -"@openzeppelin/contracts@3.4.2-solc-0.7": - version "3.4.2-solc-0.7" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz#38f4dbab672631034076ccdf2f3201fab1726635" - integrity sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== - -"@polywrap/asyncify-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.9.4.tgz#9181be02f3391b839a8332fc5dcfe0be054f8544" - integrity sha512-oFqKPcUIhKeQnLsUPDSzweDsAUNtiTrg0UZBzR7KdCDtoLGMc2Y01rWD+39f53kpcpa420C3YCYqhrQOEBjyOA== - -"@polywrap/client-config-builder-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.9.4.tgz#227aadf6da73e27b82f994e86d39d1f32f622320" - integrity sha512-yjHLf56KUmHR3rRUEzf8UVY3ulUpmd5CbsbHFO1Ml+9JeNbmvXbred6TdY3t9xmDspai2FxPJC5WuG3iQmJ3Jw== - dependencies: - "@polywrap/core-js" "0.9.4" - "@polywrap/ens-resolver-plugin-js" "0.9.4" - "@polywrap/ethereum-plugin-js" "0.9.4" - "@polywrap/fs-plugin-js" "0.9.4" - "@polywrap/fs-resolver-plugin-js" "0.9.4" - "@polywrap/http-plugin-js" "0.9.4" - "@polywrap/http-resolver-plugin-js" "0.9.4" - "@polywrap/ipfs-plugin-js" "0.9.4" - "@polywrap/ipfs-resolver-plugin-js" "0.9.4" - "@polywrap/logger-plugin-js" "0.9.4" - "@polywrap/tracing-js" "0.9.4" - "@polywrap/uri-resolver-extensions-js" "0.9.4" - "@polywrap/uri-resolvers-js" "0.9.4" - "@polywrap/wasm-js" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - -"@polywrap/client-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.9.4.tgz#5a61c9a5c90efc52a477207114dfecd762cf324f" - integrity sha512-AnF71901wzQoU/7lN1fZ+YPU3gctKKDX8CKLuhkLGa5BjKUhEofVBBFd5hYDmSV+icjNEqx74UikRum7o8/mbQ== - dependencies: - "@polywrap/asyncify-js" "0.9.4" - "@polywrap/client-config-builder-js" "0.9.4" - "@polywrap/core-js" "0.9.4" - "@polywrap/ens-resolver-plugin-js" "0.9.4" - "@polywrap/ethereum-plugin-js" "0.9.4" - "@polywrap/fs-plugin-js" "0.9.4" - "@polywrap/fs-resolver-plugin-js" "0.9.4" - "@polywrap/http-plugin-js" "0.9.4" - "@polywrap/http-resolver-plugin-js" "0.9.4" - "@polywrap/ipfs-plugin-js" "0.9.4" - "@polywrap/ipfs-resolver-plugin-js" "0.9.4" - "@polywrap/logger-plugin-js" "0.9.4" - "@polywrap/msgpack-js" "0.9.4" - "@polywrap/result" "0.9.4" - "@polywrap/schema-parse" "0.9.4" - "@polywrap/tracing-js" "0.9.4" - "@polywrap/uri-resolvers-js" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - graphql "15.5.0" - yaml "2.1.3" - -"@polywrap/core-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.9.4.tgz#8928e3b1fe2423178ba14e8f2a3b2d8f8c3e9928" - integrity sha512-/q6SHLATxSSoQVZfv63NQSg/ZlJW2Ba8wjnIPoLgoBFO/KoRaO/UUcBPlTJc2z6nSoQLkSODqCP3X7EeFkb6nA== - dependencies: - "@polywrap/asyncify-js" "0.9.4" - "@polywrap/msgpack-js" "0.9.4" - "@polywrap/result" "0.9.4" - "@polywrap/tracing-js" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - graphql "15.5.0" - graphql-tag "2.10.4" - jsonschema "1.4.0" - semver "7.3.5" - yaml "2.1.3" - -"@polywrap/ens-resolver-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/ens-resolver-plugin-js/-/ens-resolver-plugin-js-0.9.4.tgz#48abf10a0d81a4717d44740e7573eff4ea2ceab3" - integrity sha512-/aHfu5/7N27xGs60rMr/AhS1JiJau7AOZFNdtdWwg+VjG4OjeuR5yGcYWK9BNcDoGn+3DV0JgC4EpcuxFEdY/Q== - dependencies: - "@ethersproject/address" "5.0.7" - "@ethersproject/basex" "5.0.7" - "@polywrap/core-js" "0.9.4" - ethers "5.0.7" - -"@polywrap/ethereum-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/ethereum-plugin-js/-/ethereum-plugin-js-0.9.4.tgz#eced004bbc33ff2303043b0d6c4355fc177ae9ea" - integrity sha512-VFhNuvFpLU/3/i9W8NGxySmjVw4AdkU2IyXzb+Vza42NueyOc+UCa6HnamKbS9qXH+M0lPRBQVln0AGazIdT/g== - dependencies: - "@ethersproject/address" "5.0.7" - "@ethersproject/providers" "5.0.7" - "@polywrap/core-js" "0.9.4" - ethers "5.0.7" - -"@polywrap/fs-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/fs-plugin-js/-/fs-plugin-js-0.9.4.tgz#8e027414db0e219f73d417df898507457d98e8c7" - integrity sha512-5OvmVJCc08t3Qn9M2xbhScp6TsD0mtRyQJK4/P8vgY3wpIOy2cJtmT1Y1ZiLcfC0NvZg7bDuqyKs8/Thj1ejLA== - dependencies: - "@polywrap/core-js" "0.9.4" - -"@polywrap/fs-resolver-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/fs-resolver-plugin-js/-/fs-resolver-plugin-js-0.9.4.tgz#9d4b3a5c313dbc97d26a82eebfbcefd162e2cfc2" - integrity sha512-GRNK0FGXh9BoaAbSQOTCgdAZshFtii2lkgEw5IoPMzlZToeWetJv9vYwCSVy/L5Dt7CYunHV3iLGcJCwdRUIaQ== - dependencies: - "@polywrap/core-js" "0.9.4" - -"@polywrap/http-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/http-plugin-js/-/http-plugin-js-0.9.4.tgz#f329ae73d6727e80fb14a728797032cb3c24f48a" - integrity sha512-7F6tEOZI3h5Hhyx01dmesIUQM1cPGPa9CZfEmFx5yA2bV/gfyXemR+PANwahCAQe1zaXvoqKaMhaXYMOJ+aYdg== - dependencies: - "@polywrap/core-js" "0.9.4" - axios "0.21.4" - -"@polywrap/http-resolver-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/http-resolver-plugin-js/-/http-resolver-plugin-js-0.9.4.tgz#9a6cb586646b5788f86bc70ccc08ad6380e21b5c" - integrity sha512-TljgRqqQrEl8V1ryGNXDE/o4tyrWN+27lGSMd2agPeBytAzm/5wPCzr/NsIf3gokrRjuQd/rELqUjDL6R386aQ== - dependencies: - "@polywrap/core-js" "0.9.4" - abort-controller "3.0.0" - -"@polywrap/ipfs-http-client-lite@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@polywrap/ipfs-http-client-lite/-/ipfs-http-client-lite-0.3.0.tgz#b8caf4b4f39413e591aff4367023a04cb6df83a1" - integrity sha512-BriJXaflESPSml0lfsAtp4Prl6i8FC0RoEQpEoTx74E3LIAdiPhdPb8hKDTyOR77oX829WDp0EKsRpQmcvCArg== - dependencies: - abort-controller "^3.0.0" - async-iterator-to-pull-stream "^1.3.0" - buffer "^5.2.1" - cids "^0.7.1" - explain-error "^1.0.4" - form-data "^2.4.0" - iterable-ndjson "^1.1.0" - node-fetch "^2.6.0" - pull-stream-to-async-iterator "^1.0.2" - querystring "^0.2.0" - -"@polywrap/ipfs-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/ipfs-plugin-js/-/ipfs-plugin-js-0.9.4.tgz#151b6616ef0bca81b6e13ee9b4e836c6d75e8543" - integrity sha512-4Xi4onTkGq2hdn3MKnX6zmSNY3m9ro8v6SFyoNUpZGk8uExpZSJhrrks4dhbi34LcAi1j7VXFEfsbWFUzmCAEg== - dependencies: - "@polywrap/core-js" "0.9.4" - "@polywrap/ipfs-http-client-lite" "0.3.0" - abort-controller "3.0.0" - is-ipfs "1.0.3" - multiformats "9.7.0" - -"@polywrap/ipfs-resolver-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/ipfs-resolver-plugin-js/-/ipfs-resolver-plugin-js-0.9.4.tgz#db587d0df916c9a696b09def0d63df676d9ca805" - integrity sha512-Q8ensIZFeocSjsq35tMY6TsG19e63I1azn0sfgYlLIfWq5gqddN3DpCWuGEXfPbLeYM7Z1GefmzZS74Q1qh6gg== - dependencies: - "@polywrap/core-js" "0.9.4" - "@polywrap/ipfs-http-client-lite" "0.3.0" - abort-controller "3.0.0" - is-ipfs "1.0.3" - -"@polywrap/logger-plugin-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.9.4.tgz#daa867e7dd473660a2d5523d836a1d89d69eca09" - integrity sha512-FiLvJtCcNsvCDwSbYpFBIiRrSLnHyzEzQwKF/4HzdtNFsvgauE33PPYfUJHn9o4MG6q7+L9C3/UtjOS3CoMjyg== - dependencies: - "@polywrap/core-js" "0.9.4" - -"@polywrap/logging-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/logging-js/-/logging-js-0.9.4.tgz#8ef53d2b378a067d2001010ad83f592028eaba1e" - integrity sha512-i2yryihFb+2mKQYQlhZ62Ak7XXGNwqc4N/KKSmuLKhVCkQzGnR3nhCiiWtISDFIsNIcrrVGjSatBevDuuokAow== - -"@polywrap/msgpack-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.9.4.tgz#10f13f5d8730a902091acba3f7f0616c9dc9d444" - integrity sha512-0sdokpHZ6FFoCDW8I6KxDnc0dwDgsb3qfD5MlrCRTJm81TR/iK4LnL0wDqO4aQVwpZ3kZtdVsL7jgmbGRCTeMg== - dependencies: - "@msgpack/msgpack" "2.7.2" - -"@polywrap/os-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/os-js/-/os-js-0.9.4.tgz#c23edba57ec5eca25d8c623964ca7585cc7924a4" - integrity sha512-6M0VicGvAevHw2FjVkE+T6DBnvBD8uaaEHCCuTEsiv2L6qZ2sikt65+SVwn+Ug7hPEW7UxU8B/Hpp8kcsGNFJQ== - -"@polywrap/polywrap-manifest-schemas@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-schemas/-/polywrap-manifest-schemas-0.9.4.tgz#beec82b4b6d83323319df6d9b1d51e4799e6e39d" - integrity sha512-o04V2f+ObSyYQFmStY1Owd9/vkml7nY5Bhi4sghGOTU3EMwpzjMKS2wfyPiSHN/jbOrORcj0kAUXmlDwqKnubQ== - -"@polywrap/polywrap-manifest-types-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-types-js/-/polywrap-manifest-types-js-0.9.4.tgz#ff70f004a4c67eec7580d111ac9ee639c1d1f997" - integrity sha512-OqU7/FrkqdSATcbPqjF9eLZWCFfoJD7uf8Xa/cxrWGRmu2g9t3Et56DZ7qTzNC32eNH1/0FbPg3uZiGXiWxfog== - dependencies: - "@polywrap/logging-js" "0.9.4" - "@polywrap/polywrap-manifest-schemas" "0.9.4" - jsonschema "1.4.0" - semver "7.3.5" - yaml "2.1.3" - -"@polywrap/result@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.9.4.tgz#2092e844a4d437f1277e46e150c35a03f8b44932" - integrity sha512-WO1NPo64PQ15eKGZx8J7aFWmch73tMbOgOGpnlTUCDWFgxlo6hdaSwkhmOSdofzkTOO5J+VgOKPaWVdnjrbGqQ== - -"@polywrap/schema-bind@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/schema-bind/-/schema-bind-0.9.4.tgz#1d6d755970fce056ff80664fed4d06caafaaffe7" - integrity sha512-N75B58pBYP+s20aZH4azkPAMRPiny69knkmMUw+Bcd/OGQa/l8mM91Rylc7lWFShGo5XunxEHmoJA2tPRj1Kdw== - dependencies: - "@polywrap/os-js" "0.9.4" - "@polywrap/schema-parse" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - mustache "4.0.1" - -"@polywrap/schema-compose@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/schema-compose/-/schema-compose-0.9.4.tgz#a2ebb6607aaa3813b78ac09e51269d9491fc3e28" - integrity sha512-qkK3z0pOPlDjTbXKQwaSL+dwZaw+z6f1EpztGofglP3jRd3Mlk4rpHDpKRaRdkgQFEPX+IgYvRR5OY4Wx7qFBg== - dependencies: - "@polywrap/schema-parse" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - graphql "15.5.0" - mustache "4.0.1" - -"@polywrap/schema-parse@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/schema-parse/-/schema-parse-0.9.4.tgz#6d5373656b83abbd636b7da3995cb89f8f6181d9" - integrity sha512-NXAwh06wjF/nTh5uXbO58OOj+Rj2Qzv+bbpkYBVMMJubXvsX+KgHtk9y/KX+Jha+7XPH4qsFIRZ1UH3Sjbn7AQ== - dependencies: - "@dorgjelli/graphql-schema-cycles" "1.1.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - graphql "15.5.0" - -"@polywrap/test-env-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/test-env-js/-/test-env-js-0.9.4.tgz#be2ae866fcd94467a43cf8cdeb9da0bddf1bb24b" - integrity sha512-7L7uBz2+6mDFov9ZHeQRdYKAAShmke/mwROl3c3/tW7qh8HgCQ4vVTVEKmr/9YS7Vb6nw1EI64SYtCHbjhmMnQ== - dependencies: - "@polywrap/core-js" "0.9.4" - "@polywrap/polywrap-manifest-types-js" "0.9.4" - axios "0.21.2" - spawn-command "0.0.2-1" - yaml "2.1.3" - -"@polywrap/tracing-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.9.4.tgz#e5e75a8565faf6fe3d6bf0bb9e38ba580dd1423c" - integrity sha512-wHcLmiATHKvmeB51+D/OyWN1oYet6JQRZPptS7BBPTqd7w2zQNMHpuYIeWTaJjNTiaxp2Y4yjzEDnDqooXbp+A== - dependencies: - "@fetsorn/opentelemetry-console-exporter" "0.0.3" - "@opentelemetry/api" "1.2.0" - "@opentelemetry/exporter-trace-otlp-http" "0.32.0" - "@opentelemetry/resources" "1.6.0" - "@opentelemetry/sdk-trace-base" "1.6.0" - "@opentelemetry/sdk-trace-web" "1.6.0" - -"@polywrap/uri-resolver-extensions-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.9.4.tgz#5e3e7ad0d10b2918d3c65620167c18ebf888a230" - integrity sha512-pEQwAFfqyzCMdupUwVi1piaG1AspB+ONPE9OSDzz5wft5W+PIyy8EG0DlOartphsxsuQHFrRn2gfElON3hklIg== - dependencies: - "@polywrap/core-js" "0.9.4" - "@polywrap/result" "0.9.4" - "@polywrap/uri-resolvers-js" "0.9.4" - "@polywrap/wasm-js" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - -"@polywrap/uri-resolvers-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.9.4.tgz#4ad44fbcdced3ad3b952b105f86af1f4d27c10a2" - integrity sha512-TCnFo8rud+rW1xtUara4U6LKQoiQN5wBGIKG+/aSjBysT9Wpci0UrYltim4eBIJIIPYqBJIivdUzJV1VX4i5mQ== - dependencies: - "@polywrap/core-js" "0.9.4" - "@polywrap/result" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - -"@polywrap/wasm-as@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/wasm-as/-/wasm-as-0.9.4.tgz#b68f75a4c9db8084989de44402e83e97fe9828a4" - integrity sha512-0edL+Mdp98CboUnUN1Ycdx1Kb9CQmlDH+WTFiOuQn1MlfP+l1FUuo/ifxKJ869xQKiXsufCTX046a5pguWvLxQ== - dependencies: - "@web3api/assemblyscript-json" "1.2.0" - as-bigint "0.5.3" - as-bignumber "0.2.1" - as-container "0.6.1" - -"@polywrap/wasm-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.9.4.tgz#f63881fa3c52f88e223995183179018559942891" - integrity sha512-4+pgLAqBm7azV0DDP2CkZlMCl6xAUNvZntKIoXKSIQiK3QE3RpUbzHmGqy8TLs1yALpyiKrXG5AgGUAYXO2Gjw== - dependencies: - "@polywrap/asyncify-js" "0.9.4" - "@polywrap/core-js" "0.9.4" - "@polywrap/msgpack-js" "0.9.4" - "@polywrap/result" "0.9.4" - "@polywrap/tracing-js" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - -"@polywrap/wrap-manifest-types-js@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.9.4.tgz#e5130d2aba035b963f56cce15b6404873964b655" - integrity sha512-+ARZh9a4otzuPmaKWjlJQYpwSKQKc8pm/LOAcHKjYbQH34mCcKPih7wY8febt468oMn5OfXuVdL9txsK6RgDIA== - dependencies: - "@polywrap/msgpack-js" "0.9.4" - json-schema-ref-parser "9.0.9" - jsonschema "1.4.0" - semver "7.3.5" - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.0.tgz#8134fd78cb39567465be65b9fdc16d378095f41f" - integrity sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw== - dependencies: - "@babel/types" "^7.3.0" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@26.0.24": - version "26.0.24" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" - integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== - dependencies: - jest-diff "^26.0.0" - pretty-format "^26.0.0" - -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.6": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node@*": - version "18.7.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.5.tgz#f1c1d4b7d8231c0278962347163656f9c36f3e83" - integrity sha512-NcKK6Ts+9LqdHJaW6HQmgr7dT/i3GOHG+pt6BiWv++5SnjtRd4NXeiuN2kA153SjhXPR/AhHIPHPbrsbpUVOww== - -"@types/node@12.6.9": - version "12.6.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.9.tgz#ffeee23afdc19ab16e979338e7b536fdebbbaeaf" - integrity sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/prettier@^2.0.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.0.tgz#ea03e9f0376a4446f44797ca19d9c46c36e352dc" - integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== - dependencies: - "@types/node" "*" - -"@typescript-eslint/eslint-plugin@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz#7579c6d17ad862154c10bc14b40e5427b729e209" - integrity sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw== - dependencies: - "@typescript-eslint/experimental-utils" "4.11.1" - "@typescript-eslint/scope-manager" "4.11.1" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz#2dad3535b878c25c7424e40bfa79d899f3f485bc" - integrity sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.11.1" - "@typescript-eslint/types" "4.11.1" - "@typescript-eslint/typescript-estree" "4.11.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.11.1.tgz#981e18de2e019d6ca312596615f92e8f6f6598ed" - integrity sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw== - dependencies: - "@typescript-eslint/scope-manager" "4.11.1" - "@typescript-eslint/types" "4.11.1" - "@typescript-eslint/typescript-estree" "4.11.1" - debug "^4.1.1" - -"@typescript-eslint/scope-manager@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz#72dc2b60b0029ab0888479b12bf83034920b4b69" - integrity sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ== - dependencies: - "@typescript-eslint/types" "4.11.1" - "@typescript-eslint/visitor-keys" "4.11.1" - -"@typescript-eslint/types@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.11.1.tgz#3ba30c965963ef9f8ced5a29938dd0c465bd3e05" - integrity sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA== - -"@typescript-eslint/typescript-estree@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz#a4416b4a65872a48773b9e47afabdf7519eb10bc" - integrity sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw== - dependencies: - "@typescript-eslint/types" "4.11.1" - "@typescript-eslint/visitor-keys" "4.11.1" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/visitor-keys@4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz#4c050a4c1f7239786e2dd4e69691436143024e05" - integrity sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg== - dependencies: - "@typescript-eslint/types" "4.11.1" - eslint-visitor-keys "^2.0.0" - -"@uniswap/lib@^4.0.1-alpha": - version "4.0.1-alpha" - resolved "https://registry.yarnpkg.com/@uniswap/lib/-/lib-4.0.1-alpha.tgz#2881008e55f075344675b3bca93f020b028fbd02" - integrity sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA== - -"@uniswap/sdk-core@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@uniswap/sdk-core/-/sdk-core-3.0.1.tgz#d08dd68257983af64b9a5f4d6b9cf26124b4138f" - integrity sha512-WbeDkhZ9myVR0VnHOdTrb8nHKKkqTFa5uE9RvUbG3eyDt2NWWDwhhqGHwAWJEHG405l30Fa1u3PogHDFsIOQlA== - dependencies: - "@ethersproject/address" "^5.0.2" - big.js "^5.2.2" - decimal.js-light "^2.5.0" - jsbi "^3.1.4" - tiny-invariant "^1.1.0" - toformat "^2.0.0" - -"@uniswap/v2-core@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.1.tgz#af8f508bf183204779938969e2e54043e147d425" - integrity sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== - -"@uniswap/v3-core@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-core/-/v3-core-1.0.0.tgz#6c24adacc4c25dceee0ba3ca142b35adbd7e359d" - integrity sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA== - -"@uniswap/v3-periphery@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz#37f0a1ef6025221722e50e9f3f2009c2d5d6e4ec" - integrity sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw== - dependencies: - "@openzeppelin/contracts" "3.4.1-solc-0.7-2" - "@uniswap/lib" "^4.0.1-alpha" - "@uniswap/v2-core" "1.0.1" - "@uniswap/v3-core" "1.0.0" - base64-sol "1.0.1" - hardhat-watcher "^2.1.1" - -"@uniswap/v3-periphery@^1.0.1", "@uniswap/v3-periphery@^1.1.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz#b90f08b7386163c0abfd7258831caef6339c7862" - integrity sha512-Ab0ZCKOQrQMKIcpBTezTsEhWfQjItd0TtkCG8mPhoQu+wC67nPaf4hYUhM6wGHeFUmDiYY5MpEQuokB0ENvoTg== - dependencies: - "@openzeppelin/contracts" "3.4.2-solc-0.7" - "@uniswap/lib" "^4.0.1-alpha" - "@uniswap/v2-core" "1.0.1" - "@uniswap/v3-core" "1.0.0" - base64-sol "1.0.1" - hardhat-watcher "^2.1.1" - -"@uniswap/v3-sdk@3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@uniswap/v3-sdk/-/v3-sdk-3.6.2.tgz#45fa659f7642e8807cb36939e4426355c7a5943c" - integrity sha512-RHJaFfO6+ugI0+v0xhGXuVadmJ9bTbAz/RnuS/xRpXrRIsLNRVC42bYZ3Ci0JPWhkaNygCcc3LJ36Bs6GganSg== - dependencies: - "@ethersproject/abi" "^5.0.12" - "@ethersproject/solidity" "^5.0.9" - "@uniswap/sdk-core" "^3.0.1" - "@uniswap/v3-periphery" "^1.1.1" - "@uniswap/v3-staker" "1.0.0" - tiny-invariant "^1.1.0" - tiny-warning "^1.0.3" - -"@uniswap/v3-staker@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz#9a6915ec980852479dfc903f50baf822ff8fa66e" - integrity sha512-JV0Qc46Px5alvg6YWd+UIaGH9lDuYG/Js7ngxPit1SPaIP30AlVer1UYB7BRYeUVVxE+byUyIeN5jeQ7LLDjIw== - dependencies: - "@openzeppelin/contracts" "3.4.1-solc-0.7-2" - "@uniswap/v3-core" "1.0.0" - "@uniswap/v3-periphery" "^1.0.1" - -"@web3api/assemblyscript-json@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@web3api/assemblyscript-json/-/assemblyscript-json-1.2.0.tgz#f01f11f12a66cd1a319d43f12e476307d1ad3da8" - integrity sha512-x+wchJpH1giJzXj3dYs8vh2SKMXepeqVXiaFV/YCtXg4X/KaUnxi0kp5JugbEAyEJurEScH1YuV6IvGhGui/fw== - -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abort-controller@3.0.0, abort-controller@^3.0.0: - version "3.0.0" - 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" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1, acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== - -aes-js@3.0.0: - version "3.0.0" - 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.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - 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" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.3" - 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: - version "4.3.2" - 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@^5.0.0, ansi-regex@^5.0.1: - version "5.0.1" - 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.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.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -any-signal@^2.0.0, any-signal@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" - integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== - dependencies: - abort-controller "^3.0.0" - native-abort-controller "^1.0.3" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.3, anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - 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.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.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-includes@^3.1.1: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -array.prototype.flat@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -as-bigint@0.5.3, as-bigint@^0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/as-bigint/-/as-bigint-0.5.3.tgz#a0647d0b7ce835077aca33115e71eb26a83df8be" - integrity sha512-tg9iTO/vPeovOM5CSk1WxYcsfBd/cd3twhBW5PrpcGUfiSEXlPB69eOxFKvSbZnpuDxBAyQ4YBgEkfnYL89Czw== - -as-bignumber@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/as-bignumber/-/as-bignumber-0.2.1.tgz#6479caca7f24f784b10b3d2633cde457ef9cbc22" - integrity sha512-udKOlFYKSZyuHK7upTczRR8lcXkyPS0DR6NOtP+c3bhM4B2B0VqMBTzqa0hdYG4Zss94zA6UmqpjreEbzNUo4g== - dependencies: - as-bigint "^0.5.1" - -as-container@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/as-container/-/as-container-0.6.1.tgz#94806a91e96b68622c55f301fc04e6339a1228c2" - integrity sha512-cgQ7P/dQAGeU2lLhPpinThYfFcUw3HzV8b00CoqV+l5Tsgpl7xhXdoc/2srCyK0um1BVAQwlrEpNTtthzkMF+g== - -assemblyscript@0.19.23: - version "0.19.23" - resolved "https://registry.yarnpkg.com/assemblyscript/-/assemblyscript-0.19.23.tgz#16ece69f7f302161e2e736a0f6a474e6db72134c" - integrity sha512-fwOQNZVTMga5KRsfY80g7cpOl4PsFQczMwHzdtgoqLXaYhkhavufKb0sB0l3T1DUxpAufA0KNhlbpuuhZUwxMA== - dependencies: - binaryen "102.0.0-nightly.20211028" - long "^5.2.0" - source-map-support "^0.5.20" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-iterator-to-pull-stream@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/async-iterator-to-pull-stream/-/async-iterator-to-pull-stream-1.3.0.tgz#3a6b9f3cceadff972ca20eb480e3cb43f8789732" - integrity sha512-NjyhAEz/sx32olqgKIk/2xbWEM6o8qef1yetIgb0U/R3oBgndP1kE/0CslowH3jvnA94BO4I6OXpOkTKH7Z1AA== - dependencies: - get-iterator "^1.0.2" - pull-stream-to-async-iterator "^1.0.1" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axios@0.21.2: - version "0.21.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.2.tgz#21297d5084b2aeeb422f5d38e7be4fbb82239017" - integrity sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg== - dependencies: - follow-redirects "^1.14.0" - -axios@0.21.4: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== - dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" - -babel-plugin-istanbul@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== - dependencies: - babel-plugin-jest-hoist "^26.6.2" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.8: - version "3.0.9" - 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.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base64-sol@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/base64-sol/-/base64-sol-1.0.1.tgz#91317aa341f0bc763811783c5729f1c2574600f6" - integrity sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -bignumber.js@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binaryen@102.0.0-nightly.20211028: - version "102.0.0-nightly.20211028" - resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz#8f1efb0920afd34509e342e37f84313ec936afb2" - integrity sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w== - -bl@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -blob-to-it@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" - integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== - dependencies: - browser-readablestream-to-it "^1.0.3" - -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -borc@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" - integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== - dependencies: - bignumber.js "^9.0.0" - buffer "^5.5.0" - commander "^2.15.0" - ieee754 "^1.1.13" - iso-url "~0.4.7" - json-text-sequence "~0.1.0" - readable-stream "^3.6.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - 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@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - 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.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" - integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== - -browserslist@^4.20.2: - version "4.21.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" - integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== - dependencies: - caniuse-lite "^1.0.30001370" - electron-to-chromium "^1.4.202" - node-releases "^2.0.6" - update-browserslist-db "^1.0.5" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - 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-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer-from@1.x, buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - 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" - -buffer@^6.0.1: - 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" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - 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" - get-intrinsic "^1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - 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.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001370: - version "1.0.30001377" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001377.tgz#fa446cef27f25decb0c7420759c9ea17a2221a70" - integrity sha512-I5XeHI1x/mRSGl96LFOaSk528LA/yZG3m3iQgImGujjO8gotd/DL8QaI1R1h1dg5ATeI2jqPblMpKq4Tr5iKfQ== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -chalk@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.0.0: - version "2.4.2" - 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" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@3.5.1: - version "3.5.1" - 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" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - -cids@^1.0.0: - version "1.1.9" - resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.9.tgz#402c26db5c07059377bcd6fb82f2a24e7f2f4a4f" - integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== - dependencies: - multibase "^4.0.1" - multicodec "^3.0.1" - multihashes "^4.0.1" - uint8arrays "^3.0.0" - -cids@~0.8.0: - version "0.8.3" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.8.3.tgz#aaf48ac8ed857c3d37dad94d8db1d8c9407b92db" - integrity sha512-yoXTbV3llpm+EBGWKeL9xKtksPE/s6DPoDSY4fn8I8TEW1zehWXPSB0pwAXVDlLaOlrw+sNynj995uD9abmPhA== - dependencies: - buffer "^5.6.0" - class-is "^1.1.0" - multibase "^1.0.0" - multicodec "^1.0.1" - multihashes "^1.0.1" - -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== - -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^7.0.2: - version "7.0.4" - 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" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - 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.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.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.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.6, combined-stream@^1.0.8: - version "1.0.8" - 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.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== - -commander@^2.15.0, commander@^2.19.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg== - -content-hash@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -copyfiles@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" - integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== - dependencies: - glob "^7.0.5" - minimatch "^3.0.3" - mkdirp "^1.0.4" - noms "0.0.0" - through2 "^2.0.1" - untildify "^4.0.0" - yargs "^16.1.0" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cross-fetch@^3.0.6: - version "3.1.5" - 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@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csv-stringify@^5.6.2: - version "5.6.5" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" - integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decimal.js-light@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" - integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== - -decimal.js@^10.2.1: - version "10.4.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.0.tgz#97a7448873b01e92e5ff9117d89a7bca8e63e0fe" - integrity sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - 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.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -discontinuous-range@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" - integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== - -dns-over-http-resolver@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" - integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== - dependencies: - debug "^4.3.1" - native-fetch "^3.0.0" - receptacle "^1.3.2" - -docker-compose@0.23.17: - version "0.23.17" - resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.17.tgz#8816bef82562d9417dc8c790aa4871350f93a2ba" - integrity sha512-YJV18YoYIcxOdJKeFcCFihE6F4M2NExWM/d4S1ITcS9samHKnNUihz9kjggr0dNtsrbpFNc7/Yzd19DWs+m1xg== - dependencies: - yaml "^1.10.2" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg== - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -electron-fetch@^1.7.2: - version "1.7.4" - resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.4.tgz#af975ab92a14798bfaa025f88dcd2e54a7b0b769" - integrity sha512-+fBLXEy4CJWQ5bz8dyaeSG1hD6JJ15kBZyj3eh24pIVrd3hLM47H/umffrdQfS6GZ0falF0g9JT9f3Rs6AVUhw== - dependencies: - encoding "^0.1.13" - -electron-to-chromium@^1.4.202: - version "1.4.221" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.221.tgz#1ff8425d257a8bfc8269d552a426993c5b525471" - integrity sha512-aWg2mYhpxZ6Q6Xvyk7B2ziBca4YqrCDlXzmcD7wuRs65pVEVkMT1u2ifdjpAQais2O2o0rW964ZWWWYRlAL/kw== - -elliptic@6.5.4: - version "6.5.4" - 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" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.5: - version "2.3.6" - 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" - -err-code@^2.0.0, err-code@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -err-code@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" - integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - 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" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz#5402eb559aa94b894effd6bddfa0b1ca051c858f" - integrity sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA== - -eslint-import-resolver-node@^0.3.4: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-module-utils@^2.6.0: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-prettier@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz#61e295349a65688ffac0b7808ef0a8244bdd8d40" - integrity sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.0.0, eslint-scope@^5.1.1: - version "5.1.1" - 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" - estraverse "^4.1.1" - -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - 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-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - 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.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.16.0.tgz#a761605bf9a7b32d24bb7cde59aeb0fd76f06092" - integrity sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.2" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.2.0" - esutils "^2.0.2" - file-entry-cache "^6.0.0" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.19" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.4" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - 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" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.2.0: - version "1.4.0" - 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.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.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.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -ethers@5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.7.tgz#41c3d774e0a57bfde12b0198885789fb41a14976" - integrity sha512-1Zu9s+z4BgsDAZcGIYACJdWBB6mVtCCmUonj68Njul7STcSdgwOyj0sCAxCUr2Nsmsamckr4E12q3ecvZPGAUw== - dependencies: - "@ethersproject/abi" "^5.0.0" - "@ethersproject/abstract-provider" "^5.0.0" - "@ethersproject/abstract-signer" "^5.0.0" - "@ethersproject/address" "^5.0.0" - "@ethersproject/base64" "^5.0.0" - "@ethersproject/bignumber" "^5.0.0" - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/constants" "^5.0.0" - "@ethersproject/contracts" "^5.0.0" - "@ethersproject/hash" "^5.0.0" - "@ethersproject/hdnode" "^5.0.0" - "@ethersproject/json-wallets" "^5.0.0" - "@ethersproject/keccak256" "^5.0.0" - "@ethersproject/logger" "^5.0.0" - "@ethersproject/networks" "^5.0.0" - "@ethersproject/pbkdf2" "^5.0.0" - "@ethersproject/properties" "^5.0.0" - "@ethersproject/providers" "^5.0.0" - "@ethersproject/random" "^5.0.0" - "@ethersproject/rlp" "^5.0.0" - "@ethersproject/sha2" "^5.0.0" - "@ethersproject/signing-key" "^5.0.0" - "@ethersproject/solidity" "^5.0.0" - "@ethersproject/strings" "^5.0.0" - "@ethersproject/transactions" "^5.0.0" - "@ethersproject/units" "^5.0.0" - "@ethersproject/wallet" "^5.0.0" - "@ethersproject/web" "^5.0.0" - "@ethersproject/wordlists" "^5.0.0" - -event-target-shim@^5.0.0: - version "5.0.1" - 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== - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== - dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - -explain-error@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/explain-error/-/explain-error-1.0.4.tgz#a793d3ac0cad4c6ab571e9968fbbab6cb2532929" - integrity sha512-/wSgNMxFusiYRy1rd19LT2SQlIXDppHpumpWo06wxjflD1OYxDLbl6rMVw+U3bxD5Nuhex4TKqv9Aem4D0lVzQ== - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-files@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" - integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -fast-deep-equal@^3.1.1: - version "3.1.3" - 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.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-fifo@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.1.0.tgz#17d1a3646880b9891dfa0c54e69c5fef33cad779" - integrity sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g== - -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - 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, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-memoize@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" - integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -file-entry-cache@^6.0.0: - version "6.0.1" - 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@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - 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-up@^2.0.0: - version "2.1.0" - 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.0.0, find-up@^4.1.0: - version "4.1.0" - 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" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -follow-redirects@^1.12.1, follow-redirects@^1.14.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -form-data@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fs-extra@9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@^0.30.0: - version "0.30.0" - 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" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.1.2, fsevents@~2.3.1, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - 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== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - 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.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-iterator@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" - integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0, get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: - version "5.1.2" - 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.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globalthis@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.1: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graphql-json-transform@^1.1.0-alpha.0: - version "1.1.0-alpha.0" - resolved "https://registry.yarnpkg.com/graphql-json-transform/-/graphql-json-transform-1.1.0-alpha.0.tgz#fb0c88d24840067e6c55ac64bbc8d4e5de245d2d" - integrity sha512-I6lR/lYEezSz4iru0f7a/wR8Rzi3pCafk7S0bX2b/WQOtK0vKabxLShGBXIslsi0arMehIjvOPHJl7MpOUqj0w== - -graphql-request@3.7.0: - version "3.7.0" - 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-tag@2.10.4: - version "2.10.4" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.4.tgz#2f301a98219be8b178a6453bb7e33b79b66d8f83" - integrity sha512-O7vG5BT3w6Sotc26ybcvLKNTdfr4GfsIVMD+LdYqXCeJIYPRyp8BIsDOUtxw7S1PYvRw5vH3278J2EDezR6mfA== - -graphql@15.5.0: - version "15.5.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.0.tgz#39d19494dbe69d1ea719915b578bf920344a69d5" - integrity sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA== - -graphql@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.2.0.tgz#de3150e80f1fc009590b92a9d16ab1b46e12b656" - integrity sha512-MuQd7XXrdOcmfwuLwC2jNvx0n3rxIuNYOxUtiee5XOmfrWo613ar2U8pE7aHAKh8VwfpifubpD9IP+EdEAEOsA== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== - -hardhat-watcher@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/hardhat-watcher/-/hardhat-watcher-2.3.0.tgz#57586a7fb79b73365014794f7e3dc0706aa65b7d" - integrity sha512-u76a/1pxPyW9DRZ7FZ8HoSQ4AuKOiSDQTR2NyiZlH5f0Ux+qQfahsh9CNusRLhx2s1OWzlkwCVvrdHq5FTGUzw== - dependencies: - chokidar "^3.5.3" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - 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.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.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - 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.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - 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" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - 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" - debug "4" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -iconv-lite@0.4.24: - version "0.4.24" - 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" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - 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.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - 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" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - 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.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -intl-messageformat-parser@6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.4.2.tgz#e2d28c3156c27961ead9d613ca55b6a155078d7d" - integrity sha512-IVNGy24lNEYr/KPWId5tF3KXRHFFbMgzIMI4kUonNa/ide2ywUYyBuOUro1IBGZJqjA2ncBVUyXdYKlMfzqpAA== - dependencies: - "@formatjs/ecma402-abstract" "1.6.2" - tslib "^2.1.0" - -intl-messageformat@9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.5.2.tgz#e72d32152c760b7411e413780e462909987c005a" - integrity sha512-sBGXcSQLyBuBA/kzAYhTpzhzkOGfSwGIau2W6FuwLZk0JE+VF3C+y0077FhVDOcRSi60iSfWzT8QC3Z7//dFxw== - dependencies: - fast-memoize "^2.5.2" - intl-messageformat-parser "6.4.2" - tslib "^2.1.0" - -invert-kv@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" - integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== - -ip-regex@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ipfs-core-utils@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.5.4.tgz#c7fa508562086be65cebb51feb13c58abbbd3d8d" - integrity sha512-V+OHCkqf/263jHU0Fc9Rx/uDuwlz3PHxl3qu6a5ka/mNi6gucbFuI53jWsevCrOOY9giWMLB29RINGmCV5dFeQ== - dependencies: - any-signal "^2.0.0" - blob-to-it "^1.0.1" - browser-readablestream-to-it "^1.0.1" - cids "^1.0.0" - err-code "^2.0.3" - ipfs-utils "^5.0.0" - it-all "^1.0.4" - it-map "^1.0.4" - it-peekable "^1.0.1" - multiaddr "^8.0.0" - multiaddr-to-uri "^6.0.0" - parse-duration "^0.4.4" - timeout-abort-controller "^1.1.1" - uint8arrays "^1.1.0" - -ipfs-http-client@48.1.3: - version "48.1.3" - resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-48.1.3.tgz#d9b91b1f65d54730de92290d3be5a11ef124b400" - integrity sha512-+JV4cdMaTvYN3vd4r6+mcVxV3LkJXzc4kn2ToVbObpVpdqmG34ePf1KlvFF8A9gjcel84WpiP5xCEV/IrisPBA== - dependencies: - any-signal "^2.0.0" - bignumber.js "^9.0.0" - cids "^1.0.0" - debug "^4.1.1" - form-data "^3.0.0" - ipfs-core-utils "^0.5.4" - ipfs-utils "^5.0.0" - ipld-block "^0.11.0" - ipld-dag-cbor "^0.17.0" - ipld-dag-pb "^0.20.0" - ipld-raw "^6.0.0" - it-last "^1.0.4" - it-map "^1.0.4" - it-tar "^1.2.2" - it-to-stream "^0.1.2" - merge-options "^2.0.0" - multiaddr "^8.0.0" - multibase "^3.0.0" - multicodec "^2.0.1" - multihashes "^3.0.1" - nanoid "^3.1.12" - native-abort-controller "~0.0.3" - parse-duration "^0.4.4" - stream-to-it "^0.2.2" - uint8arrays "^1.1.0" - -ipfs-utils@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-5.0.1.tgz#7c0053d5e77686f45577257a73905d4523e6b4f7" - integrity sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg== - dependencies: - abort-controller "^3.0.0" - any-signal "^2.1.0" - buffer "^6.0.1" - electron-fetch "^1.7.2" - err-code "^2.0.0" - fs-extra "^9.0.1" - is-electron "^2.2.0" - iso-url "^1.0.0" - it-glob "0.0.10" - it-to-stream "^0.1.2" - merge-options "^2.0.0" - nanoid "^3.1.3" - native-abort-controller "0.0.3" - native-fetch "^2.0.0" - node-fetch "^2.6.0" - stream-to-it "^0.2.0" - -ipld-block@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e" - integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw== - dependencies: - cids "^1.0.0" - -ipld-dag-cbor@^0.17.0: - version "0.17.1" - resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1" - integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw== - dependencies: - borc "^2.1.2" - cids "^1.0.0" - is-circular "^1.0.2" - multicodec "^3.0.1" - multihashing-async "^2.0.0" - uint8arrays "^2.1.3" - -ipld-dag-pb@^0.20.0: - version "0.20.0" - resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz#025c0343aafe6cb9db395dd1dc93c8c60a669360" - integrity sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg== - dependencies: - cids "^1.0.0" - class-is "^1.1.0" - multicodec "^2.0.0" - multihashing-async "^2.0.0" - protons "^2.0.0" - reset "^0.1.0" - run "^1.4.0" - stable "^0.1.8" - uint8arrays "^1.0.0" - -ipld-raw@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-6.0.0.tgz#74d947fcd2ce4e0e1d5bb650c1b5754ed8ea6da0" - integrity sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg== - dependencies: - cids "^1.0.0" - multicodec "^2.0.0" - multihashing-async "^2.0.0" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - 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-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-circular@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" - integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== - -is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-electron@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.1.tgz#751b1dd8a74907422faa5c35aaa0cf66d98086e9" - integrity sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - 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-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - 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-ip@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - -is-ipfs@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-ipfs/-/is-ipfs-1.0.3.tgz#4b8c4995c46beac38f0c05f8cecd77093dd6a6b3" - integrity sha512-7SAfhxp39rxMvr95qjHMtsle1xa7zXpIbhX/Q77iXKtMVnQ0Fr9AVpAUq+bl3HPXGXDpZJFP0hzWBZaMwD6vGg== - dependencies: - buffer "^5.6.0" - cids "~0.8.0" - iso-url "~0.4.7" - mafmt "^7.1.0" - multiaddr "^7.4.3" - multibase "~0.7.0" - multihashes "~0.4.19" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" - integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -iso-constants@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4" - integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ== - -iso-url@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" - integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== - -iso-url@~0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" - integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -it-all@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" - integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== - -it-concat@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-1.0.3.tgz#84db9376e4c77bf7bc1fd933bb90f184e7cef32b" - integrity sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA== - dependencies: - bl "^4.0.0" - -it-glob@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.10.tgz#4defd9286f693847c3ff483d2ff65f22e1359ad8" - integrity sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA== - dependencies: - fs-extra "^9.0.1" - minimatch "^3.0.4" - -it-last@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" - integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== - -it-map@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" - integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== - -it-peekable@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" - integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== - -it-reader@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-2.1.0.tgz#b1164be343f8538d8775e10fb0339f61ccf71b0f" - integrity sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw== - dependencies: - bl "^4.0.0" - -it-tar@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-1.2.2.tgz#8d79863dad27726c781a4bcc491f53c20f2866cf" - integrity sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA== - dependencies: - bl "^4.0.0" - buffer "^5.4.3" - iso-constants "^0.1.2" - it-concat "^1.0.0" - it-reader "^2.0.0" - p-defer "^3.0.0" - -it-to-stream@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-0.1.2.tgz#7163151f75b60445e86b8ab1a968666acaacfe7b" - integrity sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ== - dependencies: - buffer "^5.6.0" - fast-fifo "^1.0.0" - get-iterator "^1.0.2" - p-defer "^3.0.0" - p-fifo "^1.0.0" - readable-stream "^3.6.0" - -iterable-ndjson@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/iterable-ndjson/-/iterable-ndjson-1.1.0.tgz#36f7e8a5bb04fd087d384f29e44fc4280fc014fc" - integrity sha512-OOp1Lb0o3k5MkXHx1YaIY5Z0ELosZfTnBaas9f8opJVcZGBIONA2zY/6CYE+LKkqrSDooIneZbrBGgOZnHPkrg== - dependencies: - string_decoder "^1.2.0" - -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== - dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" - -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== - dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" - prompts "^2.0.1" - yargs "^15.4.1" - -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" - chalk "^4.0.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" - -jest-diff@^26.0.0, jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== - dependencies: - chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== - dependencies: - detect-newline "^3.0.0" - -jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" - -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" - -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== - -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^26.6.2" - is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== - dependencies: - chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" - slash "^3.0.0" - stack-utils "^2.0.2" - -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== - dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" - -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" - slash "^3.0.0" - -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" - source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - cjs-module-lexer "^0.6.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^15.4.1" - -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" - chalk "^4.0.0" - expect "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - natural-compare "^1.4.0" - pretty-format "^26.6.2" - semver "^7.3.2" - -jest-util@^26.1.0, jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== - dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" - chalk "^4.0.0" - jest-get-type "^26.3.0" - leven "^3.1.0" - pretty-format "^26.6.2" - -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== - dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^26.6.2" - string-length "^4.0.1" - -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest@26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== - dependencies: - "@jest/core" "^26.6.3" - import-local "^3.0.2" - jest-cli "^26.6.3" - -js-sha3@0.8.0, js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - 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" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbi@^3.1.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" - integrity sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ== - -jsdom@^16.4.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - 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.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-ref-parser@9.0.9: - version "9.0.9" - resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#66ea538e7450b12af342fa3d5b8458bc1e1e013f" - integrity sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q== - dependencies: - "@apidevtools/json-schema-ref-parser" "9.0.9" - -json-schema-traverse@^0.4.1: - version "0.4.1" - 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.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - 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-text-sequence@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== - dependencies: - delimit-stream "0.1.0" - -json5@2.x, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jsonfile@^2.1.0: - version "2.4.0" - 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@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonschema@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" - integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -lcid@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0" - integrity sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg== - dependencies: - invert-kv "^3.0.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - 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" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -line-column@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" - integrity sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww== - dependencies: - isarray "^1.0.0" - isobject "^2.0.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - 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" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== - -lodash.merge@4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@4.x, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.0.tgz#2696dadf4b4da2ce3f6f6b89186085d94d52fd61" - integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== - -lru-cache@^6.0.0: - version "6.0.0" - 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" - -mafmt@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-7.1.0.tgz#4126f6d0eded070ace7dbbb6fb04977412d380b5" - integrity sha512-vpeo9S+hepT3k2h5iFxzEHvvR0GPBx9uKaErmnRzYNcaKb03DgOArjEMlgG4a9LcuZZ89a3I8xbeto487n26eA== - dependencies: - multiaddr "^7.3.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-age-cleaner@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -mem@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" - integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== - dependencies: - map-age-cleaner "^0.1.3" - mimic-fn "^2.1.0" - p-is-promise "^2.1.0" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -merge-options@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-2.0.0.tgz#36ca5038badfc3974dbde5e58ba89d3df80882c3" - integrity sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ== - dependencies: - is-plain-obj "^2.0.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - 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" - -mime-db@1.52.0: - version "1.52.0" - 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.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.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@*: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - 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.1.1, minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@1.x, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -moo@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" - integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multiaddr-to-uri@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz#8f08a75c6eeb2370d5d24b77b8413e3f0fa9bcc0" - integrity sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A== - dependencies: - multiaddr "^8.0.0" - -multiaddr@^7.3.0, multiaddr@^7.4.3: - version "7.5.0" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-7.5.0.tgz#976c88e256e512263445ab03b3b68c003d5f485e" - integrity sha512-GvhHsIGDULh06jyb6ev+VfREH9evJCFIRnh3jUt9iEZ6XDbyoisZRFEI9bMvK/AiR6y66y6P+eoBw9mBYMhMvw== - dependencies: - buffer "^5.5.0" - cids "~0.8.0" - class-is "^1.1.0" - is-ip "^3.1.0" - multibase "^0.7.0" - varint "^5.0.0" - -multiaddr@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f" - integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ== - dependencies: - cids "^1.0.0" - class-is "^1.1.0" - dns-over-http-resolver "^1.0.0" - err-code "^2.0.3" - is-ip "^3.1.0" - multibase "^3.0.0" - uint8arrays "^1.1.0" - varint "^5.0.0" - -multibase@^0.7.0, multibase@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@^1.0.0, multibase@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-1.0.1.tgz#4adbe1de0be8a1ab0274328b653c3f1903476724" - integrity sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@^3.0.0, multibase@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f" - integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw== - dependencies: - "@multiformats/base-x" "^4.0.1" - web-encoding "^1.0.6" - -multibase@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" - integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== - dependencies: - "@multiformats/base-x" "^4.0.1" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0, multicodec@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multicodec@^2.0.0, multicodec@^2.0.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-2.1.3.tgz#b9850635ad4e2a285a933151b55b4a2294152a5d" - integrity sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA== - dependencies: - uint8arrays "1.1.0" - varint "^6.0.0" - -multicodec@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.2.1.tgz#82de3254a0fb163a107c1aab324f2a91ef51efb2" - integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== - dependencies: - uint8arrays "^3.0.0" - varint "^6.0.0" - -multiformats@9.7.0: - version "9.7.0" - resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.7.0.tgz#845799e8df70fbb6b15922500e45cb87cf12f7e5" - integrity sha512-uv/tcgwk0yN4DStopnBN4GTgvaAlYdy6KnZpuzEPFOYQd71DYFJjs0MN1ERElAflrZaYyGBWXyGxL5GgrxIx0Q== - -multiformats@^9.4.2: - version "9.7.1" - resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.7.1.tgz#ab348e5fd6f8e7fb3fd56033211bda48854e2173" - integrity sha512-TaVmGEBt0fhxiNJMGphBfB+oGvUxFs8KgGvgl8d3C+GWtrFcvXdJ2196eg+dYhmSFClmgFfSfJEklo+SZzdNuw== - -multihashes@^0.4.15, multihashes@~0.4.15, multihashes@~0.4.19: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -multihashes@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-1.0.1.tgz#a89415d68283cf6287c6e219e304e75ce7fb73fe" - integrity sha512-S27Tepg4i8atNiFaU5ZOm3+gl3KQlUanLs/jWcBxQHFttgq+5x1OgbQmf2d8axJ/48zYGBd/wT9d723USMFduw== - dependencies: - buffer "^5.6.0" - multibase "^1.0.1" - varint "^5.0.0" - -multihashes@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-3.1.2.tgz#ffa5e50497aceb7911f7b4a3b6cada9b9730edfc" - integrity sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ== - dependencies: - multibase "^3.1.0" - uint8arrays "^2.0.5" - varint "^6.0.0" - -multihashes@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - -multihashing-async@^2.0.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.4.tgz#26dce2ec7a40f0e7f9e732fc23ca5f564d693843" - integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== - dependencies: - blakejs "^1.1.0" - err-code "^3.0.0" - js-sha3 "^0.8.0" - multihashes "^4.0.1" - murmurhash3js-revisited "^3.0.0" - uint8arrays "^3.0.0" - -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== - -mustache@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2" - integrity sha512-yL5VE97+OXn4+Er3THSmTdCFCtx5hHWzrolvH+JObZnUYwuaG7XV+Ch4fR2cIrcYI0tFHxS7iyFYl14bW8y2sA== - -nanoid@^3.1.12, nanoid@^3.1.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -native-abort-controller@0.0.3, native-abort-controller@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-0.0.3.tgz#4c528a6c9c7d3eafefdc2c196ac9deb1a5edf2f8" - integrity sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA== - dependencies: - globalthis "^1.0.1" - -native-abort-controller@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" - integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== - -native-fetch@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-2.0.1.tgz#319d53741a7040def92d5dc8ea5fe9416b1fad89" - integrity sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ== - dependencies: - globalthis "^1.0.1" - -native-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" - integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nearley@^2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" - integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== - dependencies: - commander "^2.19.0" - moo "^0.5.0" - railroad-diagrams "^1.0.0" - randexp "0.4.6" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@2.6.7, node-fetch@^2.6.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-notifier@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - -noms@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" - integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - 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.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" - integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.2" - 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.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.3.tgz#d36b7700ddf0019abb6b1df1bb13f6445f79051f" - integrity sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - -object.values@^1.1.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - 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.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -os-locale@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-5.0.0.tgz#6d26c1d95b6597c5d5317bf5fba37eccec3672e0" - integrity sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA== - dependencies: - execa "^4.0.0" - lcid "^3.0.0" - mem "^5.0.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== - -p-defer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" - integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== - -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - -p-fifo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" - integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== - dependencies: - fast-fifo "^1.0.0" - p-defer "^3.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - 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.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.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.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-try@^1.0.0: - version "1.0.0" - 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.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - 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-duration@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" - integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-json@^5.0.0: - version "5.2.0" - 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" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-exists@^3.0.0: - version "3.0.0" - 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.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.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== - dependencies: - pify "^2.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -picocolors@^1.0.0: - version "1.0.0" - 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.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -polywrap@0.9.4: - version "0.9.4" - resolved "https://registry.yarnpkg.com/polywrap/-/polywrap-0.9.4.tgz#4f59c1a0cddfa1e5b70db11f3b096ba8d98affcf" - integrity sha512-Ybldk/WCEgmxZPy7bDKPWn+23uA+3Bwmh0vlJXNb1zvEESVqIxSgB5H9cURTTmJyEb7nr1FwEJIc9+Gr7wmnPw== - dependencies: - "@ethersproject/providers" "5.6.8" - "@ethersproject/wallet" "5.6.2" - "@formatjs/intl" "1.8.2" - "@polywrap/asyncify-js" "0.9.4" - "@polywrap/client-config-builder-js" "0.9.4" - "@polywrap/client-js" "0.9.4" - "@polywrap/core-js" "0.9.4" - "@polywrap/ens-resolver-plugin-js" "0.9.4" - "@polywrap/ethereum-plugin-js" "0.9.4" - "@polywrap/ipfs-plugin-js" "0.9.4" - "@polywrap/logging-js" "0.9.4" - "@polywrap/msgpack-js" "0.9.4" - "@polywrap/os-js" "0.9.4" - "@polywrap/polywrap-manifest-types-js" "0.9.4" - "@polywrap/schema-bind" "0.9.4" - "@polywrap/schema-compose" "0.9.4" - "@polywrap/schema-parse" "0.9.4" - "@polywrap/test-env-js" "0.9.4" - "@polywrap/wasm-js" "0.9.4" - "@polywrap/wrap-manifest-types-js" "0.9.4" - axios "0.21.2" - chalk "4.1.0" - chokidar "3.5.1" - commander "9.2.0" - content-hash "2.5.2" - copyfiles "2.4.1" - docker-compose "0.23.17" - extract-zip "2.0.1" - form-data "4.0.0" - fs-extra "9.0.1" - ipfs-http-client "48.1.3" - json-schema "0.4.0" - json-schema-ref-parser "9.0.9" - jsonschema "1.4.0" - mustache "4.0.1" - os-locale "5.0.0" - regex-parser "2.2.11" - rimraf "3.0.2" - toml "3.0.0" - typescript "4.1.6" - yaml "2.1.3" - yesno "0.4.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - 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.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" - integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== - -pretty-format@^26.0.0, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - -protons@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.3.tgz#94f45484d04b66dfedc43ad3abff1e8907994bb2" - integrity sha512-j6JikP/H7gNybNinZhAHMN07Vjr1i4lVupg598l4I9gSTjJqOvKnwjzYX2PzvBTSVf2eZ2nWv4vG+mtW8L6tpA== - dependencies: - protocol-buffers-schema "^3.3.1" - signed-varint "^2.0.1" - uint8arrays "^3.0.0" - varint "^5.0.0" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -pull-stream-to-async-iterator@^1.0.1, pull-stream-to-async-iterator@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pull-stream-to-async-iterator/-/pull-stream-to-async-iterator-1.0.2.tgz#5cc1a3a146ef6bbf01c17755647369b683b24986" - integrity sha512-c3KRs2EneuxP7b6pG9fvQTIjatf33RbIErhbQ75s5r2MI6E8R74NZC1nJgXc8kcmqiQxmr+TWY+WwK2mWaUnlA== - dependencies: - pull-stream "^3.6.9" - -pull-stream@^3.6.9: - version "3.6.14" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" - integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -railroad-diagrams@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" - integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A== - -randexp@0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" - integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== - dependencies: - discontinuous-range "1.0.0" - ret "~0.1.10" - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - 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" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@~3.5.0: - version "3.5.0" - 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.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -receptacle@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" - integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== - dependencies: - ms "^2.1.1" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regex-parser@2.2.11: - version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-directory@^2.1.1: - version "2.1.1" - 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.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.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -reset@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb" - integrity sha512-RF7bp2P2ODreUPA71FZ4DSK52gNLJJ8dSwA1nhOCoC0mI4KZ4D/W6zhd2nfBqX/JlR+QZ/iUqAYPjq1UQU8l0Q== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0: - version "1.22.1" - 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" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retimer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" - integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^2.2.8: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -run-parallel@^1.1.9: - version "1.2.0" - 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" - -run@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/run/-/run-1.4.0.tgz#e17d9e9043ab2fe17776cb299e1237f38f0b4ffa" - integrity sha512-962oBW07IjQ9SizyMHdoteVbDKt/e2nEsnTRZ0WjK/zs+jfQQICqH0qj0D5lqZNuy0JkbzfA6IOqw0Sk7C3DlQ== - dependencies: - minimatch "*" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@7.x, semver@^7.2.1, semver@^7.3.2: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - 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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signed-varint@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" - integrity sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw== - dependencies: - varint "~5.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -solc@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.3.tgz#896fdca2f0c4ccf18ff7a99f8183a5a1a8f6345c" - integrity sha512-VZvSHtwe2zAsoviClIpWjvrg22bIZ0pLtzFrYD9BtPfR7mhMZYwpptnzRizNaSvMngTR+gB9Ul8IyL5xaC7+jw== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - follow-redirects "^1.12.1" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.17, source-map-support@^0.5.20, source-map-support@^0.5.6: - version "0.5.21" - 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" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -spawn-command@0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-to-it@^0.2.0, stream-to-it@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" - integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== - dependencies: - get-iterator "^1.0.2" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - 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" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string_decoder@^1.1.1, string_decoder@^1.2.0: - version "1.3.0" - 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" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - 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.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - 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.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-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -table@^6.0.4, table@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -timeout-abort-controller@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" - integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== - dependencies: - abort-controller "^3.0.0" - retimer "^2.0.0" - -tiny-invariant@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== - -tiny-warning@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -tmp@0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - 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" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" - integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== - -toml@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-jest@26.5.6: - version "26.5.6" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" - integrity sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA== - dependencies: - bs-logger "0.x" - buffer-from "1.x" - fast-json-stable-stringify "2.x" - jest-util "^26.1.0" - json5 "2.x" - lodash "4.x" - make-error "1.x" - mkdirp "1.x" - semver "7.x" - yargs-parser "20.x" - -ts-mixer@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-5.4.1.tgz#b90db9ced48531aa17ce9184a2890d1e3c99b1e5" - integrity sha512-Zo9HgPCtNouDgJ+LGtrzVOjSg8+7WGQktIKLwAfaNrlOK1mWGlz1ejsAF/YqUEqAGjUTeB5fEg8gH9Aui6w9xA== - -ts-node@8.10.2: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== - dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -tsconfig-paths@^3.9.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tsutils@^3.17.1: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - 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-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - 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.21.3: - version "0.21.3" - 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.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.6.tgz#1becd85d77567c3c741172339e93ce2e69932138" - integrity sha512-pxnwLxeb/Z5SP80JDRzVjh58KsM6jZHRAOtTpS7sXLS4ogXNKC9ANxHHZqLLeVHZN35jCtI4JdmLLbLiC1kBow== - -uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" - integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA== - dependencies: - multibase "^3.0.0" - web-encoding "^1.0.2" - -uint8arrays@^2.0.5, uint8arrays@^2.1.3: - version "2.1.10" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" - integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== - dependencies: - multiformats "^9.4.2" - -uint8arrays@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.0.tgz#8186b8eafce68f28bd29bd29d683a311778901e2" - integrity sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog== - dependencies: - multiformats "^9.4.2" - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -update-browserslist-db@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.12.3: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -v8-to-istanbul@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - -visitor-as@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/visitor-as/-/visitor-as-0.6.0.tgz#b0cca3c918bd9d396545faf08529d2b9ba968a40" - integrity sha512-4WcnwCLXWjhNkwJj9gSqh46sdIv9CyIvnSuwr61OOfrGCtN2mKcW5KE828OeEr1rYjEy0Z/CIdPBJKJRLsUgDA== - dependencies: - lodash.clonedeep "^4.5.0" - ts-mixer "^5.4.1" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -web-encoding@^1.0.2, web-encoding@^1.0.6: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which-typed-array@^1.1.2: - version "1.1.8" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" - integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.9" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - 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" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - 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" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== - -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - 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.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207" - integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@20.x, 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@^18.1.2: - version "18.1.3" - 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@^15.4.1: - version "15.4.1" - 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" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^16.1.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yesno@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/yesno/-/yesno-0.4.0.tgz#5d674f14d339f0bd4b0edc47f899612c74fcd895" - integrity sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==