diff --git a/.circleci/config.yml b/.circleci/config.yml
deleted file mode 100644
index 28ec01f7..00000000
--- a/.circleci/config.yml
+++ /dev/null
@@ -1,113 +0,0 @@
-version: 2
-jobs:
- checkout_and_install:
- docker:
- - image: circleci/node:11
- working_directory: ~/balancer
- steps:
- - checkout
- - restore_cache:
- keys:
- - dependency-cache-{{ checksum "package.json" }}
- - run:
- name: Install Dependencies
- command: yarn install --quiet
- - save_cache:
- key: dependency-cache-{{ checksum "package.json" }}
- paths:
- - node_modules
- - save_cache:
- key: balancer-{{ .Environment.CIRCLE_SHA1 }}
- paths:
- - ~/balancer
- lint:
- docker:
- - image: circleci/node:11
- working_directory: ~/balancer
- steps:
- - restore_cache:
- key: balancer-{{ .Environment.CIRCLE_SHA1 }}
- - run:
- name: Lint contracts
- command: yarn lint:contracts
- - run:
- name: Lint tests
- command: yarn lint
- build:
- docker:
- - image: circleci/node:11
- - image: ethereum/solc:0.5.11
- working_directory: ~/balancer
- steps:
- - restore_cache:
- key: balancer-{{ .Environment.CIRCLE_SHA1 }}
- - run:
- name: Compile contracts
- command: yarn compile
- - save_cache:
- key: balancer-contracts-build-{{ .Environment.CIRCLE_SHA1 }}
- paths:
- - ~/balancer
- test:
- docker:
- - image: circleci/node:11
- - image: trufflesuite/ganache-cli
- command: ganache-cli -d -l 4294967295 --allowUnlimitedContractSize
- working_directory: ~/balancer
- steps:
- - restore_cache:
- key: balancer-contracts-build-{{ .Environment.CIRCLE_SHA1 }}
- - run:
- name: Run tests
- command: yarn test
-
- coverage:
- docker:
- - image: circleci/node:11
- working_directory: ~/balancer
- steps:
- - setup_remote_docker:
- docker_layer_caching: true
- - run:
- name: Fetch solc version
- command: docker pull ethereum/solc:0.5.11
- - restore_cache:
- key: balancer-contracts-build-{{ .Environment.CIRCLE_SHA1 }}
- - run:
- name: Coverage
- command: yarn coverage && cat coverage/lcov.info | ./node_modules/.bin/coveralls
-
- slither:
- docker:
- - image: trailofbits/eth-security-toolbox
- working_directory: ~/balancer
- steps:
- - checkout
- - run:
- name: Compile
- command: truffle compile
- - run:
- name: Slither
- command: slither . --filter-paths test --exclude=naming-convention,unused-state,solc-version,constable-states,external-function,reentrancy-events
-
-workflows:
- version: 2
- build_and_test:
- jobs:
- - checkout_and_install
- - lint:
- requires:
- - checkout_and_install
- - build:
- requires:
- - checkout_and_install
- - test:
- requires:
- - build
- - coverage:
- requires:
- - build
- - slither:
- requires:
- - build
-
\ No newline at end of file
diff --git a/.env.example b/.env.example
new file mode 100644
index 00000000..fe295b73
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,7 @@
+MAINNET_RPC=
+MAINNET_DEPLOYER_PK=
+
+SEPOLIA_RPC=
+SEPOLIA_DEPLOYER_PK=
+
+ETHERSCAN_API_KEY=
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 627a482a..00000000
--- a/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build/*
-coverage/*
-migrations/*
\ No newline at end of file
diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index ff5266d7..00000000
--- a/.eslintrc
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "extends": [
- "airbnb"
- ],
- "rules": {
- "indent": ["error", 4],
- "max-len": ["error", { "code": 120 }],
- "no-console": "off"
- },
- "globals" : {
- "artifacts": false,
- "contract": false,
- "assert": false,
- "it": false,
- "before": false,
- "describe": false,
- "web3": false
- }
-}
\ No newline at end of file
diff --git a/.forge-snapshots/swapExactAmountIn.snap b/.forge-snapshots/swapExactAmountIn.snap
new file mode 100644
index 00000000..4a35246a
--- /dev/null
+++ b/.forge-snapshots/swapExactAmountIn.snap
@@ -0,0 +1 @@
+116075
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 52031de5..00000000
--- a/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-*.sol linguist-language=Solidity
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..300f519c
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,98 @@
+name: CI
+
+on: [push]
+
+concurrency:
+ group: ${{github.workflow}}-${{github.ref}}
+ cancel-in-progress: true
+
+env:
+ MAINNET_RPC: ${{ secrets.MAINNET_RPC }}
+ SEPOLIA_RPC: ${{ secrets.SEPOLIA_RPC }}
+
+jobs:
+ unit-tests:
+ name: Run Unit Tests
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Use Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18.x
+ cache: 'yarn'
+
+ - name: Install dependencies
+ run: yarn --frozen-lockfile --network-concurrency 1
+
+ - name: Create mock files with smock
+ run: yarn smock
+
+ - name: Precompile using 0.8.14 and via-ir=false
+ run: yarn build
+
+ - name: Run tests
+ shell: bash
+ run: yarn test:unit
+
+ integration-tests:
+ name: Run Integration Tests
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Use Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18.x
+ cache: 'yarn'
+
+ - name: Install dependencies
+ run: yarn --frozen-lockfile --network-concurrency 1
+
+ - name: Create mock files with smock
+ run: yarn smock
+
+ - name: Precompile using 0.8.14 and via-ir=false
+ run: yarn build
+
+ - name: Run tests
+ run: yarn test:integration
+
+ lint:
+ name: Lint Commit Messages
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+
+ - uses: wagoid/commitlint-github-action@v5
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Use Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18.x
+ cache: 'yarn'
+
+ - name: Install dependencies
+ run: yarn --frozen-lockfile --network-concurrency 1
+
+ - run: yarn lint:check
diff --git a/.gitignore b/.gitignore
index e8f2d013..c6c30df9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,24 @@
-build
-node_modules
-.idea/*
-coverage.json
-coverage/
+# General
yarn-error.log
-crytic-export
-mcore_*
\ No newline at end of file
+node_modules
+.DS_STORE
+.vscode
+
+# Foundry files
+cache
+out-via-ir
+
+# Config files
+.env
+
+# Avoid ignoring gitkeep
+!/**/.gitkeep
+
+# Keep the latest deployment only
+broadcast/*/*/*
+
+# Out dir
+out
+
+# Smock dir
+test/smock
diff --git a/.husky/.gitignore b/.husky/.gitignore
new file mode 100644
index 00000000..31354ec1
--- /dev/null
+++ b/.husky/.gitignore
@@ -0,0 +1 @@
+_
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100755
index 00000000..314e8214
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx --no-install commitlint --edit $1
\ No newline at end of file
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100755
index 00000000..f567e92a
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,7 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+# 1. Build the contracts
+# 2. Stage build output
+# 2. Lint and stage style improvements
+yarn build && npx lint-staged
\ No newline at end of file
diff --git a/.solcover.js b/.solcover.js
deleted file mode 100644
index 5e08b372..00000000
--- a/.solcover.js
+++ /dev/null
@@ -1,8 +0,0 @@
-module.exports = {
- port: 8555,
- skipFiles: [
- 'Migrations.sol',
- 'test'
- ],
- testrpcOptions: "-p 8555 -d"
-};
\ No newline at end of file
diff --git a/.solhint.json b/.solhint.json
index 8fa7fddf..48de62d1 100644
--- a/.solhint.json
+++ b/.solhint.json
@@ -1,10 +1,22 @@
{
"extends": "solhint:recommended",
"rules": {
- "mark-callable-contracts": "off",
- "event-name-camelcase": "off",
- "const-name-snakecase": "off",
+ "compiler-version": ["off"],
+ "constructor-syntax": "warn",
+ "quotes": ["error", "single"],
+ "func-visibility": ["warn", { "ignoreConstructors": true }],
+ "not-rely-on-time": "off",
+ "no-inline-assembly": "off",
+ "no-empty-blocks": "off",
+ "private-vars-leading-underscore": ["warn", { "strict": false }],
+ "ordering": "warn",
+ "immutable-name-snakecase": "warn",
+ "avoid-low-level-calls": "off",
+ "no-console": "off",
"max-line-length": ["warn", 120],
- "indent": ["error", 4]
+ "TODO": "REMOVE_TEMPORARY_LINTER_SETTINGS_BELOW",
+ "custom-errors": "off",
+ "one-contract-per-file": "off",
+ "definition-name-capwords": "off"
}
}
diff --git a/.solhint.tests.json b/.solhint.tests.json
new file mode 100644
index 00000000..887fba05
--- /dev/null
+++ b/.solhint.tests.json
@@ -0,0 +1,27 @@
+{
+ "extends": "solhint:recommended",
+ "rules": {
+ "compiler-version": ["off"],
+ "constructor-syntax": "warn",
+ "quotes": ["error", "single"],
+ "func-visibility": ["warn", { "ignoreConstructors": true }],
+ "not-rely-on-time": "off",
+ "func-name-mixedcase": "off",
+ "var-name-mixedcase": "off",
+ "const-name-snakecase": "off",
+ "no-inline-assembly": "off",
+ "no-empty-blocks": "off",
+ "definition-name-capwords": "off",
+ "named-parameters-function": "off",
+ "no-global-import": "off",
+ "max-states-count": "off",
+ "no-unused-vars": "off",
+ "private-vars-leading-underscore": ["off"],
+ "ordering": "off",
+ "state-visibility": "off",
+ "immutable-name-snakecase": "warn",
+ "avoid-low-level-calls": "off",
+ "one-contract-per-file": "off",
+ "max-line-length": ["warn", 125]
+ }
+}
diff --git a/.solhintignore b/.solhintignore
new file mode 100644
index 00000000..9fdb1048
--- /dev/null
+++ b/.solhintignore
@@ -0,0 +1 @@
+test/smock/*
\ No newline at end of file
diff --git a/Audit.md b/Audit.md
deleted file mode 100644
index b3239b49..00000000
--- a/Audit.md
+++ /dev/null
@@ -1,111 +0,0 @@
-- [Installation](#Installation)
-- [Testing with Echidna](#testing-properties-with-echidna)
-- [Code verification with Manticore](#Code-verification-with-Manticore)
-
-# Installation
-
-**Slither**
-```
-pip3 install slither-analyzer
-```
-
-**Manticore**
-```
-pip3 install manticore
-```
-
-**Echidna**
-See [Echidna Installation](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#installation).
-
-
-```
-docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox
-```
-
-```
-solc-select 0.5.12
-cd /home/training
-```
-
-
-# Testing properties with Echidna
-
-`slither-flat` will export the contract and translate external function to public, to faciliate writting properties:
-```
-slither-flat . --convert-external
-```
-
-The flattened contracts are in `crytic-export/flattening`. The Echidna properties are in `echidna/`.
-
-## Properties
-
-Echidna properties can be broadly divided in two categories: general properties of the contracts that states what user can and cannot do and
-specific properties based on unit tests.
-
-To test a property, run `echidna-test echidna/CONTRACT_file.sol CONTRACT_name --config echidna/CONTRACT_name.yaml`.
-
-## General Properties
-
-| Description | Name | Contract | Finding | Status |
-| :--- | :---: | :---: | :---: | :---: |
-| An attacker cannot steal assets from a public pool. | [`attacker_token_balance`](echidna/TBPoolBalance.sol#L22-L25) | [`TBPoolBalance`](echidna/TBPoolBalance.sol) |FAILED ([#193](https://github.com/balancer-labs/balancer-core/issues/193))| **Fixed** |
-| An attacker cannot force the pool balance to be out-of-sync. | [`pool_record_balance`](echidna/TBPoolBalance.sol#L27-L33) | [`TBPoolBalance`](echidna/TBPoolBalance.sol)|PASSED| |
-| An attacker cannot generate free pool tokens with `joinPool` (1, 2). | [`joinPool`](contracts/test/echidna/TBPoolJoinPool.sol#L7-L31) | [`TBPoolJoinPool`](contracts/test/echidna/TBPoolBalance.sol)|FAILED ([#204](https://github.com/balancer-labs/balancer-core/issues/204))| **Mitigated** |
-| Calling `joinPool-exitPool` does not lead to free pool tokens (no fee) (1, 2). | [`joinPool`](contracts/test/echidna/TBPoolJoinExitPoolNoFee.sol#L34-L59) | [`TBPoolJoinExitNoFee`](contracts/test/echidna/TBPoolJoinExitPoolNoFee.sol)|FAILED ([#205](https://github.com/balancer-labs/balancer-core/issues/205))| **Mitigated** |
-| Calling `joinPool-exitPool` does not lead to free pool tokens (with fee) (1, 2). | [`joinPool`](contracts/test/echidna/TBPoolJoinExitPool.sol#L37-L62) | [`TBPoolJoinExit`](contracts/test/echidna/TBPoolJoinExitPool.sol)|FAILED ([#205](https://github.com/balancer-labs/balancer-core/issues/205))| **Mitigated** |
-| Calling `exitswapExternAmountOut` does not lead to free asset (1). | [`exitswapExternAmountOut`](echidna/TBPoolExitSwap.sol#L8-L21) | [`TBPoolExitSwap`](contracts/test/echidna/TBPoolExitSwap.sol)|FAILED ([#203](https://github.com/balancer-labs/balancer-core/issues/203))| **Mitigated** |
-
-
-(1) These properties target a specific piece of code.
-
-(2) These properties don't need slither-flat, and are integrated into `contracts/test/echidna/`. To test them run `echidna-test . CONTRACT_name --config ./echidna_general_config.yaml`.
-
-## Unit-test-based Properties
-
-| Description | Name | Contract | Finding | Status |
-| :--- | :---: | :---: | :---: | :---: |
-| If the controller calls `setController`, then the `getController()` should return the new controller. | [`controller_should_change`](echidna/TBPoolController.sol#L6-L13) | [`TBPoolController`](echidna/TBPoolController.sol)|PASSED| |
-| The controller cannot be changed to a null address (`0x0`). | [`controller_cannot_be_null`](echidna/TBPoolController.sol#L15-L23) | [`TBPoolController`](echidna/TBPoolController.sol)|FAILED ([#198](https://github.com/balancer-labs/balancer-core/issues/198))| **WONT FIX** |
-| The controller cannot be changed by other users. | [`no_other_user_can_change_the_controller`](echidna/TBPoolController.sol#L28-L31) | [`TBPoolController`](echidna/TBPoolController.sol)|PASSED| |
-| The sum of normalized weight should be 1 if there are tokens binded. | [`valid_weights`](echidna/TBPoolLimits.sol#L35-L52) | [`TBPoolLimits`](echidna/TBPoolLimits.sol) |FAILED ([#208](https://github.com/balancer-labs/balancer-core/issues/208)| **Mitigated** |
-| The balances of all the tokens are greater or equal than `MIN_BALANCE`. | [`min_token_balance`](echidna/TBPoolLimits.sol#L65-L74) | [`TBPoolLimits`](echidna/TBPoolLimits.sol) |FAILED ([#210](https://github.com/balancer-labs/balancer-core/issues/210)) | **WONT FIX**|
-| The weight of all the tokens are less or equal than `MAX_WEIGHT`. | [`max_weight`](echidna/TBPoolLimits.sol#L76-L85) | [`TBPoolLimits`](echidna/TBPoolLimits.sol) |PASSED| |
-| The weight of all the tokens are greater or equal than `MIN_WEIGHT`. | [`min_weight`](echidna/TBPoolLimits.sol#L87-L96) | [`TBPoolLimits`](echidna/TBPoolLimits.sol) |PASSED| |
-| The swap fee is less or equal tan `MAX_FEE`. | [`min_swap_free`](echidna/TBPoolLimits.sol#L99-L102) | [`TBPoolLimits`](echidna/TBPoolLimits.sol) |PASSED| |
-| The swap fee is greater or equal than `MIN_FEE`. | [`max_swap_free`](echidna/TBPoolLimits.sol#L104-L107) | [`TBPoolLimits`](echidna/TBPoolLimits.sol) |PASSED| |
-| An user can only swap in less than 50% of the current balance of tokenIn for a given pool. | [`max_swapExactAmountIn`](echidna/TBPoolLimits.sol#L134-L156) | [`TBPoolLimits`](echidna/TBPoolLimits.sol) |FAILED ([#212](https://github.com/balancer-labs/balancer-core/issues/212))| **Fixed** |
-| An user can only swap out less than 33.33% of the current balance of tokenOut for a given pool. | [`max_swapExactAmountOut`](echidna/TBPoolLimits.sol#L109-L132) | [`TBPoolLimits`](echidna/TBPoolLimits.sol) |FAILED ([#212](https://github.com/balancer-labs/balancer-core/issues/212))| **Fixed** |
-| If a token is bounded, the `getSpotPrice` should never revert. | [`getSpotPrice_no_revert`](echidna/TBPoolNoRevert.sol#L34-L44) | [`TBPoolNoRevert`](echidna/TBPoolNoRevert.sol) |PASSED| |
-| If a token is bounded, the `getSpotPriceSansFee` should never revert. | [`getSpotPriceSansFee_no_revert`](echidna/TBPoolNoRevert.sol#L46-L56) | [`TBPoolNoRevert`](echidna/TBPoolNoRevert.sol) |PASSED| |
-| Calling `swapExactAmountIn` with a small value of the same token should never revert. | [`swapExactAmountIn_no_revert`](echidna/TBPoolNoRevert.sol#L58-L77) | [`TBPoolNoRevert`](echidna/TBPoolNoRevert.sol) |PASSED| |
-| Calling `swapExactAmountOut` with a small value of the same token should never revert. | [`swapExactAmountOut_no_revert`](echidna/TBPoolNoRevert.sol#L79-L99) | [`TBPoolNoRevert`](echidna/TBPoolNoRevert.sol) |PASSED| |
-| If a user joins pool and exits it with the same amount, the balances should keep constant. | [`joinPool_exitPool_balance_consistency`](echidna/TBPoolJoinExit.sol#L48-L97) | [`TBPoolJoinExit`](echidna/TBPoolJoinExit.sol) |PASSED| |
-| If a user joins pool and exits it with a larger amount, `exitPool` should revert. | [`impossible_joinPool_exitPool`](echidna/TBPoolJoinExit.sol#L99-L112) | [`TBPoolJoinExit`](echidna/TBPoolJoinExit.sol) |PASSED| |
-| It is not possible to bind more than `MAX_BOUND_TOKENS`. | [`getNumTokens_less_or_equal_MAX_BOUND_TOKENS`](echidna/TBPoolBind.sol#L40-L43) | [`TBPoolBind`](echidna/TBPoolBind.sol) |PASSED| |
-| It is not possible to bind more than once the same token. | [`bind_twice`](echidna/TBPoolBind.sol#L45-L54) | [`TBPoolBind`](echidna/TBPoolBind.sol) |PASSED| |
-| It is not possible to unbind more than once the same token. | [`unbind_twice`](echidna/TBPoolBind.sol#L56-L66) | [`TBPoolBind`](echidna/TBPoolBind.sol) |PASSED| |
-| It is always possible to unbind a token. | [`all_tokens_are_unbindable`](echidna/TBPoolBind.sol#L68-L81) | [`TBPoolBind`](echidna/TBPoolBind.sol) |PASSED| |
-| All tokens are rebindable with valid parameters. | [`all_tokens_are_rebindable_with_valid_parameters`](echidna/TBPoolBind.sol#L83-L95) | [`TBPoolBind`](echidna/TBPoolBind.sol) |PASSED| |
-| It is not possible to rebind an unbinded token. | [`rebind_unbinded`](echidna/TBPoolBind.sol#L97-L107) | [`TBPoolBind`](echidna/TBPoolBind.sol) |PASSED| |
-| Only the controller can bind. | [`when_bind`](echidna/TBPoolBind.sol#L150-L154) and [`only_controller_can_bind`](echidna/TBPoolBind.sol#L145-L148) | [`TBPoolBind`](echidna/TBPoolBind.sol) |PASSED| |
-| If a user that is not the controller, tries to bind, rebind or unbind, the operation will revert. | [`when_bind`](echidna/TBPoolBind.sol#L150-L154), [`when_rebind`](echidna/TBPoolBind.sol#L150-L154) and [`when_unbind`](echidna/TBPoolBind.sol#L163-L168) | [`TBPoolBind`](echidna/TBPoolBind.sol) |PASSED| |
-| Transfer tokens to the null address (`0x0`) causes a revert | [`transfer_to_zero`](echidna/TBTokenERC20.sol#L75-L79) and [`transferFrom_to_zero`](echidna/TBTokenERC20.sol#L85-L89) | [`TBTokenERC20`](echidna/TBTokenERC20.sol) |FAILED ([#197](https://github.com/balancer-labs/balancer-core/issues/197))| **WONT FIX** |
-| The null address (`0x0`) owns no tokens | [`zero_always_empty`](echidna/TBTokenERC20.sol#L34-L36) | [`TBTokenERC20`](echidna/TBTokenERC20.sol) |FAILED| **WONT FIX** |
-| Transfer a valid amout of tokens to non-null address reduces the current balance | [`transferFrom_to_other`](echidna/TBTokenERC20.sol#L108-L113) and [`transfer_to_other`](echidna/TBTokenERC20.sol#L131-L142) | [`TBTokenERC20`](echidna/TBTokenERC20.sol) |PASSED| |
-| Transfer an invalid amout of tokens to non-null address reverts or returns false | [`transfer_to_user`](echidna/TBTokenERC20.sol#L149-L155) | [`TBTokenERC20`](echidna/TBTokenERC20.sol) |PASSED| |
-| Self transfer a valid amout of tokens keeps the current balance constant | [`self_transferFrom`](echidna/TBTokenERC20.sol#L96-L101) and [`self_transfer`](echidna/TBTokenERC20.sol#L120-L124) | [`TBTokenERC20`](echidna/TBTokenERC20.sol) |PASSED| |
-| Approving overwrites the previous allowance value | [`approve_overwrites`](echidna/TBTokenERC20.sol#L42-L49) | [`TBTokenERC20`](echidna/TBTokenERC20.sol) |PASSED| |
-| The `totalSupply` is a constant | [`totalSupply_constant`](echidna/TBTokenERC20.sol#L166-L168) | [`TBTokenERC20`](echidna/TBTokenERC20.sol) |PASSED| |
-| The balances are consistent with the `totalSupply` | [`totalSupply_balances_consistency`](echidna/TBTokenERC20.sol#L63-L65) and [`balance_less_than_totalSupply`](echidna/TBTokenERC20.sol#L55-L57) | [`TBTokenERC20`](echidna/TBTokenERC20.sol) |PASSED| |
-
-# Code verification with Manticore
-
-The following properties have equivalent Echidna property, but Manticore allows to either prove the absence of bugs, or look for an upper bound.
-
-To execute the script, run `python3 ./manticore/script_name.py`.
-
-| Description | Script | Contract | Status |
-| :--- | :---: | :---: | :---: |
-| An attacker cannot generate free pool tokens with `joinPool`. | [`TBPoolJoinPool.py`](manticore/TBPoolJoinPool.py)| [`TBPoolJoinPool`](manticore/contracts/TBPoolJoinPool.sol) | **FAILED** ([#204](https://github.com/balancer-labs/balancer-core/issues/204)) |
-| Calling `joinPool-exitPool` does not lead to free pool tokens (no fee). | [`TBPoolJoinExitNoFee.py`](manticore/TBPoolJoinExitNoFee.py) | [`TBPoolJoinExitPoolNoFee`](manticore/contracts/TBPoolJoinExitPoolNoFee.sol) |**FAILED** ([#205](https://github.com/balancer-labs/balancer-core/issues/205)) |
-| Calling `joinPool-exitPool` does not lead to free pool tokens (with fee).| [`TBPoolJoinExit.py`](manticore/TBPoolJoinExit.py) | [`TBPoolJoinExit`](manticore/contracts/TBPoolJoinExitPool.sol) |**FAILED** ([#205](https://github.com/balancer-labs/balancer-core/issues/205))|
diff --git a/Trail of Bits Full Audit.pdf b/Trail of Bits Full Audit.pdf
deleted file mode 100644
index b6fcff1b..00000000
Binary files a/Trail of Bits Full Audit.pdf and /dev/null differ
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 00000000..422b1944
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1 @@
+module.exports = { extends: ['@commitlint/config-conventional'] };
diff --git a/contracts/BColor.sol b/contracts/BColor.sol
deleted file mode 100644
index ba441b17..00000000
--- a/contracts/BColor.sol
+++ /dev/null
@@ -1,28 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-contract BColor {
- function getColor()
- external view
- returns (bytes32);
-}
-
-contract BBronze is BColor {
- function getColor()
- external view
- returns (bytes32) {
- return bytes32("BRONZE");
- }
-}
diff --git a/contracts/BConst.sol b/contracts/BConst.sol
deleted file mode 100644
index 6373a28c..00000000
--- a/contracts/BConst.sol
+++ /dev/null
@@ -1,41 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-import "./BColor.sol";
-
-contract BConst is BBronze {
- uint public constant BONE = 10**18;
-
- uint public constant MIN_BOUND_TOKENS = 2;
- uint public constant MAX_BOUND_TOKENS = 8;
-
- uint public constant MIN_FEE = BONE / 10**6;
- uint public constant MAX_FEE = BONE / 10;
- uint public constant EXIT_FEE = 0;
-
- uint public constant MIN_WEIGHT = BONE;
- uint public constant MAX_WEIGHT = BONE * 50;
- uint public constant MAX_TOTAL_WEIGHT = BONE * 50;
- uint public constant MIN_BALANCE = BONE / 10**12;
-
- uint public constant INIT_POOL_SUPPLY = BONE * 100;
-
- uint public constant MIN_BPOW_BASE = 1 wei;
- uint public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei;
- uint public constant BPOW_PRECISION = BONE / 10**10;
-
- uint public constant MAX_IN_RATIO = BONE / 2;
- uint public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei;
-}
diff --git a/contracts/BFactory.sol b/contracts/BFactory.sol
deleted file mode 100644
index 142820ca..00000000
--- a/contracts/BFactory.sol
+++ /dev/null
@@ -1,79 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is disstributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-// Builds new BPools, logging their addresses and providing `isBPool(address) -> (bool)`
-
-import "./BPool.sol";
-
-contract BFactory is BBronze {
- event LOG_NEW_POOL(
- address indexed caller,
- address indexed pool
- );
-
- event LOG_BLABS(
- address indexed caller,
- address indexed blabs
- );
-
- mapping(address=>bool) private _isBPool;
-
- function isBPool(address b)
- external view returns (bool)
- {
- return _isBPool[b];
- }
-
- function newBPool()
- external
- returns (BPool)
- {
- BPool bpool = new BPool();
- _isBPool[address(bpool)] = true;
- emit LOG_NEW_POOL(msg.sender, address(bpool));
- bpool.setController(msg.sender);
- return bpool;
- }
-
- address private _blabs;
-
- constructor() public {
- _blabs = msg.sender;
- }
-
- function getBLabs()
- external view
- returns (address)
- {
- return _blabs;
- }
-
- function setBLabs(address b)
- external
- {
- require(msg.sender == _blabs, "ERR_NOT_BLABS");
- emit LOG_BLABS(msg.sender, b);
- _blabs = b;
- }
-
- function collect(BPool pool)
- external
- {
- require(msg.sender == _blabs, "ERR_NOT_BLABS");
- uint collected = IERC20(pool).balanceOf(address(this));
- bool xfer = pool.transfer(_blabs, collected);
- require(xfer, "ERR_ERC20_FAILED");
- }
-}
diff --git a/contracts/BMath.sol b/contracts/BMath.sol
deleted file mode 100644
index ed2e39b6..00000000
--- a/contracts/BMath.sol
+++ /dev/null
@@ -1,271 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-import "./BNum.sol";
-
-contract BMath is BBronze, BConst, BNum {
- /**********************************************************************************************
- // calcSpotPrice //
- // sP = spotPrice //
- // bI = tokenBalanceIn ( bI / wI ) 1 //
- // bO = tokenBalanceOut sP = ----------- * ---------- //
- // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) //
- // wO = tokenWeightOut //
- // sF = swapFee //
- **********************************************************************************************/
- function calcSpotPrice(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint swapFee
- )
- public pure
- returns (uint spotPrice)
- {
- uint numer = bdiv(tokenBalanceIn, tokenWeightIn);
- uint denom = bdiv(tokenBalanceOut, tokenWeightOut);
- uint ratio = bdiv(numer, denom);
- uint scale = bdiv(BONE, bsub(BONE, swapFee));
- return (spotPrice = bmul(ratio, scale));
- }
-
- /**********************************************************************************************
- // calcOutGivenIn //
- // aO = tokenAmountOut //
- // bO = tokenBalanceOut //
- // bI = tokenBalanceIn / / bI \ (wI / wO) \ //
- // aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ | //
- // wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / / //
- // wO = tokenWeightOut //
- // sF = swapFee //
- **********************************************************************************************/
- function calcOutGivenIn(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint tokenAmountIn,
- uint swapFee
- )
- public pure
- returns (uint tokenAmountOut)
- {
- uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
- uint adjustedIn = bsub(BONE, swapFee);
- adjustedIn = bmul(tokenAmountIn, adjustedIn);
- uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
- uint foo = bpow(y, weightRatio);
- uint bar = bsub(BONE, foo);
- tokenAmountOut = bmul(tokenBalanceOut, bar);
- return tokenAmountOut;
- }
-
- /**********************************************************************************************
- // calcInGivenOut //
- // aI = tokenAmountIn //
- // bO = tokenBalanceOut / / bO \ (wO / wI) \ //
- // bI = tokenBalanceIn bI * | | ------------ | ^ - 1 | //
- // aO = tokenAmountOut aI = \ \ ( bO - aO ) / / //
- // wI = tokenWeightIn -------------------------------------------- //
- // wO = tokenWeightOut ( 1 - sF ) //
- // sF = swapFee //
- **********************************************************************************************/
- function calcInGivenOut(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint tokenAmountOut,
- uint swapFee
- )
- public pure
- returns (uint tokenAmountIn)
- {
- uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
- uint diff = bsub(tokenBalanceOut, tokenAmountOut);
- uint y = bdiv(tokenBalanceOut, diff);
- uint foo = bpow(y, weightRatio);
- foo = bsub(foo, BONE);
- tokenAmountIn = bsub(BONE, swapFee);
- tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn);
- return tokenAmountIn;
- }
-
- /**********************************************************************************************
- // calcPoolOutGivenSingleIn //
- // pAo = poolAmountOut / \ //
- // tAi = tokenAmountIn /// / // wI \ \\ \ wI \ //
- // wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \ //
- // tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS //
- // tBi = tokenBalanceIn \\ ------------------------------------- / / //
- // pS = poolSupply \\ tBi / / //
- // sF = swapFee \ / //
- **********************************************************************************************/
- function calcPoolOutGivenSingleIn(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint poolSupply,
- uint totalWeight,
- uint tokenAmountIn,
- uint swapFee
- )
- public pure
- returns (uint poolAmountOut)
- {
- // Charge the trading fee for the proportion of tokenAi
- /// which is implicitly traded to the other pool tokens.
- // That proportion is (1- weightTokenIn)
- // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
- uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
- uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
- uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz));
-
- uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee);
- uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn);
-
- // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
- uint poolRatio = bpow(tokenInRatio, normalizedWeight);
- uint newPoolSupply = bmul(poolRatio, poolSupply);
- poolAmountOut = bsub(newPoolSupply, poolSupply);
- return poolAmountOut;
- }
-
- /**********************************************************************************************
- // calcSingleInGivenPoolOut //
- // tAi = tokenAmountIn //(pS + pAo)\ / 1 \\ //
- // pS = poolSupply || --------- | ^ | --------- || * bI - bI //
- // pAo = poolAmountOut \\ pS / \(wI / tW)// //
- // bI = balanceIn tAi = -------------------------------------------- //
- // wI = weightIn / wI \ //
- // tW = totalWeight | 1 - ---- | * sF //
- // sF = swapFee \ tW / //
- **********************************************************************************************/
- function calcSingleInGivenPoolOut(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint poolSupply,
- uint totalWeight,
- uint poolAmountOut,
- uint swapFee
- )
- public pure
- returns (uint tokenAmountIn)
- {
- uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
- uint newPoolSupply = badd(poolSupply, poolAmountOut);
- uint poolRatio = bdiv(newPoolSupply, poolSupply);
-
- //uint newBalTi = poolRatio^(1/weightTi) * balTi;
- uint boo = bdiv(BONE, normalizedWeight);
- uint tokenInRatio = bpow(poolRatio, boo);
- uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn);
- uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn);
- // Do reverse order of fees charged in joinswap_ExternAmountIn, this way
- // ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ```
- //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ;
- uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
- tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar));
- return tokenAmountIn;
- }
-
- /**********************************************************************************************
- // calcSingleOutGivenPoolIn //
- // tAo = tokenAmountOut / / \\ //
- // bO = tokenBalanceOut / // pS - (pAi * (1 - eF)) \ / 1 \ \\ //
- // pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || //
- // ps = poolSupply \ \\ pS / \(wO / tW)/ // //
- // wI = tokenWeightIn tAo = \ \ // //
- // tW = totalWeight / / wO \ \ //
- // sF = swapFee * | 1 - | 1 - ---- | * sF | //
- // eF = exitFee \ \ tW / / //
- **********************************************************************************************/
- function calcSingleOutGivenPoolIn(
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint poolSupply,
- uint totalWeight,
- uint poolAmountIn,
- uint swapFee
- )
- public pure
- returns (uint tokenAmountOut)
- {
- uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
- // charge exit fee on the pool token side
- // pAiAfterExitFee = pAi*(1-exitFee)
- uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE));
- uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
- uint poolRatio = bdiv(newPoolSupply, poolSupply);
-
- // newBalTo = poolRatio^(1/weightTo) * balTo;
- uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight));
- uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut);
-
- uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut);
-
- // charge swap fee on the output token side
- //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
- uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
- tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz));
- return tokenAmountOut;
- }
-
- /**********************************************************************************************
- // calcPoolInGivenSingleOut //
- // pAi = poolAmountIn // / tAo \\ / wO \ \ //
- // bO = tokenBalanceOut // | bO - -------------------------- |\ | ---- | \ //
- // tAo = tokenAmountOut pS - || \ 1 - ((1 - (tO / tW)) * sF)/ | ^ \ tW / * pS | //
- // ps = poolSupply \\ -----------------------------------/ / //
- // wO = tokenWeightOut pAi = \\ bO / / //
- // tW = totalWeight ------------------------------------------------------------- //
- // sF = swapFee ( 1 - eF ) //
- // eF = exitFee //
- **********************************************************************************************/
- function calcPoolInGivenSingleOut(
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint poolSupply,
- uint totalWeight,
- uint tokenAmountOut,
- uint swapFee
- )
- public pure
- returns (uint poolAmountIn)
- {
-
- // charge swap fee on the output token side
- uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
- //uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ;
- uint zoo = bsub(BONE, normalizedWeight);
- uint zar = bmul(zoo, swapFee);
- uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar));
-
- uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee);
- uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut);
-
- //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply;
- uint poolRatio = bpow(tokenOutRatio, normalizedWeight);
- uint newPoolSupply = bmul(poolRatio, poolSupply);
- uint poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply);
-
- // charge exit fee on the pool token side
- // pAi = pAiAfterExitFee/(1-exitFee)
- poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE));
- return poolAmountIn;
- }
-
-
-}
diff --git a/contracts/BNum.sol b/contracts/BNum.sol
deleted file mode 100644
index b21a21b7..00000000
--- a/contracts/BNum.sol
+++ /dev/null
@@ -1,163 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-import "./BConst.sol";
-
-contract BNum is BConst {
-
- function btoi(uint a)
- internal pure
- returns (uint)
- {
- return a / BONE;
- }
-
- function bfloor(uint a)
- internal pure
- returns (uint)
- {
- return btoi(a) * BONE;
- }
-
- function badd(uint a, uint b)
- internal pure
- returns (uint)
- {
- uint c = a + b;
- require(c >= a, "ERR_ADD_OVERFLOW");
- return c;
- }
-
- function bsub(uint a, uint b)
- internal pure
- returns (uint)
- {
- (uint c, bool flag) = bsubSign(a, b);
- require(!flag, "ERR_SUB_UNDERFLOW");
- return c;
- }
-
- function bsubSign(uint a, uint b)
- internal pure
- returns (uint, bool)
- {
- if (a >= b) {
- return (a - b, false);
- } else {
- return (b - a, true);
- }
- }
-
- function bmul(uint a, uint b)
- internal pure
- returns (uint)
- {
- uint c0 = a * b;
- require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
- uint c1 = c0 + (BONE / 2);
- require(c1 >= c0, "ERR_MUL_OVERFLOW");
- uint c2 = c1 / BONE;
- return c2;
- }
-
- function bdiv(uint a, uint b)
- internal pure
- returns (uint)
- {
- require(b != 0, "ERR_DIV_ZERO");
- uint c0 = a * BONE;
- require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow
- uint c1 = c0 + (b / 2);
- require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require
- uint c2 = c1 / b;
- return c2;
- }
-
- // DSMath.wpow
- function bpowi(uint a, uint n)
- internal pure
- returns (uint)
- {
- uint z = n % 2 != 0 ? a : BONE;
-
- for (n /= 2; n != 0; n /= 2) {
- a = bmul(a, a);
-
- if (n % 2 != 0) {
- z = bmul(z, a);
- }
- }
- return z;
- }
-
- // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
- // Use `bpowi` for `b^e` and `bpowK` for k iterations
- // of approximation of b^0.w
- function bpow(uint base, uint exp)
- internal pure
- returns (uint)
- {
- require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW");
- require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH");
-
- uint whole = bfloor(exp);
- uint remain = bsub(exp, whole);
-
- uint wholePow = bpowi(base, btoi(whole));
-
- if (remain == 0) {
- return wholePow;
- }
-
- uint partialResult = bpowApprox(base, remain, BPOW_PRECISION);
- return bmul(wholePow, partialResult);
- }
-
- function bpowApprox(uint base, uint exp, uint precision)
- internal pure
- returns (uint)
- {
- // term 0:
- uint a = exp;
- (uint x, bool xneg) = bsubSign(base, BONE);
- uint term = BONE;
- uint sum = term;
- bool negative = false;
-
-
- // term(k) = numer / denom
- // = (product(a - i - 1, i=1-->k) * x^k) / (k!)
- // each iteration, multiply previous term by (a-(k-1)) * x / k
- // continue until term is less than precision
- for (uint i = 1; term >= precision; i++) {
- uint bigK = i * BONE;
- (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
- term = bmul(term, bmul(c, x));
- term = bdiv(term, bigK);
- if (term == 0) break;
-
- if (xneg) negative = !negative;
- if (cneg) negative = !negative;
- if (negative) {
- sum = bsub(sum, term);
- } else {
- sum = badd(sum, term);
- }
- }
-
- return sum;
- }
-
-}
diff --git a/contracts/BPool.sol b/contracts/BPool.sol
deleted file mode 100644
index b1d2d734..00000000
--- a/contracts/BPool.sol
+++ /dev/null
@@ -1,739 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-import "./BToken.sol";
-import "./BMath.sol";
-
-contract BPool is BBronze, BToken, BMath {
-
- struct Record {
- bool bound; // is token bound to pool
- uint index; // private
- uint denorm; // denormalized weight
- uint balance;
- }
-
- event LOG_SWAP(
- address indexed caller,
- address indexed tokenIn,
- address indexed tokenOut,
- uint256 tokenAmountIn,
- uint256 tokenAmountOut
- );
-
- event LOG_JOIN(
- address indexed caller,
- address indexed tokenIn,
- uint256 tokenAmountIn
- );
-
- event LOG_EXIT(
- address indexed caller,
- address indexed tokenOut,
- uint256 tokenAmountOut
- );
-
- event LOG_CALL(
- bytes4 indexed sig,
- address indexed caller,
- bytes data
- ) anonymous;
-
- modifier _logs_() {
- emit LOG_CALL(msg.sig, msg.sender, msg.data);
- _;
- }
-
- modifier _lock_() {
- require(!_mutex, "ERR_REENTRY");
- _mutex = true;
- _;
- _mutex = false;
- }
-
- modifier _viewlock_() {
- require(!_mutex, "ERR_REENTRY");
- _;
- }
-
- bool private _mutex;
-
- address private _factory; // BFactory address to push token exitFee to
- address private _controller; // has CONTROL role
- bool private _publicSwap; // true if PUBLIC can call SWAP functions
-
- // `setSwapFee` and `finalize` require CONTROL
- // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
- uint private _swapFee;
- bool private _finalized;
-
- address[] private _tokens;
- mapping(address=>Record) private _records;
- uint private _totalWeight;
-
- constructor() public {
- _controller = msg.sender;
- _factory = msg.sender;
- _swapFee = MIN_FEE;
- _publicSwap = false;
- _finalized = false;
- }
-
- function isPublicSwap()
- external view
- returns (bool)
- {
- return _publicSwap;
- }
-
- function isFinalized()
- external view
- returns (bool)
- {
- return _finalized;
- }
-
- function isBound(address t)
- external view
- returns (bool)
- {
- return _records[t].bound;
- }
-
- function getNumTokens()
- external view
- returns (uint)
- {
- return _tokens.length;
- }
-
- function getCurrentTokens()
- external view _viewlock_
- returns (address[] memory tokens)
- {
- return _tokens;
- }
-
- function getFinalTokens()
- external view
- _viewlock_
- returns (address[] memory tokens)
- {
- require(_finalized, "ERR_NOT_FINALIZED");
- return _tokens;
- }
-
- function getDenormalizedWeight(address token)
- external view
- _viewlock_
- returns (uint)
- {
-
- require(_records[token].bound, "ERR_NOT_BOUND");
- return _records[token].denorm;
- }
-
- function getTotalDenormalizedWeight()
- external view
- _viewlock_
- returns (uint)
- {
- return _totalWeight;
- }
-
- function getNormalizedWeight(address token)
- external view
- _viewlock_
- returns (uint)
- {
-
- require(_records[token].bound, "ERR_NOT_BOUND");
- uint denorm = _records[token].denorm;
- return bdiv(denorm, _totalWeight);
- }
-
- function getBalance(address token)
- external view
- _viewlock_
- returns (uint)
- {
-
- require(_records[token].bound, "ERR_NOT_BOUND");
- return _records[token].balance;
- }
-
- function getSwapFee()
- external view
- _viewlock_
- returns (uint)
- {
- return _swapFee;
- }
-
- function getController()
- external view
- _viewlock_
- returns (address)
- {
- return _controller;
- }
-
- function setSwapFee(uint swapFee)
- external
- _logs_
- _lock_
- {
- require(!_finalized, "ERR_IS_FINALIZED");
- require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
- require(swapFee >= MIN_FEE, "ERR_MIN_FEE");
- require(swapFee <= MAX_FEE, "ERR_MAX_FEE");
- _swapFee = swapFee;
- }
-
- function setController(address manager)
- external
- _logs_
- _lock_
- {
- require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
- _controller = manager;
- }
-
- function setPublicSwap(bool public_)
- external
- _logs_
- _lock_
- {
- require(!_finalized, "ERR_IS_FINALIZED");
- require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
- _publicSwap = public_;
- }
-
- function finalize()
- external
- _logs_
- _lock_
- {
- require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
- require(!_finalized, "ERR_IS_FINALIZED");
- require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS");
-
- _finalized = true;
- _publicSwap = true;
-
- _mintPoolShare(INIT_POOL_SUPPLY);
- _pushPoolShare(msg.sender, INIT_POOL_SUPPLY);
- }
-
-
- function bind(address token, uint balance, uint denorm)
- external
- _logs_
- // _lock_ Bind does not lock because it jumps to `rebind`, which does
- {
- require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
- require(!_records[token].bound, "ERR_IS_BOUND");
- require(!_finalized, "ERR_IS_FINALIZED");
-
- require(_tokens.length < MAX_BOUND_TOKENS, "ERR_MAX_TOKENS");
-
- _records[token] = Record({
- bound: true,
- index: _tokens.length,
- denorm: 0, // balance and denorm will be validated
- balance: 0 // and set by `rebind`
- });
- _tokens.push(token);
- rebind(token, balance, denorm);
- }
-
- function rebind(address token, uint balance, uint denorm)
- public
- _logs_
- _lock_
- {
-
- require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
- require(_records[token].bound, "ERR_NOT_BOUND");
- require(!_finalized, "ERR_IS_FINALIZED");
-
- require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT");
- require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT");
- require(balance >= MIN_BALANCE, "ERR_MIN_BALANCE");
-
- // Adjust the denorm and totalWeight
- uint oldWeight = _records[token].denorm;
- if (denorm > oldWeight) {
- _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight));
- require(_totalWeight <= MAX_TOTAL_WEIGHT, "ERR_MAX_TOTAL_WEIGHT");
- } else if (denorm < oldWeight) {
- _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm));
- }
- _records[token].denorm = denorm;
-
- // Adjust the balance record and actual token balance
- uint oldBalance = _records[token].balance;
- _records[token].balance = balance;
- if (balance > oldBalance) {
- _pullUnderlying(token, msg.sender, bsub(balance, oldBalance));
- } else if (balance < oldBalance) {
- // In this case liquidity is being withdrawn, so charge EXIT_FEE
- uint tokenBalanceWithdrawn = bsub(oldBalance, balance);
- uint tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE);
- _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee));
- _pushUnderlying(token, _factory, tokenExitFee);
- }
- }
-
- function unbind(address token)
- external
- _logs_
- _lock_
- {
-
- require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
- require(_records[token].bound, "ERR_NOT_BOUND");
- require(!_finalized, "ERR_IS_FINALIZED");
-
- uint tokenBalance = _records[token].balance;
- uint tokenExitFee = bmul(tokenBalance, EXIT_FEE);
-
- _totalWeight = bsub(_totalWeight, _records[token].denorm);
-
- // Swap the token-to-unbind with the last token,
- // then delete the last token
- uint index = _records[token].index;
- uint last = _tokens.length - 1;
- _tokens[index] = _tokens[last];
- _records[_tokens[index]].index = index;
- _tokens.pop();
- _records[token] = Record({
- bound: false,
- index: 0,
- denorm: 0,
- balance: 0
- });
-
- _pushUnderlying(token, msg.sender, bsub(tokenBalance, tokenExitFee));
- _pushUnderlying(token, _factory, tokenExitFee);
- }
-
- // Absorb any tokens that have been sent to this contract into the pool
- function gulp(address token)
- external
- _logs_
- _lock_
- {
- require(_records[token].bound, "ERR_NOT_BOUND");
- _records[token].balance = IERC20(token).balanceOf(address(this));
- }
-
- function getSpotPrice(address tokenIn, address tokenOut)
- external view
- _viewlock_
- returns (uint spotPrice)
- {
- require(_records[tokenIn].bound, "ERR_NOT_BOUND");
- require(_records[tokenOut].bound, "ERR_NOT_BOUND");
- Record storage inRecord = _records[tokenIn];
- Record storage outRecord = _records[tokenOut];
- return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
- }
-
- function getSpotPriceSansFee(address tokenIn, address tokenOut)
- external view
- _viewlock_
- returns (uint spotPrice)
- {
- require(_records[tokenIn].bound, "ERR_NOT_BOUND");
- require(_records[tokenOut].bound, "ERR_NOT_BOUND");
- Record storage inRecord = _records[tokenIn];
- Record storage outRecord = _records[tokenOut];
- return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0);
- }
-
- function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn)
- external
- _logs_
- _lock_
- {
- require(_finalized, "ERR_NOT_FINALIZED");
-
- uint poolTotal = totalSupply();
- uint ratio = bdiv(poolAmountOut, poolTotal);
- require(ratio != 0, "ERR_MATH_APPROX");
-
- for (uint i = 0; i < _tokens.length; i++) {
- address t = _tokens[i];
- uint bal = _records[t].balance;
- uint tokenAmountIn = bmul(ratio, bal);
- require(tokenAmountIn != 0, "ERR_MATH_APPROX");
- require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN");
- _records[t].balance = badd(_records[t].balance, tokenAmountIn);
- emit LOG_JOIN(msg.sender, t, tokenAmountIn);
- _pullUnderlying(t, msg.sender, tokenAmountIn);
- }
- _mintPoolShare(poolAmountOut);
- _pushPoolShare(msg.sender, poolAmountOut);
- }
-
- function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut)
- external
- _logs_
- _lock_
- {
- require(_finalized, "ERR_NOT_FINALIZED");
-
- uint poolTotal = totalSupply();
- uint exitFee = bmul(poolAmountIn, EXIT_FEE);
- uint pAiAfterExitFee = bsub(poolAmountIn, exitFee);
- uint ratio = bdiv(pAiAfterExitFee, poolTotal);
- require(ratio != 0, "ERR_MATH_APPROX");
-
- _pullPoolShare(msg.sender, poolAmountIn);
- _pushPoolShare(_factory, exitFee);
- _burnPoolShare(pAiAfterExitFee);
-
- for (uint i = 0; i < _tokens.length; i++) {
- address t = _tokens[i];
- uint bal = _records[t].balance;
- uint tokenAmountOut = bmul(ratio, bal);
- require(tokenAmountOut != 0, "ERR_MATH_APPROX");
- require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT");
- _records[t].balance = bsub(_records[t].balance, tokenAmountOut);
- emit LOG_EXIT(msg.sender, t, tokenAmountOut);
- _pushUnderlying(t, msg.sender, tokenAmountOut);
- }
-
- }
-
-
- function swapExactAmountIn(
- address tokenIn,
- uint tokenAmountIn,
- address tokenOut,
- uint minAmountOut,
- uint maxPrice
- )
- external
- _logs_
- _lock_
- returns (uint tokenAmountOut, uint spotPriceAfter)
- {
-
- require(_records[tokenIn].bound, "ERR_NOT_BOUND");
- require(_records[tokenOut].bound, "ERR_NOT_BOUND");
- require(_publicSwap, "ERR_SWAP_NOT_PUBLIC");
-
- Record storage inRecord = _records[address(tokenIn)];
- Record storage outRecord = _records[address(tokenOut)];
-
- require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");
-
- uint spotPriceBefore = calcSpotPrice(
- inRecord.balance,
- inRecord.denorm,
- outRecord.balance,
- outRecord.denorm,
- _swapFee
- );
- require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");
-
- tokenAmountOut = calcOutGivenIn(
- inRecord.balance,
- inRecord.denorm,
- outRecord.balance,
- outRecord.denorm,
- tokenAmountIn,
- _swapFee
- );
- require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");
-
- inRecord.balance = badd(inRecord.balance, tokenAmountIn);
- outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
-
- spotPriceAfter = calcSpotPrice(
- inRecord.balance,
- inRecord.denorm,
- outRecord.balance,
- outRecord.denorm,
- _swapFee
- );
- require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
- require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");
- require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX");
-
- emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);
-
- _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
- _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
-
- return (tokenAmountOut, spotPriceAfter);
- }
-
- function swapExactAmountOut(
- address tokenIn,
- uint maxAmountIn,
- address tokenOut,
- uint tokenAmountOut,
- uint maxPrice
- )
- external
- _logs_
- _lock_
- returns (uint tokenAmountIn, uint spotPriceAfter)
- {
- require(_records[tokenIn].bound, "ERR_NOT_BOUND");
- require(_records[tokenOut].bound, "ERR_NOT_BOUND");
- require(_publicSwap, "ERR_SWAP_NOT_PUBLIC");
-
- Record storage inRecord = _records[address(tokenIn)];
- Record storage outRecord = _records[address(tokenOut)];
-
- require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");
-
- uint spotPriceBefore = calcSpotPrice(
- inRecord.balance,
- inRecord.denorm,
- outRecord.balance,
- outRecord.denorm,
- _swapFee
- );
- require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");
-
- tokenAmountIn = calcInGivenOut(
- inRecord.balance,
- inRecord.denorm,
- outRecord.balance,
- outRecord.denorm,
- tokenAmountOut,
- _swapFee
- );
- require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN");
-
- inRecord.balance = badd(inRecord.balance, tokenAmountIn);
- outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
-
- spotPriceAfter = calcSpotPrice(
- inRecord.balance,
- inRecord.denorm,
- outRecord.balance,
- outRecord.denorm,
- _swapFee
- );
- require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
- require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");
- require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX");
-
- emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);
-
- _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
- _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
-
- return (tokenAmountIn, spotPriceAfter);
- }
-
-
- function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut)
- external
- _logs_
- _lock_
- returns (uint poolAmountOut)
-
- {
- require(_finalized, "ERR_NOT_FINALIZED");
- require(_records[tokenIn].bound, "ERR_NOT_BOUND");
- require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");
-
- Record storage inRecord = _records[tokenIn];
-
- poolAmountOut = calcPoolOutGivenSingleIn(
- inRecord.balance,
- inRecord.denorm,
- _totalSupply,
- _totalWeight,
- tokenAmountIn,
- _swapFee
- );
-
- require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT");
-
- inRecord.balance = badd(inRecord.balance, tokenAmountIn);
-
- emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);
-
- _mintPoolShare(poolAmountOut);
- _pushPoolShare(msg.sender, poolAmountOut);
- _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
-
- return poolAmountOut;
- }
-
- function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn)
- external
- _logs_
- _lock_
- returns (uint tokenAmountIn)
- {
- require(_finalized, "ERR_NOT_FINALIZED");
- require(_records[tokenIn].bound, "ERR_NOT_BOUND");
-
- Record storage inRecord = _records[tokenIn];
-
- tokenAmountIn = calcSingleInGivenPoolOut(
- inRecord.balance,
- inRecord.denorm,
- _totalSupply,
- _totalWeight,
- poolAmountOut,
- _swapFee
- );
-
- require(tokenAmountIn != 0, "ERR_MATH_APPROX");
- require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN");
-
- require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");
-
- inRecord.balance = badd(inRecord.balance, tokenAmountIn);
-
- emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);
-
- _mintPoolShare(poolAmountOut);
- _pushPoolShare(msg.sender, poolAmountOut);
- _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
-
- return tokenAmountIn;
- }
-
- function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut)
- external
- _logs_
- _lock_
- returns (uint tokenAmountOut)
- {
- require(_finalized, "ERR_NOT_FINALIZED");
- require(_records[tokenOut].bound, "ERR_NOT_BOUND");
-
- Record storage outRecord = _records[tokenOut];
-
- tokenAmountOut = calcSingleOutGivenPoolIn(
- outRecord.balance,
- outRecord.denorm,
- _totalSupply,
- _totalWeight,
- poolAmountIn,
- _swapFee
- );
-
- require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");
-
- require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");
-
- outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
-
- uint exitFee = bmul(poolAmountIn, EXIT_FEE);
-
- emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);
-
- _pullPoolShare(msg.sender, poolAmountIn);
- _burnPoolShare(bsub(poolAmountIn, exitFee));
- _pushPoolShare(_factory, exitFee);
- _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
-
- return tokenAmountOut;
- }
-
- function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn)
- external
- _logs_
- _lock_
- returns (uint poolAmountIn)
- {
- require(_finalized, "ERR_NOT_FINALIZED");
- require(_records[tokenOut].bound, "ERR_NOT_BOUND");
- require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");
-
- Record storage outRecord = _records[tokenOut];
-
- poolAmountIn = calcPoolInGivenSingleOut(
- outRecord.balance,
- outRecord.denorm,
- _totalSupply,
- _totalWeight,
- tokenAmountOut,
- _swapFee
- );
-
- require(poolAmountIn != 0, "ERR_MATH_APPROX");
- require(poolAmountIn <= maxPoolAmountIn, "ERR_LIMIT_IN");
-
- outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
-
- uint exitFee = bmul(poolAmountIn, EXIT_FEE);
-
- emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);
-
- _pullPoolShare(msg.sender, poolAmountIn);
- _burnPoolShare(bsub(poolAmountIn, exitFee));
- _pushPoolShare(_factory, exitFee);
- _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
-
- return poolAmountIn;
- }
-
-
- // ==
- // 'Underlying' token-manipulation functions make external calls but are NOT locked
- // You must `_lock_` or otherwise ensure reentry-safety
-
- function _pullUnderlying(address erc20, address from, uint amount)
- internal
- {
- bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
- require(xfer, "ERR_ERC20_FALSE");
- }
-
- function _pushUnderlying(address erc20, address to, uint amount)
- internal
- {
- bool xfer = IERC20(erc20).transfer(to, amount);
- require(xfer, "ERR_ERC20_FALSE");
- }
-
- function _pullPoolShare(address from, uint amount)
- internal
- {
- _pull(from, amount);
- }
-
- function _pushPoolShare(address to, uint amount)
- internal
- {
- _push(to, amount);
- }
-
- function _mintPoolShare(uint amount)
- internal
- {
- _mint(amount);
- }
-
- function _burnPoolShare(uint amount)
- internal
- {
- _burn(amount);
- }
-
-}
diff --git a/contracts/BToken.sol b/contracts/BToken.sol
deleted file mode 100644
index ad5655dd..00000000
--- a/contracts/BToken.sol
+++ /dev/null
@@ -1,140 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-import "./BNum.sol";
-
-// Highly opinionated token implementation
-
-interface IERC20 {
- event Approval(address indexed src, address indexed dst, uint amt);
- event Transfer(address indexed src, address indexed dst, uint amt);
-
- function totalSupply() external view returns (uint);
- function balanceOf(address whom) external view returns (uint);
- function allowance(address src, address dst) external view returns (uint);
-
- function approve(address dst, uint amt) external returns (bool);
- function transfer(address dst, uint amt) external returns (bool);
- function transferFrom(
- address src, address dst, uint amt
- ) external returns (bool);
-}
-
-contract BTokenBase is BNum {
-
- mapping(address => uint) internal _balance;
- mapping(address => mapping(address=>uint)) internal _allowance;
- uint internal _totalSupply;
-
- event Approval(address indexed src, address indexed dst, uint amt);
- event Transfer(address indexed src, address indexed dst, uint amt);
-
- function _mint(uint amt) internal {
- _balance[address(this)] = badd(_balance[address(this)], amt);
- _totalSupply = badd(_totalSupply, amt);
- emit Transfer(address(0), address(this), amt);
- }
-
- function _burn(uint amt) internal {
- require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_BAL");
- _balance[address(this)] = bsub(_balance[address(this)], amt);
- _totalSupply = bsub(_totalSupply, amt);
- emit Transfer(address(this), address(0), amt);
- }
-
- function _move(address src, address dst, uint amt) internal {
- require(_balance[src] >= amt, "ERR_INSUFFICIENT_BAL");
- _balance[src] = bsub(_balance[src], amt);
- _balance[dst] = badd(_balance[dst], amt);
- emit Transfer(src, dst, amt);
- }
-
- function _push(address to, uint amt) internal {
- _move(address(this), to, amt);
- }
-
- function _pull(address from, uint amt) internal {
- _move(from, address(this), amt);
- }
-}
-
-contract BToken is BTokenBase, IERC20 {
-
- string private _name = "Balancer Pool Token";
- string private _symbol = "BPT";
- uint8 private _decimals = 18;
-
- function name() public view returns (string memory) {
- return _name;
- }
-
- function symbol() public view returns (string memory) {
- return _symbol;
- }
-
- function decimals() public view returns(uint8) {
- return _decimals;
- }
-
- function allowance(address src, address dst) external view returns (uint) {
- return _allowance[src][dst];
- }
-
- function balanceOf(address whom) external view returns (uint) {
- return _balance[whom];
- }
-
- function totalSupply() public view returns (uint) {
- return _totalSupply;
- }
-
- function approve(address dst, uint amt) external returns (bool) {
- _allowance[msg.sender][dst] = amt;
- emit Approval(msg.sender, dst, amt);
- return true;
- }
-
- function increaseApproval(address dst, uint amt) external returns (bool) {
- _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
- emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
- return true;
- }
-
- function decreaseApproval(address dst, uint amt) external returns (bool) {
- uint oldValue = _allowance[msg.sender][dst];
- if (amt > oldValue) {
- _allowance[msg.sender][dst] = 0;
- } else {
- _allowance[msg.sender][dst] = bsub(oldValue, amt);
- }
- emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
- return true;
- }
-
- function transfer(address dst, uint amt) external returns (bool) {
- _move(msg.sender, dst, amt);
- return true;
- }
-
- function transferFrom(address src, address dst, uint amt) external returns (bool) {
- require(msg.sender == src || amt <= _allowance[src][msg.sender], "ERR_BTOKEN_BAD_CALLER");
- _move(src, dst, amt);
- if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) {
- _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
- emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
- }
- return true;
- }
-}
diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol
deleted file mode 100644
index 62eb7eec..00000000
--- a/contracts/Migrations.sol
+++ /dev/null
@@ -1,23 +0,0 @@
-pragma solidity 0.5.12;
-
-contract Migrations {
- address public owner;
- uint public lastCompletedMigration;
-
- constructor() public {
- owner = msg.sender;
- }
-
- modifier restricted() {
- if (msg.sender == owner) _;
- }
-
- function setCompleted(uint completed) external restricted {
- lastCompletedMigration = completed;
- }
-
- function upgrade(address new_address) external restricted {
- Migrations upgraded = Migrations(new_address);
- upgraded.setCompleted(lastCompletedMigration);
- }
-}
diff --git a/contracts/test/TMath.sol b/contracts/test/TMath.sol
deleted file mode 100644
index 287cf3a2..00000000
--- a/contracts/test/TMath.sol
+++ /dev/null
@@ -1,62 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-import "../BMath.sol";
-import "../BNum.sol";
-
-// Contract to wrap internal functions for testing
-
-contract TMath is BMath {
-
- function calc_btoi(uint a) external pure returns (uint) {
- return btoi(a);
- }
-
- function calc_bfloor(uint a) external pure returns (uint) {
- return bfloor(a);
- }
-
- function calc_badd(uint a, uint b) external pure returns (uint) {
- return badd(a, b);
- }
-
- function calc_bsub(uint a, uint b) external pure returns (uint) {
- return bsub(a, b);
- }
-
- function calc_bsubSign(uint a, uint b) external pure returns (uint, bool) {
- return bsubSign(a, b);
- }
-
- function calc_bmul(uint a, uint b) external pure returns (uint) {
- return bmul(a, b);
- }
-
- function calc_bdiv(uint a, uint b) external pure returns (uint) {
- return bdiv(a, b);
- }
-
- function calc_bpowi(uint a, uint n) external pure returns (uint) {
- return bpowi(a, n);
- }
-
- function calc_bpow(uint base, uint exp) external pure returns (uint) {
- return bpow(base, exp);
- }
-
- function calc_bpowApprox(uint base, uint exp, uint precision) external pure returns (uint) {
- return bpowApprox(base, exp, precision);
- }
-}
diff --git a/contracts/test/TToken.sol b/contracts/test/TToken.sol
deleted file mode 100644
index 539485f9..00000000
--- a/contracts/test/TToken.sol
+++ /dev/null
@@ -1,136 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-pragma solidity 0.5.12;
-
-// Test Token
-
-contract TToken {
-
- string private _name;
- string private _symbol;
- uint8 private _decimals;
-
- address private _owner;
-
- uint internal _totalSupply;
-
- mapping(address => uint) private _balance;
- mapping(address => mapping(address=>uint)) private _allowance;
-
- modifier _onlyOwner_() {
- require(msg.sender == _owner, "ERR_NOT_OWNER");
- _;
- }
-
- event Approval(address indexed src, address indexed dst, uint amt);
- event Transfer(address indexed src, address indexed dst, uint amt);
-
- // Math
- function add(uint a, uint b) internal pure returns (uint c) {
- require((c = a + b) >= a);
- }
- function sub(uint a, uint b) internal pure returns (uint c) {
- require((c = a - b) <= a);
- }
-
- constructor(
- string memory name,
- string memory symbol,
- uint8 decimals
- ) public {
- _name = name;
- _symbol = symbol;
- _decimals = decimals;
- _owner = msg.sender;
- }
-
- function name() public view returns (string memory) {
- return _name;
- }
-
- function symbol() public view returns (string memory) {
- return _symbol;
- }
-
- function decimals() public view returns(uint8) {
- return _decimals;
- }
-
- function _move(address src, address dst, uint amt) internal {
- require(_balance[src] >= amt, "ERR_INSUFFICIENT_BAL");
- _balance[src] = sub(_balance[src], amt);
- _balance[dst] = add(_balance[dst], amt);
- emit Transfer(src, dst, amt);
- }
-
- function _push(address to, uint amt) internal {
- _move(address(this), to, amt);
- }
-
- function _pull(address from, uint amt) internal {
- _move(from, address(this), amt);
- }
-
- function _mint(address dst, uint amt) internal {
- _balance[dst] = add(_balance[dst], amt);
- _totalSupply = add(_totalSupply, amt);
- emit Transfer(address(0), dst, amt);
- }
-
- function allowance(address src, address dst) external view returns (uint) {
- return _allowance[src][dst];
- }
-
- function balanceOf(address whom) external view returns (uint) {
- return _balance[whom];
- }
-
- function totalSupply() public view returns (uint) {
- return _totalSupply;
- }
-
- function approve(address dst, uint amt) external returns (bool) {
- _allowance[msg.sender][dst] = amt;
- emit Approval(msg.sender, dst, amt);
- return true;
- }
-
- function mint(address dst, uint256 amt) public _onlyOwner_ returns (bool) {
- _mint(dst, amt);
- return true;
- }
-
- function burn(uint amt) public returns (bool) {
- require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_BAL");
- _balance[address(this)] = sub(_balance[address(this)], amt);
- _totalSupply = sub(_totalSupply, amt);
- emit Transfer(address(this), address(0), amt);
- return true;
- }
-
- function transfer(address dst, uint amt) external returns (bool) {
- _move(msg.sender, dst, amt);
- return true;
- }
-
- function transferFrom(address src, address dst, uint amt) external returns (bool) {
- require(msg.sender == src || amt <= _allowance[src][msg.sender], "ERR_BTOKEN_BAD_CALLER");
- _move(src, dst, amt);
- if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) {
- _allowance[src][msg.sender] = sub(_allowance[src][msg.sender], amt);
- emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
- }
- return true;
- }
-}
diff --git a/contracts/test/echidna/TBPoolJoinExitPool.sol b/contracts/test/echidna/TBPoolJoinExitPool.sol
deleted file mode 100644
index 625f122a..00000000
--- a/contracts/test/echidna/TBPoolJoinExitPool.sol
+++ /dev/null
@@ -1,66 +0,0 @@
-import "../../BNum.sol";
-
-pragma solidity 0.5.12;
-
-// This test is similar to TBPoolJoin but with an exit fee
-contract TBPoolJoinExit is BNum {
-
- bool public echidna_no_bug_found = true;
-
- // joinPool models the BPool.joinPool behavior for one token
- function joinPool(uint poolAmountOut, uint poolTotal, uint _records_t_balance)
- internal pure returns(uint)
- {
- uint ratio = bdiv(poolAmountOut, poolTotal);
- require(ratio != 0, "ERR_MATH_APPROX");
-
- uint bal = _records_t_balance;
- uint tokenAmountIn = bmul(ratio, bal);
-
- return tokenAmountIn;
- }
-
- // exitPool models the BPool.exitPool behavior for one token
- function exitPool(uint poolAmountIn, uint poolTotal, uint _records_t_balance)
- internal pure returns(uint)
- {
- uint exitFee = bmul(poolAmountIn, EXIT_FEE);
- uint pAiAfterExitFee = bsub(poolAmountIn, exitFee);
- uint ratio = bdiv(pAiAfterExitFee, poolTotal);
- require(ratio != 0, "ERR_MATH_APPROX");
-
- uint bal = _records_t_balance;
- uint tokenAmountOut = bmul(ratio, bal);
-
- return tokenAmountOut;
- }
-
-
- // This function model an attacker calling joinPool - exitPool and taking advantage of potential rounding
- // issues to generate free pool token
- function joinAndExitPool(uint poolAmountOut, uint poolAmountIn, uint poolTotal, uint _records_t_balance) public {
- uint tokenAmountIn = joinPool(poolAmountOut, poolTotal, _records_t_balance);
-
- // We constraint poolTotal and _records_t_balance
- // To have "realistic" values
- require(poolTotal <= 100 ether);
- require(poolTotal >= 1 ether);
- require(_records_t_balance <= 10 ether);
- require(_records_t_balance >= 10**6);
-
- poolTotal = badd(poolTotal, poolAmountOut);
- _records_t_balance = badd(_records_t_balance, tokenAmountIn);
-
- require(tokenAmountIn > 0); // prevent triggering the free token generation from joinPool
-
- require(poolTotal >= poolAmountIn);
- uint tokenAmountOut = exitPool(poolAmountIn, poolTotal, _records_t_balance);
- require(_records_t_balance >= tokenAmountOut);
-
- // We try to generate free pool share
- require(poolAmountOut > poolAmountIn);
- require(tokenAmountOut == tokenAmountIn);
- echidna_no_bug_found = false;
- }
-
-}
\ No newline at end of file
diff --git a/contracts/test/echidna/TBPoolJoinExitPoolNoFee.sol b/contracts/test/echidna/TBPoolJoinExitPoolNoFee.sol
deleted file mode 100644
index 5b311147..00000000
--- a/contracts/test/echidna/TBPoolJoinExitPoolNoFee.sol
+++ /dev/null
@@ -1,66 +0,0 @@
-import "../../BNum.sol";
-
-pragma solidity 0.5.12;
-
-// This test is similar to TBPoolJoinExit but with no exit fee
-contract TBPoolJoinExitNoFee is BNum {
-
- bool public echidna_no_bug_found = true;
-
- // joinPool models the BPool.joinPool behavior for one token
- function joinPool(uint poolAmountOut, uint poolTotal, uint _records_t_balance)
- internal pure returns(uint)
- {
- uint ratio = bdiv(poolAmountOut, poolTotal);
- require(ratio != 0, "ERR_MATH_APPROX");
-
- uint bal = _records_t_balance;
- uint tokenAmountIn = bmul(ratio, bal);
-
- return tokenAmountIn;
- }
-
- // exitPool models the BPool.exitPool behavior for one token where no fee is applied
- function exitPoolNoFee(uint poolAmountIn, uint poolTotal, uint _records_t_balance)
- internal pure returns(uint)
- {
- uint ratio = bdiv(poolAmountIn, poolTotal);
- require(ratio != 0, "ERR_MATH_APPROX");
-
- uint bal = _records_t_balance;
- uint tokenAmountOut = bmul(ratio, bal);
-
- return tokenAmountOut;
- }
-
- // This function model an attacker calling joinPool - exitPool and taking advantage of potential rounding
- // issues to generate free pool token
- function joinAndExitNoFeePool(uint poolAmountOut, uint poolAmountIn, uint poolTotal, uint _records_t_balance)
- public
- {
- uint tokenAmountIn = joinPool(poolAmountOut, poolTotal, _records_t_balance);
-
- // We constraint poolTotal and _records_t_balance
- // To have "realistic" values
- require(poolTotal <= 100 ether);
- require(poolTotal >= 1 ether);
- require(_records_t_balance <= 10 ether);
- require(_records_t_balance >= 10**6);
-
- poolTotal = badd(poolTotal, poolAmountOut);
- _records_t_balance = badd(_records_t_balance, tokenAmountIn);
-
- require(tokenAmountIn > 0); // prevent triggering the free token generation from joinPool
-
- require(poolTotal >= poolAmountIn);
- uint tokenAmountOut = exitPoolNoFee(poolAmountIn, poolTotal, _records_t_balance);
- require(_records_t_balance >= tokenAmountOut);
-
- // We try to generate free pool share
- require(poolAmountOut > poolAmountIn);
- require(tokenAmountOut == tokenAmountIn);
- echidna_no_bug_found = false;
- }
-
-
-}
\ No newline at end of file
diff --git a/contracts/test/echidna/TBPoolJoinPool.sol b/contracts/test/echidna/TBPoolJoinPool.sol
deleted file mode 100644
index d43ec43b..00000000
--- a/contracts/test/echidna/TBPoolJoinPool.sol
+++ /dev/null
@@ -1,34 +0,0 @@
-import "../../BNum.sol";
-
-pragma solidity 0.5.12;
-
-contract TBPoolJoinPool is BNum {
-
- bool public echidna_no_bug_found = true;
-
- // joinPool models the BPool.joinPool behavior for one token
- // A bug is found if poolAmountOut is greater than 0
- // And tokenAmountIn is 0
- function joinPool(uint poolAmountOut, uint poolTotal, uint _records_t_balance)
- public returns(uint)
- {
- // We constraint poolTotal and _records_t_balance
- // To have "realistic" values
- require(poolTotal <= 100 ether);
- require(poolTotal >= 1 ether);
- require(_records_t_balance <= 10 ether);
- require(_records_t_balance >= 10**6);
-
- uint ratio = bdiv(poolAmountOut, poolTotal);
- require(ratio != 0, "ERR_MATH_APPROX");
-
- uint bal = _records_t_balance;
- uint tokenAmountIn = bmul(ratio, bal);
-
- require(poolAmountOut > 0);
- require(tokenAmountIn == 0);
-
- echidna_no_bug_found = false;
- }
-
-}
\ No newline at end of file
diff --git a/echidna/BMathInternal.sol b/echidna/BMathInternal.sol
deleted file mode 100644
index 00d784cf..00000000
--- a/echidna/BMathInternal.sol
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- This file is a flatenen version of BMath where all the public functions have been marked internal.
- This helps Echidna to focus on some specific properties.
-*/
-
-
-
-pragma solidity 0.5.12;
-contract BColor {
- function getColor()
- internal view
- returns (bytes32);
-}
-contract BBronze is BColor {
- function getColor()
- internal view
- returns (bytes32) {
- return bytes32("BRONZE");
- }
-}
-contract BConst is BBronze {
- uint internal constant BONE = 10**18;
-
- uint internal constant MAX_BOUND_TOKENS = 8;
- uint internal constant BPOW_PRECISION = BONE / 10**10;
-
- uint internal constant MIN_FEE = BONE / 10**6;
- uint internal constant MAX_FEE = BONE / 10;
- uint internal constant EXIT_FEE = BONE / 10000;
-
- uint internal constant MIN_WEIGHT = BONE;
- uint internal constant MAX_WEIGHT = BONE * 50;
- uint internal constant MAX_TOTAL_WEIGHT = BONE * 50;
- uint internal constant MIN_BALANCE = BONE / 10**12;
- uint internal constant MAX_BALANCE = BONE * 10**12;
-
- uint internal constant MIN_POOL_SUPPLY = BONE;
-
- uint internal constant MIN_BPOW_BASE = 1 wei;
- uint internal constant MAX_BPOW_BASE = (2 * BONE) - 1 wei;
-
- uint internal constant MAX_IN_RATIO = BONE / 2;
- uint internal constant MAX_OUT_RATIO = (BONE / 3) + 1 wei;
-
-}
-contract BNum is BConst {
-
- function btoi(uint a)
- internal pure
- returns (uint)
- {
- return a / BONE;
- }
-
- function bfloor(uint a)
- internal pure
- returns (uint)
- {
- return btoi(a) * BONE;
- }
-
- function badd(uint a, uint b)
- internal pure
- returns (uint)
- {
- uint c = a + b;
- require(c >= a, "ERR_ADD_OVERFLOW");
- return c;
- }
-
- function bsub(uint a, uint b)
- internal pure
- returns (uint)
- {
- (uint c, bool flag) = bsubSign(a, b);
- require(!flag, "ERR_SUB_UNDERFLOW");
- return c;
- }
-
- function bsubSign(uint a, uint b)
- internal pure
- returns (uint, bool)
- {
- if (a >= b) {
- return (a - b, false);
- } else {
- return (b - a, true);
- }
- }
-
- function bmul(uint a, uint b)
- internal pure
- returns (uint)
- {
- uint c0 = a * b;
- require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
- uint c1 = c0 + (BONE / 2);
- require(c1 >= c0, "ERR_MUL_OVERFLOW");
- uint c2 = c1 / BONE;
- return c2;
- }
-
- function bdiv(uint a, uint b)
- internal pure
- returns (uint)
- {
- require(b != 0, "ERR_DIV_ZERO");
- uint c0 = a * BONE;
- require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow
- uint c1 = c0 + (b / 2);
- require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require
- uint c2 = c1 / b;
- return c2;
- }
-
- // DSMath.wpow
- function bpowi(uint a, uint n)
- internal pure
- returns (uint)
- {
- uint z = n % 2 != 0 ? a : BONE;
-
- for (n /= 2; n != 0; n /= 2) {
- a = bmul(a, a);
-
- if (n % 2 != 0) {
- z = bmul(z, a);
- }
- }
- return z;
- }
-
- // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
- // Use `bpowi` for `b^e` and `bpowK` for k iterations
- // of approximation of b^0.w
- function bpow(uint base, uint exp)
- internal pure
- returns (uint)
- {
- require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW");
- require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH");
-
- uint whole = bfloor(exp);
- uint remain = bsub(exp, whole);
-
- uint wholePow = bpowi(base, btoi(whole));
-
- if (remain == 0) {
- return wholePow;
- }
-
- uint partialResult = bpowApprox(base, remain, BPOW_PRECISION);
- return bmul(wholePow, partialResult);
- }
-
- function bpowApprox(uint base, uint exp, uint precision)
- internal pure
- returns (uint)
- {
- // term 0:
- uint a = exp;
- (uint x, bool xneg) = bsubSign(base, BONE);
- uint term = BONE;
- uint sum = term;
- bool negative = false;
-
-
- // term(k) = numer / denom
- // = (product(a - i - 1, i=1-->k) * x^k) / (k!)
- // each iteration, multiply previous term by (a-(k-1)) * x / k
- // continue until term is less than precision
- for (uint i = 1; term >= precision; i++) {
- uint bigK = i * BONE;
- (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
- term = bmul(term, bmul(c, x));
- term = bdiv(term, bigK);
- if (term == 0) break;
-
- if (xneg) negative = !negative;
- if (cneg) negative = !negative;
- if (negative) {
- sum = bsub(sum, term);
- } else {
- sum = badd(sum, term);
- }
- }
-
- return sum;
- }
-
-}
-contract BMath is BBronze, BConst, BNum {
- /**********************************************************************************************
- // calcSpotPrice //
- // sP = spotPrice //
- // bI = tokenBalanceIn ( bI / wI ) 1 //
- // bO = tokenBalanceOut sP = ----------- * ---------- //
- // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) //
- // wO = tokenWeightOut //
- // sF = swapFee //
- **********************************************************************************************/
- function calcSpotPrice(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint swapFee
- )
- internal pure
- returns (uint spotPrice)
- {
- uint numer = bdiv(tokenBalanceIn, tokenWeightIn);
- uint denom = bdiv(tokenBalanceOut, tokenWeightOut);
- uint ratio = bdiv(numer, denom);
- uint scale = bdiv(BONE, bsub(BONE, swapFee));
- return (spotPrice = bmul(ratio, scale));
- }
-
- /**********************************************************************************************
- // calcOutGivenIn //
- // aO = tokenAmountOut //
- // bO = tokenBalanceOut //
- // bI = tokenBalanceIn / / bI \ (wI / wO) \ //
- // aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ | //
- // wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / / //
- // wO = tokenWeightOut //
- // sF = swapFee //
- **********************************************************************************************/
- function calcOutGivenIn(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint tokenAmountIn,
- uint swapFee
- )
- internal pure
- returns (uint tokenAmountOut)
- {
- uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
- uint adjustedIn = bsub(BONE, swapFee);
- adjustedIn = bmul(tokenAmountIn, adjustedIn);
- uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
- uint foo = bpow(y, weightRatio);
- uint bar = bsub(BONE, foo);
- tokenAmountOut = bmul(tokenBalanceOut, bar);
- return tokenAmountOut;
- }
-
- /**********************************************************************************************
- // calcInGivenOut //
- // aI = tokenAmountIn //
- // bO = tokenBalanceOut / / bO \ (wO / wI) \ //
- // bI = tokenBalanceIn bI * | | ------------ | ^ - 1 | //
- // aO = tokenAmountOut aI = \ \ ( bO - aO ) / / //
- // wI = tokenWeightIn -------------------------------------------- //
- // wO = tokenWeightOut ( 1 - sF ) //
- // sF = swapFee //
- **********************************************************************************************/
- function calcInGivenOut(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint tokenAmountOut,
- uint swapFee
- )
- internal pure
- returns (uint tokenAmountIn)
- {
- uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
- uint diff = bsub(tokenBalanceOut, tokenAmountOut);
- uint y = bdiv(tokenBalanceOut, diff);
- uint foo = bpow(y, weightRatio);
- foo = bsub(foo, BONE);
- tokenAmountIn = bsub(BONE, swapFee);
- tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn);
- return tokenAmountIn;
- }
-
- /**********************************************************************************************
- // calcPoolOutGivenSingleIn //
- // pAo = poolAmountOut / \ //
- // tAi = tokenAmountIn /// / // wI \ \\ \ wI \ //
- // wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \ //
- // tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS //
- // tBi = tokenBalanceIn \\ ------------------------------------- / / //
- // pS = poolSupply \\ tBi / / //
- // sF = swapFee \ / //
- **********************************************************************************************/
- function calcPoolOutGivenSingleIn(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint poolSupply,
- uint totalWeight,
- uint tokenAmountIn,
- uint swapFee
- )
- internal pure
- returns (uint poolAmountOut)
- {
- // Charge the trading fee for the proportion of tokenAi
- /// which is implicitly traded to the other pool tokens.
- // That proportion is (1- weightTokenIn)
- // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
- uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
- uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
- uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz));
-
- uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee);
- uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn);
-
- // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
- uint poolRatio = bpow(tokenInRatio, normalizedWeight);
- uint newPoolSupply = bmul(poolRatio, poolSupply);
- poolAmountOut = bsub(newPoolSupply, poolSupply);
- return poolAmountOut;
- }
-
- /**********************************************************************************************
- // calcSingleInGivenPoolOut //
- // tAi = tokenAmountIn //(pS + pAo)\ / 1 \\ //
- // pS = poolSupply || --------- | ^ | --------- || * bI - bI //
- // pAo = poolAmountOut \\ pS / \(wI / tW)// //
- // bI = balanceIn tAi = -------------------------------------------- //
- // wI = weightIn / wI \ //
- // tW = totalWeight | 1 - ---- | * sF //
- // sF = swapFee \ tW / //
- **********************************************************************************************/
- function calcSingleInGivenPoolOut(
- uint tokenBalanceIn,
- uint tokenWeightIn,
- uint poolSupply,
- uint totalWeight,
- uint poolAmountOut,
- uint swapFee
- )
- internal pure
- returns (uint tokenAmountIn)
- {
- uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
- uint newPoolSupply = badd(poolSupply, poolAmountOut);
- uint poolRatio = bdiv(newPoolSupply, poolSupply);
-
- //uint newBalTi = poolRatio^(1/weightTi) * balTi;
- uint boo = bdiv(BONE, normalizedWeight);
- uint tokenInRatio = bpow(poolRatio, boo);
- uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn);
- uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn);
- // Do reverse order of fees charged in joinswap_ExternAmountIn, this way
- // ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ```
- //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ;
- uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
- tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar));
- return tokenAmountIn;
- }
-
- /**********************************************************************************************
- // calcSingleOutGivenPoolIn //
- // tAo = tokenAmountOut / / \\ //
- // bO = tokenBalanceOut / // pS - (pAi * (1 - eF)) \ / 1 \ \\ //
- // pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || //
- // ps = poolSupply \ \\ pS / \(wO / tW)/ // //
- // wI = tokenWeightIn tAo = \ \ // //
- // tW = totalWeight / / wO \ \ //
- // sF = swapFee * | 1 - | 1 - ---- | * sF | //
- // eF = exitFee \ \ tW / / //
- **********************************************************************************************/
- function calcSingleOutGivenPoolIn(
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint poolSupply,
- uint totalWeight,
- uint poolAmountIn,
- uint swapFee
- )
- internal pure
- returns (uint tokenAmountOut)
- {
- uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
- // charge exit fee on the pool token side
- // pAiAfterExitFee = pAi*(1-exitFee)
- uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE));
- uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
- uint poolRatio = bdiv(newPoolSupply, poolSupply);
-
- // newBalTo = poolRatio^(1/weightTo) * balTo;
- uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight));
- uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut);
-
- uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut);
-
- // charge swap fee on the output token side
- //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
- uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
- tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz));
- return tokenAmountOut;
- }
-
- /**********************************************************************************************
- // calcPoolInGivenSingleOut //
- // pAi = poolAmountIn // / tAo \\ / wO \ \ //
- // bO = tokenBalanceOut // | bO - -------------------------- |\ | ---- | \ //
- // tAo = tokenAmountOut pS - || \ 1 - ((1 - (tO / tW)) * sF)/ | ^ \ tW / * pS | //
- // ps = poolSupply \\ -----------------------------------/ / //
- // wO = tokenWeightOut pAi = \\ bO / / //
- // tW = totalWeight ------------------------------------------------------------- //
- // sF = swapFee ( 1 - eF ) //
- // eF = exitFee //
- **********************************************************************************************/
- function calcPoolInGivenSingleOut(
- uint tokenBalanceOut,
- uint tokenWeightOut,
- uint poolSupply,
- uint totalWeight,
- uint tokenAmountOut,
- uint swapFee
- )
- internal pure
- returns (uint poolAmountIn)
- {
-
- // charge swap fee on the output token side
- uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
- //uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ;
- uint zoo = bsub(BONE, normalizedWeight);
- uint zar = bmul(zoo, swapFee);
- uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar));
-
- uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee);
- uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut);
-
- //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply;
- uint poolRatio = bpow(tokenOutRatio, normalizedWeight);
- uint newPoolSupply = bmul(poolRatio, poolSupply);
- uint poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply);
-
- // charge exit fee on the pool token side
- // pAi = pAiAfterExitFee/(1-exitFee)
- poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE));
- return poolAmountIn;
- }
-
-
-}
\ No newline at end of file
diff --git a/echidna/CryticInterface.sol b/echidna/CryticInterface.sol
deleted file mode 100644
index 0b43050b..00000000
--- a/echidna/CryticInterface.sol
+++ /dev/null
@@ -1,5 +0,0 @@
-contract CryticInterface {
- address internal crytic_owner = address(0x41414141);
- address internal crytic_user = address(0x42424242);
- address internal crytic_attacker = address(0x43434343);
-}
diff --git a/echidna/MyToken.sol b/echidna/MyToken.sol
deleted file mode 100644
index 7eae0edd..00000000
--- a/echidna/MyToken.sol
+++ /dev/null
@@ -1,19 +0,0 @@
-import "../crytic-export/flattening/BPool.sol";
-import "./CryticInterface.sol";
-
-contract MyToken is BToken, CryticInterface{
-
- constructor(uint balance, address allowed) public {
- // balance is the new totalSupply
- _totalSupply = balance;
- // each user receives 1/3 of the balance and sets
- // the allowance of the allowed address.
- uint initialTotalSupply = balance;
- _balance[crytic_owner] = initialTotalSupply/3;
- _allowance[crytic_owner][allowed] = balance;
- _balance[crytic_user] = initialTotalSupply/3;
- _allowance[crytic_user][allowed] = balance;
- _balance[crytic_attacker] = initialTotalSupply/3;
- _allowance[crytic_attacker][allowed] = balance;
- }
-}
diff --git a/echidna/TBPoolBalance.sol b/echidna/TBPoolBalance.sol
deleted file mode 100644
index 6931e434..00000000
--- a/echidna/TBPoolBalance.sol
+++ /dev/null
@@ -1,34 +0,0 @@
-import "../crytic-export/flattening/BPool.sol";
-import "./MyToken.sol";
-import "./CryticInterface.sol";
-
-contract TBPoolBalance is BPool, CryticInterface {
-
- MyToken public token;
- uint internal initial_token_balance = uint(-1);
-
- constructor() public{
- // Create a new token with initial_token_balance as total supply.
- // After the token is created, each user defined in CryticInterface
- // (crytic_owner, crytic_user and crytic_attacker) receives 1/3 of
- // the initial balance
- token = new MyToken(initial_token_balance, address(this));
- // Bind the token with the minimal balance/weights
- bind(address(token), MIN_BALANCE, MIN_WEIGHT);
- // Enable public swap
- setPublicSwap(true);
- }
-
- function echidna_attacker_token_balance() public returns(bool){
- // An attacker cannot obtain more tokens than its initial balance
- return token.balanceOf(crytic_attacker) == initial_token_balance/3; //initial balance of crytic_attacker
- }
-
- function echidna_pool_record_balance() public returns (bool) {
- // If the token was unbinded, avoid revert and return true
- if (this.getNumTokens() == 0)
- return true;
- // The token balance should not be out-of-sync
- return (token.balanceOf(address(this)) >= this.getBalance(address(token)));
- }
-}
diff --git a/echidna/TBPoolBalance.yaml b/echidna/TBPoolBalance.yaml
deleted file mode 100644
index cd4d21c4..00000000
--- a/echidna/TBPoolBalance.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-seqLen: 50
-testLimit: 100000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x41414141", "0x42424242","0x43434343"]
-psender: "0x41414141"
-dashboard: true
diff --git a/echidna/TBPoolBind.sol b/echidna/TBPoolBind.sol
deleted file mode 100644
index d9fa091f..00000000
--- a/echidna/TBPoolBind.sol
+++ /dev/null
@@ -1,169 +0,0 @@
-import "../crytic-export/flattening/BPool.sol";
-import "./MyToken.sol";
-import "./CryticInterface.sol";
-
-contract TBPoolBindPrivileged is CryticInterface, BPool {
-
- constructor() public {
- // Create a new token with initial_token_balance as total supply.
- // After the token is created, each user defined in CryticInterface
- // (crytic_owner, crytic_user and crytic_attacker) receives 1/3 of
- // the initial balance
- MyToken t;
- t = new MyToken(initial_token_balance, address(this));
- bind(address(t), MIN_BALANCE, MIN_WEIGHT);
- }
-
- // initial token balances is the max amount for uint256
- uint internal initial_token_balance = uint(-1);
- // these two variables are used to save valid balances and denorm parameters
- uint internal valid_balance_to_bind = MIN_BALANCE;
- uint internal valid_denorm_to_bind = MIN_WEIGHT;
-
-
- // this function allows to create as many tokens as needed
- function create_and_bind(uint balance, uint denorm) public returns (address) {
- // Create a new token with initial_token_balance as total supply.
- // After the token is created, each user defined in CryticInterface
- // (crytic_owner, crytic_user and crytic_attacker) receives 1/3 of
- // the initial balance
- MyToken bt = new MyToken(initial_token_balance, address(this));
- bt.approve(address(this), initial_token_balance);
- // Bind the token with the provided parameters
- bind(address(bt), balance, denorm);
- // Save the balance and denorm values used. These are used in the rebind checks
- valid_balance_to_bind = balance;
- valid_denorm_to_bind = denorm;
- return address(bt);
- }
-
- function echidna_getNumTokens_less_or_equal_MAX_BOUND_TOKENS() public returns (bool) {
- // it is not possible to bind more than `MAX_BOUND_TOKENS`
- return this.getNumTokens() <= MAX_BOUND_TOKENS;
- }
-
- function echidna_revert_bind_twice() public returns (bool) {
- if (this.getCurrentTokens().length > 0 && this.getController() == crytic_owner && !this.isFinalized()) {
- // binding the first token should be enough, if we have this property to always revert
- bind(this.getCurrentTokens()[0], valid_balance_to_bind, valid_denorm_to_bind);
- // This return will make this property to fail
- return true;
- }
- // If there are no tokens or if the controller was changed or if the pool was finalized, just revert.
- revert();
- }
-
- function echidna_revert_unbind_twice() public returns (bool) {
- if (this.getCurrentTokens().length > 0 && this.getController() == crytic_owner && !this.isFinalized()) {
- address[] memory current_tokens = this.getCurrentTokens();
- // unbinding the first token twice should be enough, if we want this property to always revert
- unbind(current_tokens[0]);
- unbind(current_tokens[0]);
- return true;
- }
- // if there are no tokens or if the controller was changed or if the pool was finalized, just revert
- revert();
- }
-
- function echidna_all_tokens_are_unbindable() public returns (bool) {
- if (this.getController() == crytic_owner && !this.isFinalized()) {
- address[] memory current_tokens = this.getCurrentTokens();
- // unbind all the tokens, one by one
- for (uint i = 0; i < current_tokens.length; i++) {
- unbind(current_tokens[i]);
- }
- // at the end, the list of current tokens should be empty
- return (this.getCurrentTokens().length == 0);
- }
-
- // if the controller was changed or if the pool was finalized, just return true
- return true;
- }
-
- function echidna_all_tokens_are_rebindable_with_valid_parameters() public returns (bool) {
- if (this.getController() == crytic_owner && !this.isFinalized()) {
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++) {
- // rebind all the tokens, one by one, using valid parameters
- rebind(current_tokens[i], valid_balance_to_bind, valid_denorm_to_bind);
- }
- // at the end, the list of current tokens should have not change in size
- return current_tokens.length == this.getCurrentTokens().length;
- }
- // if the controller was changed or if the pool was finalized, just return true
- return true;
- }
-
- function echidna_revert_rebind_unbinded() public returns (bool) {
- if (this.getCurrentTokens().length > 0 && this.getController() == crytic_owner && !this.isFinalized()) {
- address[] memory current_tokens = this.getCurrentTokens();
- // unbinding and rebinding the first token should be enough, if we want this property to always revert
- unbind(current_tokens[0]);
- rebind(current_tokens[0], valid_balance_to_bind, valid_denorm_to_bind);
- return true;
- }
- // if the controller was changed or if the pool was finalized, just return true
- revert();
- }
-}
-
-contract TBPoolBindUnprivileged is CryticInterface, BPool {
-
- MyToken t1;
- MyToken t2;
- // initial token balances is the max amount for uint256
- uint internal initial_token_balance = uint(-1);
-
- constructor() public {
- // two tokens with minimal balances and weights are created by the controller
- t1 = new MyToken(initial_token_balance, address(this));
- bind(address(t1), MIN_BALANCE, MIN_WEIGHT);
- t2 = new MyToken(initial_token_balance, address(this));
- bind(address(t2), MIN_BALANCE, MIN_WEIGHT);
- }
-
- // these two variables are used to save valid balances and denorm parameters
- uint internal valid_balance_to_bind = MIN_BALANCE;
- uint internal valid_denorm_to_bind = MIN_WEIGHT;
-
- // this function allows to create as many tokens as needed
- function create_and_bind(uint balance, uint denorm) public returns (address) {
- // Create a new token with initial_token_balance as total supply.
- // After the token is created, each user defined in CryticInterface
- // (crytic_owner, crytic_user and crytic_attacker) receives 1/3 of
- // the initial balance
- MyToken bt = new MyToken(initial_token_balance, address(this));
- bt.approve(address(this), initial_token_balance);
- // Bind the token with the provided parameters
- bind(address(bt), balance, denorm);
- // Save the balance and denorm values used. These are used in the rebind checks
- valid_balance_to_bind = balance;
- valid_denorm_to_bind = denorm;
- return address(bt);
- }
-
- function echidna_only_controller_can_bind() public returns (bool) {
- // the number of tokens cannot be changed
- return this.getNumTokens() == 2;
- }
-
- function echidna_revert_when_bind() public returns (bool) {
- // calling bind will revert
- create_and_bind(valid_balance_to_bind, valid_denorm_to_bind);
- return true;
- }
-
- function echidna_revert_when_rebind() public returns (bool) {
- // calling rebind on binded tokens will revert
- rebind(address(t1), valid_balance_to_bind, valid_denorm_to_bind);
- rebind(address(t2), valid_balance_to_bind, valid_denorm_to_bind);
- return true;
- }
-
- function echidna_revert_when_unbind() public returns (bool) {
- // calling unbind on binded tokens will revert
- unbind(address(t1));
- unbind(address(t2));
- return true;
- }
-}
diff --git a/echidna/TBPoolBindPrivileged.yaml b/echidna/TBPoolBindPrivileged.yaml
deleted file mode 100644
index 1695608f..00000000
--- a/echidna/TBPoolBindPrivileged.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-seqLen: 50
-testLimit: 100000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x41414141", "0x42424242", "0x43434343"]
-psender: "0x41414141"
-dashboard: true
-corpusDir: "corpus"
-mutation: true
diff --git a/echidna/TBPoolBindUnprivileged.yaml b/echidna/TBPoolBindUnprivileged.yaml
deleted file mode 100644
index 95044fad..00000000
--- a/echidna/TBPoolBindUnprivileged.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-seqLen: 50
-testLimit: 20000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x42424242", "0x43434343"]
-psender: "0x42424242"
-dashboard: true
diff --git a/echidna/TBPoolController.sol b/echidna/TBPoolController.sol
deleted file mode 100644
index 5a3d3947..00000000
--- a/echidna/TBPoolController.sol
+++ /dev/null
@@ -1,33 +0,0 @@
-import "../crytic-export/flattening/BPool.sol";
-import "./CryticInterface.sol";
-
-contract TBPoolControllerPrivileged is CryticInterface, BPool {
-
- function echidna_controller_should_change() public returns (bool) {
- if (this.getController() == crytic_owner) {
- setController(crytic_user);
- return (this.getController() == crytic_user);
- }
- // if the controller was changed, this should return true
- return true;
- }
-
- function echidna_revert_controller_cannot_be_null() public returns (bool) {
- if (this.getController() == crytic_owner) {
- // setting the controller to 0x0 should fail
- setController(address(0x0));
- return true;
- }
- // if the controller was changed, this should revert anyway
- revert();
- }
-}
-
-contract TBPoolControllerUnprivileged is CryticInterface, BPool {
-
- function echidna_no_other_user_can_change_the_controller() public returns (bool) {
- // the controller cannot be changed by other users
- return this.getController() == crytic_owner;
- }
-
-}
diff --git a/echidna/TBPoolControllerPrivileged.yaml b/echidna/TBPoolControllerPrivileged.yaml
deleted file mode 100644
index 86790a19..00000000
--- a/echidna/TBPoolControllerPrivileged.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-seqLen: 50
-testLimit: 20000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x41414141", "0x42424242", "0x43434343"]
-psender: "0x41414141"
-dashboard: true
diff --git a/echidna/TBPoolControllerUnprivileged.yaml b/echidna/TBPoolControllerUnprivileged.yaml
deleted file mode 100644
index 6e69a8a9..00000000
--- a/echidna/TBPoolControllerUnprivileged.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-seqLen: 50
-testLimit: 20000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x42424242", "0x43434343"]
-psender: "0x41414141"
-dashboard: true
diff --git a/echidna/TBPoolExitSwap.sol b/echidna/TBPoolExitSwap.sol
deleted file mode 100644
index fb1826a2..00000000
--- a/echidna/TBPoolExitSwap.sol
+++ /dev/null
@@ -1,23 +0,0 @@
-import "./BMathInternal.sol";
-
-// This contract used a modified version of BMath where all the public/external functions are internal to speed up Echidna exploration
-contract TestSwapOut is BMath {
-
- bool public echidna_no_bug = true;
-
- // A bug is found if tokenAmountOut can be greater than 0 while calcPoolInGivenSingleOut returns 0
- function exitswapExternAmountOut(uint balanceOut, uint poolTotal, uint tokenAmountOut) public {
- // We constraint poolTotal and _records_t_balance
- // To have "realistic" values
- require(poolTotal <= 100 ether);
- require(poolTotal >= 1 ether);
-
- require(balanceOut <= 10 ether);
- require(balanceOut >= 10**6);
-
- require(tokenAmountOut > 0);
- require(calcPoolInGivenSingleOut(balanceOut, MIN_WEIGHT, poolTotal, MIN_WEIGHT*2, tokenAmountOut, MIN_FEE)==0);
- echidna_no_bug = false;
- }
-
-}
\ No newline at end of file
diff --git a/echidna/TBPoolJoinExit.sol b/echidna/TBPoolJoinExit.sol
deleted file mode 100644
index a23c60b0..00000000
--- a/echidna/TBPoolJoinExit.sol
+++ /dev/null
@@ -1,116 +0,0 @@
-import "../crytic-export/flattening/BPool.sol";
-import "./MyToken.sol";
-import "./CryticInterface.sol";
-
-contract TBPoolJoinExit is CryticInterface, BPool {
-
- uint MAX_BALANCE = BONE * 10**12;
-
- constructor() public {
- MyToken t;
- t = new MyToken(uint(-1), address(this));
- bind(address(t), MAX_BALANCE, MAX_WEIGHT);
- }
-
- // initial token balances is the max amount for uint256
- uint internal initial_token_balance = uint(-1);
-
- // this function allows to create as many tokens as needed
- function create_and_bind(uint balance, uint denorm) public returns (address) {
- // Create a new token with initial_token_balance as total supply.
- // After the token is created, each user defined in CryticInterface
- // (crytic_owner, crytic_user and crytic_attacker) receives 1/3 of
- // the initial balance
- MyToken bt = new MyToken(initial_token_balance, address(this));
- bt.approve(address(this), initial_token_balance);
- // Bind the token with the provided parameters
- bind(address(bt), balance, denorm);
- return address(bt);
- }
-
- uint[] internal maxAmountsIn = [uint(-1), uint(-1), uint(-1), uint(-1), uint(-1), uint(-1)];
- uint[] internal minAmountsOut = [0, 0, 0, 0, 0, 0, 0, 0];
- uint[8] internal balances = [0, 0, 0, 0, 0, 0, 0, 0];
-
- uint internal amount = EXIT_FEE;
- uint internal amount1 = EXIT_FEE;
- uint internal amount2 = EXIT_FEE;
-
- // sets an amount between EXIT_FEE and EXIT_FEE + 2**64
- function set_input(uint _amount) public {
- amount = EXIT_FEE + _amount % 2**64;
- }
-
- // sets two amounts between EXIT_FEE and EXIT_FEE + 2**64
- function set_two_inputs(uint _amount1, uint _amount2) public {
- amount1 = EXIT_FEE + _amount1 % 2**64;
- amount2 = EXIT_FEE + _amount2 % 2**64;
- }
-
- function echidna_joinPool_exitPool_balance_consistency() public returns (bool) {
-
- // if the pool was not finalize, return true (it is unclear how to finalize it)
- if (!this.isFinalized())
- return true;
-
- // check this precondition for joinPool
- if (bdiv(amount, this.totalSupply()) == 0)
- return true;
-
- // save all the token balances in `balances` before calling joinPool / exitPool
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++)
- balances[i] = (IERC20(current_tokens[i]).balanceOf(address(msg.sender)));
-
- // save the amount of share tokens
- uint old_balance = this.balanceOf(crytic_owner);
-
- // call joinPool, with some some reasonable amount
- joinPool(amount, maxAmountsIn);
- // check that the amount of shares decreased
- if (this.balanceOf(crytic_owner) - amount != old_balance)
- return false;
-
- // check the precondition for exitPool
- uint exit_fee = bmul(amount, EXIT_FEE);
- uint pAiAfterExitFee = bsub(amount, exit_fee);
- if(bdiv(pAiAfterExitFee, this.totalSupply()) == 0)
- return true;
-
- // call exitPool with some reasonable amount
- exitPool(amount, minAmountsOut);
- uint new_balance = this.balanceOf(crytic_owner);
-
- // check that the amount of shares decreased, taking in consideration that
- // _factory is crytic_owner, so it will receive the exit_fees
- if (old_balance != new_balance - exit_fee)
- return false;
-
- // verify that the final token balance are consistent. It is possible
- // to have rounding issues, but it should not allow to obtain more tokens than
- // the ones a user owned
- for (uint i = 0; i < current_tokens.length; i++) {
- uint current_balance = IERC20(current_tokens[i]).balanceOf(address(msg.sender));
- if (balances[i] < current_balance)
- return false;
- }
-
- return true;
- }
-
- function echidna_revert_impossible_joinPool_exitPool() public returns (bool) {
-
- // the amount to join should be smaller to the amount to exit
- if (amount1 >= amount2)
- revert();
-
- // burn all the shares transfering them to 0x0
- transfer(address(0x0), this.balanceOf(msg.sender));
- // join a pool with a reasonable amount.
- joinPool(amount1, maxAmountsIn);
- // exit a pool with a larger amount
- exitPool(amount2, minAmountsOut);
- return true;
- }
-
-}
diff --git a/echidna/TBPoolJoinExit.yaml b/echidna/TBPoolJoinExit.yaml
deleted file mode 100644
index e27c5ce4..00000000
--- a/echidna/TBPoolJoinExit.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-seqLen: 50
-testLimit: 1000000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x41414141", "0x42424242", "0x43434343"]
-psender: "0x41414141"
-dashboard: true
-corpusDir: "corpus"
-mutation: true
diff --git a/echidna/TBPoolLimits.sol b/echidna/TBPoolLimits.sol
deleted file mode 100644
index 4493db7a..00000000
--- a/echidna/TBPoolLimits.sol
+++ /dev/null
@@ -1,149 +0,0 @@
-import "../crytic-export/flattening/BPool.sol";
-import "./MyToken.sol";
-import "./CryticInterface.sol";
-
-contract TBPoolLimits is CryticInterface, BPool {
-
- uint MAX_BALANCE = BONE * 10**12;
-
- constructor() public {
- MyToken t;
- t = new MyToken(uint(-1), address(this));
- bind(address(t), MIN_BALANCE, MIN_WEIGHT);
- }
-
- // initial token balances is the max amount for uint256
- uint internal initial_token_balance = uint(-1);
- // these two variables are used to save valid balances and denorm parameters
- uint internal valid_balance_to_bind = MIN_BALANCE;
- uint internal valid_denorm_to_bind = MIN_WEIGHT;
-
- // this function allows to create as many tokens as needed
- function create_and_bind(uint balance, uint denorm) public returns (address) {
- // Create a new token with initial_token_balance as total supply.
- // After the token is created, each user defined in CryticInterface
- // (crytic_owner, crytic_user and crytic_attacker) receives 1/3 of
- // the initial balance
- MyToken bt = new MyToken(initial_token_balance, address(this));
- bt.approve(address(this), initial_token_balance);
- // Bind the token with the provided parameters
- bind(address(bt), balance, denorm);
- // Save the balance and denorm values used. These are used in the rebind checks
- valid_balance_to_bind = balance;
- valid_denorm_to_bind = denorm;
- return address(bt);
- }
-
- function echidna_valid_weights() public returns (bool) {
- address[] memory current_tokens = this.getCurrentTokens();
- // store the normalized weight in this variable
- uint nw = 0;
- for (uint i = 0; i < current_tokens.length; i++) {
- // accumulate the total normalized weights, checking for overflows
- nw = badd(nw,this.getNormalizedWeight(current_tokens[i]));
- }
- // convert the sum of normalized weights into an integer
- nw = btoi(nw);
-
- // if there are no tokens, check that the normalized weight is zero
- if (current_tokens.length == 0)
- return (nw == 0);
-
- // if there are tokens, the normalized weight should be 1
- return (nw == 1);
- }
-
- function echidna_min_token_balance() public returns (bool) {
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++) {
- // verify that the balance of each token is more than `MIN_BALACE`
- if (this.getBalance(address(current_tokens[i])) < MIN_BALANCE)
- return false;
- }
- // if there are no tokens, return true
- return true;
- }
-
- function echidna_max_weight() public returns (bool) {
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++) {
- // verify that the weight of each token is less than `MAX_WEIGHT`
- if (this.getDenormalizedWeight(address(current_tokens[i])) > MAX_WEIGHT)
- return false;
- }
- // if there are no tokens, return true
- return true;
- }
-
- function echidna_min_weight() public returns (bool) {
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++) {
- // verify that the weight of each token is more than `MIN_WEIGHT`
- if (this.getDenormalizedWeight(address(current_tokens[i])) < MIN_WEIGHT)
- return false;
- }
- // if there are no tokens, return true
- return true;
- }
-
-
- function echidna_min_swap_free() public returns (bool) {
- // verify that the swap fee is greater or equal than `MIN_FEE`
- return this.getSwapFee() >= MIN_FEE;
- }
-
- function echidna_max_swap_free() public returns (bool) {
- // verify that the swap fee is less or equal than `MAX_FEE`
- return this.getSwapFee() <= MAX_FEE;
- }
-
- function echidna_revert_max_swapExactAmountOut() public returns (bool) {
- // if the controller was changed, revert
- if (this.getController() != crytic_owner)
- revert();
-
- // if the pool is not finalized, make sure public swap is enabled
- if (!this.isFinalized())
- setPublicSwap(true);
-
- address[] memory current_tokens = this.getCurrentTokens();
- // if there is not token, revert
- if (current_tokens.length == 0)
- revert();
-
- uint large_balance = this.getBalance(current_tokens[0])/3 + 2;
-
- // check that the balance is large enough
- if (IERC20(current_tokens[0]).balanceOf(crytic_owner) < large_balance)
- revert();
-
- // call swapExactAmountOut with more than 1/3 of the balance should revert
- swapExactAmountOut(address(current_tokens[0]), uint(-1), address(current_tokens[0]), large_balance, uint(-1));
- return true;
- }
-
- function echidna_revert_max_swapExactAmountIn() public returns (bool) {
- // if the controller was changed, revert
- if (this.getController() != crytic_owner)
- revert();
-
- // if the pool is not finalized, make sure public swap is enabled
- if (!this.isFinalized())
- setPublicSwap(true);
-
- address[] memory current_tokens = this.getCurrentTokens();
- // if there is not token, revert
- if (current_tokens.length == 0)
- revert();
-
- uint large_balance = this.getBalance(current_tokens[0])/2 + 1;
-
- if (IERC20(current_tokens[0]).balanceOf(crytic_owner) < large_balance)
- revert();
-
- swapExactAmountIn(address(current_tokens[0]), large_balance, address(current_tokens[0]), 0, uint(-1));
-
- return true;
- }
-
-}
diff --git a/echidna/TBPoolLimits.yaml b/echidna/TBPoolLimits.yaml
deleted file mode 100644
index 1695608f..00000000
--- a/echidna/TBPoolLimits.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-seqLen: 50
-testLimit: 100000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x41414141", "0x42424242", "0x43434343"]
-psender: "0x41414141"
-dashboard: true
-corpusDir: "corpus"
-mutation: true
diff --git a/echidna/TBPoolNoRevert.sol b/echidna/TBPoolNoRevert.sol
deleted file mode 100644
index 86a027f0..00000000
--- a/echidna/TBPoolNoRevert.sol
+++ /dev/null
@@ -1,102 +0,0 @@
-import "../crytic-export/flattening/BPool.sol";
-import "./MyToken.sol";
-import "./CryticInterface.sol";
-
-contract TBPoolNoRevert is CryticInterface, BPool {
-
- constructor() public { // out-of-gas?
- // Create a new token with initial_token_balance as total supply.
- // After the token is created, each user defined in CryticInterface
- // (crytic_owner, crytic_user and crytic_attacker) receives 1/3 of
- // the initial balance
- MyToken t;
- t = new MyToken(initial_token_balance, address(this));
- bind(address(t), MIN_BALANCE, MIN_WEIGHT);
- }
-
- // initial token balances is the max amount for uint256
- uint internal initial_token_balance = uint(-1);
-
- // this function allows to create as many tokens as needed
- function create_and_bind(uint balance, uint denorm) public returns (address) {
- // Create a new token with initial_token_balance as total supply.
- // After the token is created, each user defined in CryticInterface
- // (crytic_owner, crytic_user and crytic_attacker) receives 1/3 of
- // the initial balance
- MyToken bt = new MyToken(initial_token_balance, address(this));
- bt.approve(address(this), initial_token_balance);
- // Bind the token with the provided parameters
- bind(address(bt), balance, denorm);
- // Save the balance and denorm values used. These are used in the rebind checks
- return address(bt);
- }
-
- function echidna_getSpotPrice_no_revert() public returns (bool) {
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++) {
- for (uint j = 0; j < current_tokens.length; j++) {
- // getSpotPrice should not revert for any pair of tokens
- this.getSpotPrice(address(current_tokens[i]), address(current_tokens[j]));
- }
- }
-
- return true;
- }
-
- function echidna_getSpotPriceSansFee_no_revert() public returns (bool) {
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++) {
- for (uint j = 0; j < current_tokens.length; j++) {
- // getSpotPriceSansFee should not revert for any pair of tokens
- this.getSpotPriceSansFee(address(current_tokens[i]), address(current_tokens[j]));
- }
- }
-
- return true;
- }
-
- function echidna_swapExactAmountIn_no_revert() public returns (bool) {
- // if the controller was changed, return true
- if (this.getController() != crytic_owner)
- return true;
-
- // if the pool was not finalized, enable the public swap
- if (!this.isFinalized())
- setPublicSwap(true);
-
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++) {
- // a small balance is 1% of the total balance available
- uint small_balance = this.getBalance(current_tokens[i])/100;
- // if the user has a small balance, it should be able to swap it
- if (IERC20(current_tokens[i]).balanceOf(crytic_owner) > small_balance)
- swapExactAmountIn(address(current_tokens[i]), small_balance, address(current_tokens[i]), 0, uint(-1));
- }
-
- return true;
- }
-
- function echidna_swapExactAmountOut_no_revert() public returns (bool) {
-
- // if the controller was changed, return true
- if (this.getController() != crytic_owner)
- return true;
-
- // if the pool was not finalized, enable the public swap
- if (!this.isFinalized())
- setPublicSwap(true);
-
- address[] memory current_tokens = this.getCurrentTokens();
- for (uint i = 0; i < current_tokens.length; i++) {
- // a small balance is 1% of the total balance available
- uint small_balance = this.getBalance(current_tokens[i])/100;
- // if the user has a small balance, it should be able to swap it
- if (IERC20(current_tokens[i]).balanceOf(crytic_owner) > small_balance)
- swapExactAmountOut(address(current_tokens[i]), uint(-1), address(current_tokens[i]), small_balance, uint(-1));
- }
-
- return true;
- }
-
-}
-
diff --git a/echidna/TBPoolNoRevert.yaml b/echidna/TBPoolNoRevert.yaml
deleted file mode 100644
index 1695608f..00000000
--- a/echidna/TBPoolNoRevert.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-seqLen: 50
-testLimit: 100000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x41414141", "0x42424242", "0x43434343"]
-psender: "0x41414141"
-dashboard: true
-corpusDir: "corpus"
-mutation: true
diff --git a/echidna/TBTokenERC20.sol b/echidna/TBTokenERC20.sol
deleted file mode 100644
index 018ca5df..00000000
--- a/echidna/TBTokenERC20.sol
+++ /dev/null
@@ -1,170 +0,0 @@
-import "../crytic-export/flattening/BPool.sol";
-
-contract CryticInterface{
- address internal crytic_owner = address(0x41414141);
- address internal crytic_user = address(0x42424242);
- address internal crytic_attacker = address(0x43434343);
-
- uint internal initialTotalSupply = uint(-1);
- uint internal initialBalance_owner;
- uint internal initialBalance_user;
- uint internal initialBalance_attacker;
-
- uint initialAllowance_user_attacker;
- uint initialAllowance_attacker_user;
- uint initialAllowance_attacker_attacker;
-}
-
-contract TBTokenERC20 is CryticInterface, BToken {
-
- constructor() public {
- _totalSupply = initialTotalSupply;
- _balance[crytic_owner] = 0;
- _balance[crytic_user] = initialTotalSupply/2;
- initialBalance_user = initialTotalSupply/2;
- _balance[crytic_attacker] = initialTotalSupply/2;
- initialBalance_attacker = initialTotalSupply/2;
- }
-
-
- /*
- Type: Code quality
- Return: Success
- */
- function echidna_zero_always_empty() public returns(bool){
- return this.balanceOf(address(0x0)) == 0;
- }
-
- /*
- Type: Code Quality
- Return:
- */
- function echidna_approve_overwrites() public returns (bool) {
- bool approve_return;
- approve_return = approve(crytic_user, 10);
- require(approve_return);
- approve_return = approve(crytic_user, 20);
- require(approve_return);
- return this.allowance(msg.sender, crytic_user) == 20;
- }
-
- /*
- Type: Undetermined severity
- Return: Success
- */
- function echidna_balance_less_than_totalSupply() public returns(bool){
- return this.balanceOf(msg.sender) <= _totalSupply;
- }
-
- /*
- Type: Low severity
- Return: Success
- */
- function echidna_totalSupply_balances_consistency() public returns(bool){
- return this.balanceOf(crytic_owner) + this.balanceOf(crytic_user) + this.balanceOf(crytic_attacker) <= totalSupply();
- }
-
- /*
- Properties: Transferable
- */
-
- /*
- Type: Code Quality
- Return: Fail or Throw
- */
- function echidna_revert_transfer_to_zero() public returns (bool) {
- if (this.balanceOf(msg.sender) == 0)
- revert();
- return transfer(address(0x0), this.balanceOf(msg.sender));
- }
-
- /*
- Type: Code Quality
- Return: Fail or Throw
- */
- function echidna_revert_transferFrom_to_zero() public returns (bool) {
- uint balance = this.balanceOf(msg.sender);
- bool approve_return = approve(msg.sender, balance);
- return transferFrom(msg.sender, address(0x0), this.balanceOf(msg.sender));
- }
-
- /*
- Type: ERC20 Standard
- Fire: Transfer(msg.sender, msg.sender, balanceOf(msg.sender))
- Return: Success
- */
- function echidna_self_transferFrom() public returns(bool){
- uint balance = this.balanceOf(msg.sender);
- bool approve_return = approve(msg.sender, balance);
- bool transfer_return = transferFrom(msg.sender, msg.sender, balance);
- return (this.balanceOf(msg.sender) == balance) && approve_return && transfer_return;
- }
-
-
- /*
- Type: ERC20 Standard
- Return: Success
- */
- function echidna_self_transferFrom_to_other() public returns(bool){
- uint balance = this.balanceOf(msg.sender);
- bool approve_return = approve(msg.sender, balance);
- bool transfer_return = transferFrom(msg.sender, crytic_owner, balance);
- return (this.balanceOf(msg.sender) == 0) && approve_return && transfer_return;
- }
-
- /*
- Type: ERC20 Standard
- Fire: Transfer(msg.sender, msg.sender, balanceOf(msg.sender))
- Return: Success
- */
- function echidna_self_transfer() public returns(bool){
- uint balance = this.balanceOf(msg.sender);
- bool transfer_return = transfer(msg.sender, balance);
- return (this.balanceOf(msg.sender) == balance) && transfer_return;
- }
-
- /*
- Type: ERC20 Standard
- Fire: Transfer(msg.sender, other, 1)
- Return: Success
- */
- function echidna_transfer_to_other() public returns(bool){
- uint balance = this.balanceOf(msg.sender);
- address other = crytic_user;
- if (other == msg.sender) {
- other = crytic_owner;
- }
- if (balance >= 1) {
- bool transfer_other = transfer(other, 1);
- return (this.balanceOf(msg.sender) == balance-1) && (this.balanceOf(other) >= 1) && transfer_other;
- }
- return true;
- }
-
- /*
- Type: ERC20 Standard
- Fire: Transfer(msg.sender, user, balance+1)
- Return: Fail or Throw
- */
- function echidna_revert_transfer_to_user() public returns(bool){
- uint balance = this.balanceOf(msg.sender);
- if (balance == (2 ** 256 - 1))
- revert();
- bool transfer_other = transfer(crytic_user, balance+1);
- return true;
- }
-
-
- /*
- Properties: Not Mintable
- */
-
- /*
- Type: Undetermined severity
- Return: Success
- */
- function echidna_totalSupply_constant() public returns(bool){
- return initialTotalSupply == totalSupply();
- }
-
-}
diff --git a/echidna/TBTokenERC20.yaml b/echidna/TBTokenERC20.yaml
deleted file mode 100644
index 9234033a..00000000
--- a/echidna/TBTokenERC20.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-seqLen: 50
-testLimit: 100000
-prefix: "echidna_"
-deployer: "0x41414141"
-sender: ["0x42424242", "0x43434343"]
-psender: "0x43434343"
-dashboard: true
diff --git a/echidna_general_config.yaml b/echidna_general_config.yaml
deleted file mode 100644
index 19d47dde..00000000
--- a/echidna_general_config.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-seqLen: 50
-testLimit: 1000000
diff --git a/foundry.toml b/foundry.toml
new file mode 100644
index 00000000..046a7d75
--- /dev/null
+++ b/foundry.toml
@@ -0,0 +1,39 @@
+[fmt]
+line_length = 120
+tab_width = 2
+bracket_spacing = false
+int_types = 'long'
+quote_style = 'single'
+number_underscore = 'thousands'
+multiline_func_header = 'params_first'
+sort_imports = true
+
+[profile.default]
+solc_version = '0.8.23'
+libs = ["node_modules", "lib"]
+optimizer_runs = 50 # TODO: increase for production and add via-ir
+ffi = true
+fs_permissions = [{ access = "read-write", path = ".forge-snapshots/"}]
+
+[profile.optimized]
+via_ir = true
+out = 'out-via-ir'
+
+[profile.test]
+via_ir = true
+out = 'out-via-ir'
+
+[profile.docs]
+src = 'src/interfaces/'
+
+[fuzz]
+runs = 1000
+max_test_rejects = 2_500_000
+
+[rpc_endpoints]
+mainnet = "${MAINNET_RPC}"
+sepolia = "${SEPOLIA_RPC}"
+
+[etherscan]
+mainnet = { key = "${ETHERSCAN_API_KEY}", chain = "mainnet" }
+sepolia = { key = "${ETHERSCAN_API_KEY}", chain = "sepolia" }
diff --git a/lib/calc_comparisons.js b/lib/calc_comparisons.js
deleted file mode 100644
index f89bab33..00000000
--- a/lib/calc_comparisons.js
+++ /dev/null
@@ -1,67 +0,0 @@
-const Decimal = require('decimal.js');
-
-function calcRelativeDiff(expected, actual) {
- return ((Decimal(expected).minus(Decimal(actual))).div(expected)).abs();
-}
-
-function calcSpotPrice(tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, swapFee) {
- const numer = Decimal(tokenBalanceIn).div(Decimal(tokenWeightIn));
- const denom = Decimal(tokenBalanceOut).div(Decimal(tokenWeightOut));
- const ratio = numer.div(denom);
- const scale = Decimal(1).div(Decimal(1).sub(Decimal(swapFee)));
- const spotPrice = ratio.mul(scale);
- return spotPrice;
-}
-
-function calcOutGivenIn(tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, tokenAmountIn, swapFee) {
- const weightRatio = Decimal(tokenWeightIn).div(Decimal(tokenWeightOut));
- const adjustedIn = Decimal(tokenAmountIn).times((Decimal(1).minus(Decimal(swapFee))));
- const y = Decimal(tokenBalanceIn).div(Decimal(tokenBalanceIn).plus(adjustedIn));
- const foo = y.pow(weightRatio);
- const bar = Decimal(1).minus(foo);
- const tokenAmountOut = Decimal(tokenBalanceOut).times(bar);
- return tokenAmountOut;
-}
-
-function calcInGivenOut(tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, tokenAmountOut, swapFee) {
- const weightRatio = Decimal(tokenWeightOut).div(Decimal(tokenWeightIn));
- const diff = Decimal(tokenBalanceOut).minus(tokenAmountOut);
- const y = Decimal(tokenBalanceOut).div(diff);
- const foo = y.pow(weightRatio).minus(Decimal(1));
- const tokenAmountIn = (Decimal(tokenBalanceIn).times(foo)).div(Decimal(1).minus(Decimal(swapFee)));
- return tokenAmountIn;
-}
-
-function calcPoolOutGivenSingleIn(tokenBalanceIn, tokenWeightIn, poolSupply, totalWeight, tokenAmountIn, swapFee) {
- const normalizedWeight = Decimal(tokenWeightIn).div(Decimal(totalWeight));
- const zaz = Decimal(1).sub(Decimal(normalizedWeight)).mul(Decimal(swapFee));
- const tokenAmountInAfterFee = Decimal(tokenAmountIn).mul(Decimal(1).sub(zaz));
- const newTokenBalanceIn = Decimal(tokenBalanceIn).add(tokenAmountInAfterFee);
- const tokenInRatio = newTokenBalanceIn.div(Decimal(tokenBalanceIn));
- const poolRatio = tokenInRatio.pow(normalizedWeight);
- const newPoolSupply = poolRatio.mul(Decimal(poolSupply));
- const poolAmountOut = newPoolSupply.sub(Decimal(poolSupply));
- return poolAmountOut;
-}
-
-function calcSingleInGivenPoolOut(tokenBalanceIn, tokenWeightIn, poolSupply, totalWeight, poolAmountOut, swapFee) {
- const normalizedWeight = Decimal(tokenWeightIn).div(Decimal(totalWeight));
- const newPoolSupply = Decimal(poolSupply).plus(Decimal(poolAmountOut));
- const poolRatio = newPoolSupply.div(Decimal(poolSupply));
- const boo = Decimal(1).div(normalizedWeight);
- const tokenInRatio = poolRatio.pow(boo);
- const newTokenBalanceIn = tokenInRatio.mul(Decimal(tokenBalanceIn));
- const tokenAmountInAfterFee = newTokenBalanceIn.sub(Decimal(tokenBalanceIn));
- const zar = (Decimal(1).sub(normalizedWeight)).mul(Decimal(swapFee));
- const tokenAmountIn = tokenAmountInAfterFee.div(Decimal(1).sub(zar));
- return tokenAmountIn;
-}
-
-module.exports = {
- calcSpotPrice,
- calcOutGivenIn,
- calcInGivenOut,
- calcPoolOutGivenSingleIn,
- calcSingleInGivenPoolOut,
- calcRelativeDiff,
-};
diff --git a/manticore/TBPoolJoinExit.py b/manticore/TBPoolJoinExit.py
deleted file mode 100644
index c604d0b7..00000000
--- a/manticore/TBPoolJoinExit.py
+++ /dev/null
@@ -1,64 +0,0 @@
-from manticore.ethereum import ManticoreEVM, ABI
-from manticore.core.smtlib import Operators, Z3Solver
-from manticore.utils import config
-from manticore.core.plugin import Plugin
-
-m = ManticoreEVM()
-
-# Disable the gas tracking
-consts_evm = config.get_group("evm")
-consts_evm.oog = "ignore"
-
-# Increase the solver timeout
-config.get_group("smt").defaultunsat = False
-config.get_group("smt").timeout = 3600
-
-ETHER = 10 ** 18
-
-user = m.create_account(balance=1 * ETHER)
-
-# This plugin is used to speed up the exploration and skip the require(false) paths
-# It won't be needed once https://github.com/trailofbits/manticore/issues/1593 is added
-class SkipRequire(Plugin):
- def will_evm_execute_instruction_callback(self, state, instruction, arguments):
- world = state.platform
- if state.platform.current_transaction.sort != 'CREATE':
- if instruction.semantics == "JUMPI":
- potential_revert = world.current_vm.read_code(world.current_vm.pc + 4)
- if potential_revert[0].size == 8 and potential_revert[0].value == 0xfd:
- state.constrain(arguments[1] == True)
-
-
-print(f'controller: {hex(user.address)}')
-
-skipRequire = SkipRequire()
-m.register_plugin(skipRequire)
-
-TestBpool = m.solidity_create_contract('./manticore/contracts/TBPoolJoinExit.sol',
- contract_name='TestJoinExit',
- owner=user)
-
-print(f'TBPoolJoinExit deployed {hex(TestBpool.address)}')
-
-# Call joinAndExitPool with symbolic values
-poolAmountOut = m.make_symbolic_value()
-poolAmountIn = m.make_symbolic_value()
-poolTotal = m.make_symbolic_value()
-_records_t_balance = m.make_symbolic_value()
-TestBpool.joinAndExitPool(poolAmountOut, poolAmountIn, poolTotal, _records_t_balance)
-
-print(f'joinAndExitPool Called')
-
-for state in m.ready_states:
-
- m.generate_testcase(state, name="BugFound")
-
- # Look over the 10**i, and try to generate more free tokens
- for i in range(0, 18):
- print(i)
- add_value = 10**i
- condition = Operators.AND(poolAmountOut > poolAmountIn + add_value, poolAmountIn + add_value > poolAmountIn)
- m.generate_testcase(state, name=f"BugFound{add_value}", only_if=condition)
-
-print(f'Results are in {m.workspace}')
-
diff --git a/manticore/TBPoolJoinExitNoFee.py b/manticore/TBPoolJoinExitNoFee.py
deleted file mode 100644
index 4f049712..00000000
--- a/manticore/TBPoolJoinExitNoFee.py
+++ /dev/null
@@ -1,64 +0,0 @@
-from manticore.ethereum import ManticoreEVM, ABI
-from manticore.core.smtlib import Operators, Z3Solver
-from manticore.utils import config
-from manticore.core.plugin import Plugin
-
-m = ManticoreEVM()
-
-# Disable the gas tracking
-consts_evm = config.get_group("evm")
-consts_evm.oog = "ignore"
-
-# Increase the solver timeout
-config.get_group("smt").defaultunsat = False
-config.get_group("smt").timeout = 3600
-
-ETHER = 10 ** 18
-
-user = m.create_account(balance=1 * ETHER)
-
-# This plugin is used to speed up the exploration and skip the require(false) paths
-# It won't be needed once https://github.com/trailofbits/manticore/issues/1593 is added
-class SkipRequire(Plugin):
- def will_evm_execute_instruction_callback(self, state, instruction, arguments):
- world = state.platform
- if state.platform.current_transaction.sort != 'CREATE':
- if instruction.semantics == "JUMPI":
- potential_revert = world.current_vm.read_code(world.current_vm.pc + 4)
- if potential_revert[0].size == 8 and potential_revert[0].value == 0xfd:
- state.constrain(arguments[1] == True)
-
-
-print(f'controller: {hex(user.address)}')
-
-skipRequire = SkipRequire()
-m.register_plugin(skipRequire)
-
-TestBpool = m.solidity_create_contract('./manticore/contracts/TBPoolJoinExitNoFee.sol',
- contract_name='TBPoolJoinExitNoFee',
- owner=user)
-
-print(f'TestJoinExit deployed {hex(TestBpool.address)}')
-
-# Call joinAndExitNoFeePool with symbolic values
-poolAmountOut = m.make_symbolic_value()
-poolAmountIn = m.make_symbolic_value()
-poolTotal = m.make_symbolic_value()
-_records_t_balance = m.make_symbolic_value()
-TestBpool.joinAndExitNoFeePool(poolAmountOut, poolAmountIn, poolTotal, _records_t_balance)
-
-print(f'joinAndExitNoFeePool Called')
-
-for state in m.ready_states:
-
- m.generate_testcase(state, name="BugFound")
-
- # Look over the 10**i, and try to generate more free tokens
- for i in range(0, 18):
- print(i)
- add_value = 10**i
- condition = Operators.AND(poolAmountOut > poolAmountIn + add_value, poolAmountIn + add_value > poolAmountIn)
- m.generate_testcase(state, name=f"BugFound{add_value}", only_if=condition)
-
-print(f'Results are in {m.workspace}')
-
diff --git a/manticore/TBPoolJoinPool.py b/manticore/TBPoolJoinPool.py
deleted file mode 100644
index 09b16875..00000000
--- a/manticore/TBPoolJoinPool.py
+++ /dev/null
@@ -1,63 +0,0 @@
-from manticore.ethereum import ManticoreEVM, ABI
-from manticore.core.smtlib import Operators, Z3Solver
-from manticore.utils import config
-from manticore.core.plugin import Plugin
-
-m = ManticoreEVM()
-
-# Disable the gas tracking
-consts_evm = config.get_group("evm")
-consts_evm.oog = "ignore"
-
-# Increase the solver timeout
-config.get_group("smt").defaultunsat = False
-config.get_group("smt").timeout = 3600
-
-ETHER = 10 ** 18
-
-user = m.create_account(balance=1 * ETHER)
-
-# This plugin is used to speed up the exploration and skip the require(false) paths
-# It won't be needed once https://github.com/trailofbits/manticore/issues/1593 is added
-class SkipRequire(Plugin):
- def will_evm_execute_instruction_callback(self, state, instruction, arguments):
- world = state.platform
- if state.platform.current_transaction.sort != 'CREATE':
- if instruction.semantics == "JUMPI":
- potential_revert = world.current_vm.read_code(world.current_vm.pc + 4)
- if potential_revert[0].size == 8 and potential_revert[0].value == 0xfd:
- state.constrain(arguments[1] == True)
-
-
-print(f'controller: {hex(user.address)}')
-
-skipRequire = SkipRequire()
-m.register_plugin(skipRequire)
-
-TestBpool = m.solidity_create_contract('./manticore/contracts/TBPoolJoinPool.sol',
- contract_name='TBPoolJoinPool',
- owner=user)
-
-print(f'TBPoolJoinPool deployed {hex(TestBpool.address)}')
-
-# Call joinAndExitNoFeePool with symbolic values
-poolAmountOut = m.make_symbolic_value()
-poolTotal = m.make_symbolic_value()
-_records_t_balance = m.make_symbolic_value()
-TestBpool.joinPool(poolAmountOut, poolTotal, _records_t_balance)
-
-print(f'joinPool Called')
-
-for state in m.ready_states:
-
- m.generate_testcase(state, name="BugFound")
-
- # Look over the 10**i, and try to generate more free tokens
- for i in range(0, 18):
- print(i)
- add_value = 10**i
- condition = Operators.AND(poolAmountOut > poolAmountIn + add_value, poolAmountIn + add_value > poolAmountIn)
- m.generate_testcase(state, name=f"BugFound{add_value}", only_if=condition)
-
-print(f'Results are in {m.workspace}')
-
diff --git a/manticore/contracts/BNum.sol b/manticore/contracts/BNum.sol
deleted file mode 100644
index e6708bd3..00000000
--- a/manticore/contracts/BNum.sol
+++ /dev/null
@@ -1,88 +0,0 @@
-// This file is a flatenen verison of BNum
-// where require(cond, string) where replaced by require(cond)
-// To allow SkipRequire to work properly
-// It won't be needed once https://github.com/trailofbits/manticore/issues/1593 is added
-
-contract BConst {
- uint internal constant BONE = 10**18;
-
- uint internal constant MAX_BOUND_TOKENS = 8;
- uint internal constant BPOW_PRECISION = BONE / 10**10;
-
- uint internal constant MIN_FEE = BONE / 10**6;
- uint internal constant MAX_FEE = BONE / 10;
- uint internal constant EXIT_FEE = BONE / 10000;
-
- uint internal constant MIN_WEIGHT = BONE;
- uint internal constant MAX_WEIGHT = BONE * 50;
- uint internal constant MAX_TOTAL_WEIGHT = BONE * 50;
- uint internal constant MIN_BALANCE = BONE / 10**12;
- uint internal constant MAX_BALANCE = BONE * 10**12;
-
- uint internal constant MIN_POOL_SUPPLY = BONE;
-
- uint internal constant MIN_BPOW_BASE = 1 wei;
- uint internal constant MAX_BPOW_BASE = (2 * BONE) - 1 wei;
-
- uint internal constant MAX_IN_RATIO = BONE / 2;
- uint internal constant MAX_OUT_RATIO = (BONE / 3) + 1 wei;
-
-}
-contract BNum is BConst {
-
-
- function badd(uint a, uint b)
- internal pure
- returns (uint)
- {
- uint c = a + b;
- require(c >= a);
- return c;
- }
-
- function bsub(uint a, uint b)
- internal pure
- returns (uint)
- {
- (uint c, bool flag) = bsubSign(a, b);
- require(!flag);
- return c;
- }
-
- function bsubSign(uint a, uint b)
- internal pure
- returns (uint, bool)
- {
- if (a >= b) {
- return (a - b, false);
- } else {
- return (b - a, true);
- }
- }
-
- function bmul(uint a, uint b)
- internal pure
- returns (uint)
- {
- uint c0 = a * b;
- require(a == 0 || c0 / a == b);
- uint c1 = c0 + (BONE / 2);
- require(c1 >= c0);
- uint c2 = c1 / BONE;
- return c2;
- }
-
- function bdiv(uint a, uint b)
- internal pure
- returns (uint)
- {
- require(b != 0);
- uint c0 = a * BONE;
- require(a == 0 || c0 / a == BONE); // bmul overflow
- uint c1 = c0 + (b / 2);
- require(c1 >= c0); // badd require
- uint c2 = c1 / b;
- return c2;
- }
-
-}
\ No newline at end of file
diff --git a/manticore/contracts/TBPoolJoinExitPool.sol b/manticore/contracts/TBPoolJoinExitPool.sol
deleted file mode 100644
index 03487b51..00000000
--- a/manticore/contracts/TBPoolJoinExitPool.sol
+++ /dev/null
@@ -1,61 +0,0 @@
-import "./BNum.sol";
-
-// This test is similar to TBPoolJoin but with an exit fee
-contract TBPoolJoinExit is BNum {
-
- // joinPool models the BPool.joinPool behavior for one token
- function joinPool(uint poolAmountOut, uint poolTotal, uint _records_t_balance)
- internal pure returns(uint)
- {
- uint ratio = bdiv(poolAmountOut, poolTotal);
- require(ratio != 0);
-
- uint bal = _records_t_balance;
- uint tokenAmountIn = bmul(ratio, bal);
-
- return tokenAmountIn;
- }
-
- // exitPool models the BPool.exitPool behavior for one token
- function exitPool(uint poolAmountIn, uint poolTotal, uint _records_t_balance)
- internal pure returns(uint)
- {
- uint exitFee = bmul(poolAmountIn, EXIT_FEE);
- uint pAiAfterExitFee = bsub(poolAmountIn, exitFee);
- uint ratio = bdiv(pAiAfterExitFee, poolTotal);
- require(ratio != 0);
-
- uint bal = _records_t_balance;
- uint tokenAmountOut = bmul(ratio, bal);
-
- return tokenAmountOut;
- }
-
-
- // This function model an attacker calling joinPool - exitPool and taking advantage of potential rounding
- // issues to generate free pool token
- function joinAndExitPool(uint poolAmountOut, uint poolAmountIn, uint poolTotal, uint _records_t_balance) public pure {
- uint tokenAmountIn = joinPool(poolAmountOut, poolTotal, _records_t_balance);
-
- // We constraint poolTotal and _records_t_balance
- // To have "realistic" values
- require(poolTotal <= 100 ether);
- require(poolTotal >= 1 ether);
- require(_records_t_balance <= 10 ether);
- require(_records_t_balance >= 10**6);
-
- poolTotal = badd(poolTotal, poolAmountOut);
- _records_t_balance = badd(_records_t_balance, tokenAmountIn);
-
- require(tokenAmountIn > 0); // prevent triggering the free token generation from joinPool
-
- require(poolTotal >= poolAmountIn);
- uint tokenAmountOut = exitPool(poolAmountIn, poolTotal, _records_t_balance);
- require(_records_t_balance >= tokenAmountOut);
-
- // We try to generate free pool share
- require(poolAmountOut > poolAmountIn);
- require(tokenAmountOut == tokenAmountIn);
- }
-
-}
\ No newline at end of file
diff --git a/manticore/contracts/TBPoolJoinExitPoolNoFee.sol b/manticore/contracts/TBPoolJoinExitPoolNoFee.sol
deleted file mode 100644
index 703ca1d4..00000000
--- a/manticore/contracts/TBPoolJoinExitPoolNoFee.sol
+++ /dev/null
@@ -1,62 +0,0 @@
-import "./BNum.sol";
-
-// This test is similar to TBPoolJoinExit but with no exit fee
-contract TBPoolJoinExitNoFee is BNum {
-
- bool public echidna_no_bug_found = true;
-
- // joinPool models the BPool.joinPool behavior for one token
- function joinPool(uint poolAmountOut, uint poolTotal, uint _records_t_balance)
- internal pure returns(uint)
- {
- uint ratio = bdiv(poolAmountOut, poolTotal);
- require(ratio != 0);
-
- uint bal = _records_t_balance;
- uint tokenAmountIn = bmul(ratio, bal);
-
- return tokenAmountIn;
- }
-
- // exitPool models the BPool.exitPool behavior for one token where no fee is applied
- function exitPoolNoFee(uint poolAmountIn, uint poolTotal, uint _records_t_balance)
- internal pure returns(uint)
- {
- uint ratio = bdiv(poolAmountIn, poolTotal);
- require(ratio != 0);
-
- uint bal = _records_t_balance;
- uint tokenAmountOut = bmul(ratio, bal);
-
- return tokenAmountOut;
- }
-
- // This function model an attacker calling joinPool - exitPool and taking advantage of potential rounding
- // issues to generate free pool token
- function joinAndExitNoFeePool(uint poolAmountOut, uint poolAmountIn, uint poolTotal, uint _records_t_balance) public {
- uint tokenAmountIn = joinPool(poolAmountOut, poolTotal, _records_t_balance);
-
- // We constraint poolTotal and _records_t_balance
- // To have "realistic" values
- require(poolTotal <= 100 ether);
- require(poolTotal >= 1 ether);
- require(_records_t_balance <= 10 ether);
- require(_records_t_balance >= 10**6);
-
- poolTotal = badd(poolTotal, poolAmountOut);
- _records_t_balance = badd(_records_t_balance, tokenAmountIn);
-
- require(tokenAmountIn > 0); // prevent triggering the free token generation from joinPool
-
- require(poolTotal >= poolAmountIn);
- uint tokenAmountOut = exitPoolNoFee(poolAmountIn, poolTotal, _records_t_balance);
- require(_records_t_balance >= tokenAmountOut);
-
- // We try to generate free pool share
- require(poolAmountOut > poolAmountIn);
- require(tokenAmountOut == tokenAmountIn);
- echidna_no_bug_found = false;
- }
-
-
-}
\ No newline at end of file
diff --git a/manticore/contracts/TBPoolJoinPool.sol b/manticore/contracts/TBPoolJoinPool.sol
deleted file mode 100644
index 21441b0b..00000000
--- a/manticore/contracts/TBPoolJoinPool.sol
+++ /dev/null
@@ -1,32 +0,0 @@
-import "./BNum.sol";
-
-contract TBPoolJoinPool is BNum {
-
- bool public echidna_no_bug_found = true;
-
- // joinPool models the BPool.joinPool behavior for one token
- // A bug is found if poolAmountOut is greater than 0
- // And tokenAmountIn is 0
- function joinPool(uint poolAmountOut, uint poolTotal, uint _records_t_balance)
- public returns(uint)
- {
- // We constraint poolTotal and _records_t_balance
- // To have "realistic" values
- require(poolTotal <= 100 ether);
- require(poolTotal >= 1 ether);
- require(_records_t_balance <= 10 ether);
- require(_records_t_balance >= 10**6);
-
- uint ratio = bdiv(poolAmountOut, poolTotal);
- require(ratio != 0);
-
- uint bal = _records_t_balance;
- uint tokenAmountIn = bmul(ratio, bal);
-
- require(poolAmountOut > 0);
- require(tokenAmountIn == 0);
-
- echidna_no_bug_found = false;
- }
-
-}
\ No newline at end of file
diff --git a/migrations/1_initial_migration.js b/migrations/1_initial_migration.js
deleted file mode 100644
index 2404ddb3..00000000
--- a/migrations/1_initial_migration.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const Migrations = artifacts.require('Migrations');
-
-module.exports = function (deployer) {
- deployer.deploy(Migrations);
-};
diff --git a/migrations/2_deploy_factories.js b/migrations/2_deploy_factories.js
deleted file mode 100644
index 52df624b..00000000
--- a/migrations/2_deploy_factories.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const TMath = artifacts.require('TMath');
-const BToken = artifacts.require('BToken');
-const BFactory = artifacts.require('BFactory');
-
-module.exports = async function (deployer, network, accounts) {
- if (network === 'development' || network === 'coverage') {
- deployer.deploy(TMath);
- }
- deployer.deploy(BFactory);
-};
diff --git a/natspec-smells.config.js b/natspec-smells.config.js
new file mode 100644
index 00000000..458623a3
--- /dev/null
+++ b/natspec-smells.config.js
@@ -0,0 +1,8 @@
+/**
+ * List of supported options: https://github.com/defi-wonderland/natspec-smells?tab=readme-ov-file#options
+ */
+
+/** @type {import('@defi-wonderland/natspec-smells').Config} */
+module.exports = {
+ include: 'src'
+};
diff --git a/package.json b/package.json
index f976e461..bebb3a85 100644
--- a/package.json
+++ b/package.json
@@ -1,46 +1,54 @@
{
- "private": true,
- "name": "balancer-core",
- "version": "0.0.7",
- "license": "GPL-3.0-only",
- "description": "Balancer Core Contracts and ABI",
- "scripts": {
- "compile": "truffle compile",
- "testrpc": "ganache-cli --deterministic --gasLimit 10000000",
- "test": "truffle test",
- "test:verbose": "VERBOSE=true truffle test",
- "coverage": "yarn solidity-coverage",
- "lint": "eslint .",
- "lint:contracts": "solhint contracts/*.sol"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/balancer-labs/balancer-core.git"
- },
- "bugs": {
- "url": "https://github.com/balancer-labs/balancer-core/issues"
- },
- "homepage": "https://github.com/balancer-labs/balancer-core#readme",
- "devDependencies": {
- "chai": "^4.2.0",
- "coveralls": "^3.0.8",
- "eslint": "^6.7.1",
- "eslint-config-airbnb": "^18.0.1",
- "eslint-plugin-import": "^2.18.2",
- "eslint-plugin-jsx-a11y": "^6.2.3",
- "eslint-plugin-react": "^7.17.0",
- "ganache-core": "^2.6.1",
- "mocha": "^6.2.0",
- "solhint": "^2.3.0",
- "solidity-coverage": "^0.6.7",
- "standard": "^14.0.2",
- "truffle": "^5.0.41",
- "truffle-assertions": "^0.9.1",
- "web3": "^1.2.0"
- },
- "dependencies": {
- "decimal.js": "^10.2.0",
- "ganache-cli": "^6.7.0",
- "global": "^4.4.0"
- }
-}
+ "name": "balancer-core",
+ "version": "0.0.7",
+ "private": true,
+ "description": "Balancer Core Contracts and ABI",
+ "homepage": "https://github.com/balancer-labs/balancer-core#readme",
+ "bugs": {
+ "url": "https://github.com/balancer-labs/balancer-core/issues"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/balancer-labs/balancer-core.git"
+ },
+ "license": "GPL-3.0-only",
+ "scripts": {
+ "build": "forge build",
+ "build:optimized": "FOUNDRY_PROFILE=optimized forge build",
+ "coverage": "forge coverage --match-contract Unit",
+ "deploy:mainnet": "bash -c 'source .env && forge script Deploy -vvvvv --rpc-url $MAINNET_RPC --broadcast --chain mainnet --private-key $MAINNET_DEPLOYER_PK --verify --etherscan-api-key $ETHERSCAN_API_KEY'",
+ "deploy:testnet": "bash -c 'source .env && forge script Deploy -vvvvv --rpc-url $SEPOLIA_RPC --broadcast --chain sepolia --private-key $SEPOLIA_DEPLOYER_PK --verify --etherscan-api-key $ETHERSCAN_API_KEY'",
+ "lint:check": "yarn lint:sol-tests && yarn lint:sol-logic && forge fmt --check",
+ "lint:fix": "sort-package-json && forge fmt && yarn lint:sol-tests --fix && yarn lint:sol-logic --fix",
+ "lint:natspec": "npx @defi-wonderland/natspec-smells --config natspec-smells.config.js",
+ "lint:sol-logic": "solhint -c .solhint.json 'src/**/*.sol' 'script/**/*.sol'",
+ "lint:sol-tests": "solhint -c .solhint.tests.json 'test/**/*.sol'",
+ "prepare": "husky install",
+ "smock": "smock-foundry --contracts src/contracts",
+ "test": "forge test -vvv",
+ "test:integration": "forge test --match-contract Integration -vvv",
+ "test:unit": "forge test --match-contract Unit -vvv",
+ "test:unit:deep": "FOUNDRY_FUZZ_RUNS=5000 yarn test:unit"
+ },
+ "lint-staged": {
+ "*.{js,css,md,ts,sol}": "forge fmt",
+ "(src|script)/**/*.sol": "yarn lint:sol-logic",
+ "test/**/*.sol": "yarn lint:sol-tests",
+ "package.json": "sort-package-json"
+ },
+ "dependencies": {
+ "solmate": "github:transmissions11/solmate#c892309"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "19.3.0",
+ "@commitlint/config-conventional": "19.2.2",
+ "@defi-wonderland/natspec-smells": "1.1.1",
+ "@defi-wonderland/smock-foundry": "1.5.0",
+ "forge-gas-snapshot": "github:marktoda/forge-gas-snapshot#9161f7c",
+ "forge-std": "github:foundry-rs/forge-std#5475f85",
+ "husky": ">=8",
+ "lint-staged": ">=10",
+ "solhint": "github:solhint-community/solhint-community#v4.0.0-rc01",
+ "sort-package-json": "2.10.0"
+ }
+}
\ No newline at end of file
diff --git a/remappings.txt b/remappings.txt
new file mode 100644
index 00000000..7f4bc0f8
--- /dev/null
+++ b/remappings.txt
@@ -0,0 +1,6 @@
+ds-test/=node_modules/ds-test/src
+forge-std/=node_modules/forge-std/src
+forge-gas-snapshot/=node_modules/forge-gas-snapshot/src
+solmate/=node_modules/solmate/src
+
+contracts/=src/contracts
\ No newline at end of file
diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol
new file mode 100644
index 00000000..33bf6eaf
--- /dev/null
+++ b/script/Deploy.s.sol
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.23;
+
+import {BFactory} from 'contracts/BFactory.sol';
+import {Params} from 'script/Params.s.sol';
+
+import {Script} from 'forge-std/Script.sol';
+
+contract Deploy is Script, Params {
+ function run() public {
+ DeploymentParams memory _params = _deploymentParams[block.chainid];
+
+ vm.startBroadcast();
+ BFactory bFactory = new BFactory();
+ bFactory.setBLabs(_params.bLabs);
+ vm.stopBroadcast();
+ }
+}
diff --git a/script/Params.s.sol b/script/Params.s.sol
new file mode 100644
index 00000000..c943cf24
--- /dev/null
+++ b/script/Params.s.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.23;
+
+contract Params {
+ struct DeploymentParams {
+ address bLabs;
+ }
+
+ /// @notice Deployment parameters for each chain
+ mapping(uint256 _chainId => DeploymentParams _params) internal _deploymentParams;
+
+ constructor() {
+ // Mainnet
+ _deploymentParams[1] = DeploymentParams(address(this));
+
+ // Sepolia
+ _deploymentParams[11_155_111] = DeploymentParams(address(this));
+ }
+}
diff --git a/src/contracts/BColor.sol b/src/contracts/BColor.sol
new file mode 100644
index 00000000..57d4c0e1
--- /dev/null
+++ b/src/contracts/BColor.sol
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity 0.8.23;
+
+abstract contract BColor {
+ function getColor() external view virtual returns (bytes32);
+}
+
+contract BBronze is BColor {
+ function getColor() external pure override returns (bytes32) {
+ return bytes32('BRONZE');
+ }
+}
diff --git a/src/contracts/BConst.sol b/src/contracts/BConst.sol
new file mode 100644
index 00000000..ade59b97
--- /dev/null
+++ b/src/contracts/BConst.sol
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity 0.8.23;
+
+import {BBronze} from './BColor.sol';
+
+contract BConst is BBronze {
+ uint256 public constant BONE = 10 ** 18;
+
+ uint256 public constant MIN_BOUND_TOKENS = 2;
+ uint256 public constant MAX_BOUND_TOKENS = 8;
+
+ uint256 public constant MIN_FEE = BONE / 10 ** 6;
+ uint256 public constant MAX_FEE = BONE / 10;
+ uint256 public constant EXIT_FEE = 0;
+
+ uint256 public constant MIN_WEIGHT = BONE;
+ uint256 public constant MAX_WEIGHT = BONE * 50;
+ uint256 public constant MAX_TOTAL_WEIGHT = BONE * 50;
+ uint256 public constant MIN_BALANCE = BONE / 10 ** 12;
+
+ uint256 public constant INIT_POOL_SUPPLY = BONE * 100;
+
+ uint256 public constant MIN_BPOW_BASE = 1 wei;
+ uint256 public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei;
+ uint256 public constant BPOW_PRECISION = BONE / 10 ** 10;
+
+ uint256 public constant MAX_IN_RATIO = BONE / 2;
+ uint256 public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei;
+}
diff --git a/src/contracts/BFactory.sol b/src/contracts/BFactory.sol
new file mode 100644
index 00000000..a601b3ed
--- /dev/null
+++ b/src/contracts/BFactory.sol
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity 0.8.23;
+
+// Builds new BPools, logging their addresses and providing `isBPool(address) -> (bool)`
+
+import {BBronze} from './BColor.sol';
+import {BPool} from './BPool.sol';
+import {IERC20} from './BToken.sol';
+
+contract BFactory is BBronze {
+ mapping(address => bool) internal _isBPool;
+ address internal _blabs;
+
+ event LOG_NEW_POOL(address indexed caller, address indexed pool);
+
+ event LOG_BLABS(address indexed caller, address indexed blabs);
+
+ constructor() {
+ _blabs = msg.sender;
+ }
+
+ function newBPool() external returns (BPool) {
+ BPool bpool = new BPool();
+ _isBPool[address(bpool)] = true;
+ emit LOG_NEW_POOL(msg.sender, address(bpool));
+ bpool.setController(msg.sender);
+ return bpool;
+ }
+
+ function setBLabs(address b) external {
+ require(msg.sender == _blabs, 'ERR_NOT_BLABS');
+ emit LOG_BLABS(msg.sender, b);
+ _blabs = b;
+ }
+
+ function collect(BPool pool) external {
+ require(msg.sender == _blabs, 'ERR_NOT_BLABS');
+ uint256 collected = IERC20(pool).balanceOf(address(this));
+ bool xfer = pool.transfer(_blabs, collected);
+ require(xfer, 'ERR_ERC20_FAILED');
+ }
+
+ function isBPool(address b) external view returns (bool) {
+ return _isBPool[b];
+ }
+
+ function getBLabs() external view returns (address) {
+ return _blabs;
+ }
+}
diff --git a/src/contracts/BMath.sol b/src/contracts/BMath.sol
new file mode 100644
index 00000000..b8ec5b63
--- /dev/null
+++ b/src/contracts/BMath.sol
@@ -0,0 +1,251 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity 0.8.23;
+
+import {BBronze} from './BColor.sol';
+import {BConst} from './BConst.sol';
+import {BNum} from './BNum.sol';
+
+contract BMath is BBronze, BConst, BNum {
+ /**
+ *
+ * calcSpotPrice
+ * sP = spotPrice
+ * bI = tokenBalanceIn ( bI / wI ) 1
+ * bO = tokenBalanceOut sP = ----------- * ----------
+ * wI = tokenWeightIn ( bO / wO ) ( 1 - sF )
+ * wO = tokenWeightOut
+ * sF = swapFee
+ *
+ */
+ function calcSpotPrice(
+ uint256 tokenBalanceIn,
+ uint256 tokenWeightIn,
+ uint256 tokenBalanceOut,
+ uint256 tokenWeightOut,
+ uint256 swapFee
+ ) public pure returns (uint256 spotPrice) {
+ uint256 numer = bdiv(tokenBalanceIn, tokenWeightIn);
+ uint256 denom = bdiv(tokenBalanceOut, tokenWeightOut);
+ uint256 ratio = bdiv(numer, denom);
+ uint256 scale = bdiv(BONE, bsub(BONE, swapFee));
+ return (spotPrice = bmul(ratio, scale));
+ }
+
+ /**
+ *
+ * calcOutGivenIn
+ * aO = tokenAmountOut
+ * bO = tokenBalanceOut
+ * bI = tokenBalanceIn / / bI \ (wI / wO) \
+ * aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ |
+ * wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / /
+ * wO = tokenWeightOut
+ * sF = swapFee
+ *
+ */
+ function calcOutGivenIn(
+ uint256 tokenBalanceIn,
+ uint256 tokenWeightIn,
+ uint256 tokenBalanceOut,
+ uint256 tokenWeightOut,
+ uint256 tokenAmountIn,
+ uint256 swapFee
+ ) public pure returns (uint256 tokenAmountOut) {
+ uint256 weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
+ uint256 adjustedIn = bsub(BONE, swapFee);
+ adjustedIn = bmul(tokenAmountIn, adjustedIn);
+ uint256 y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
+ uint256 foo = bpow(y, weightRatio);
+ uint256 bar = bsub(BONE, foo);
+ tokenAmountOut = bmul(tokenBalanceOut, bar);
+ return tokenAmountOut;
+ }
+
+ /**
+ *
+ * calcInGivenOut
+ * aI = tokenAmountIn
+ * bO = tokenBalanceOut / / bO \ (wO / wI) \
+ * bI = tokenBalanceIn bI * | | ------------ | ^ - 1 |
+ * aO = tokenAmountOut aI = \ \ ( bO - aO ) / /
+ * wI = tokenWeightIn --------------------------------------------
+ * wO = tokenWeightOut ( 1 - sF )
+ * sF = swapFee
+ *
+ */
+ function calcInGivenOut(
+ uint256 tokenBalanceIn,
+ uint256 tokenWeightIn,
+ uint256 tokenBalanceOut,
+ uint256 tokenWeightOut,
+ uint256 tokenAmountOut,
+ uint256 swapFee
+ ) public pure returns (uint256 tokenAmountIn) {
+ uint256 weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
+ uint256 diff = bsub(tokenBalanceOut, tokenAmountOut);
+ uint256 y = bdiv(tokenBalanceOut, diff);
+ uint256 foo = bpow(y, weightRatio);
+ foo = bsub(foo, BONE);
+ tokenAmountIn = bsub(BONE, swapFee);
+ tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn);
+ return tokenAmountIn;
+ }
+
+ /**
+ *
+ * calcPoolOutGivenSingleIn
+ * pAo = poolAmountOut / \
+ * tAi = tokenAmountIn /// / // wI \ \\ \ wI \
+ * wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \
+ * tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS
+ * tBi = tokenBalanceIn \\ ------------------------------------- / /
+ * pS = poolSupply \\ tBi / /
+ * sF = swapFee \ /
+ *
+ */
+ function calcPoolOutGivenSingleIn(
+ uint256 tokenBalanceIn,
+ uint256 tokenWeightIn,
+ uint256 poolSupply,
+ uint256 totalWeight,
+ uint256 tokenAmountIn,
+ uint256 swapFee
+ ) public pure returns (uint256 poolAmountOut) {
+ // Charge the trading fee for the proportion of tokenAi
+ /// which is implicitly traded to the other pool tokens.
+ // That proportion is (1- weightTokenIn)
+ // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
+ uint256 normalizedWeight = bdiv(tokenWeightIn, totalWeight);
+ uint256 zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
+ uint256 tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz));
+
+ uint256 newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee);
+ uint256 tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn);
+
+ // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
+ uint256 poolRatio = bpow(tokenInRatio, normalizedWeight);
+ uint256 newPoolSupply = bmul(poolRatio, poolSupply);
+ poolAmountOut = bsub(newPoolSupply, poolSupply);
+ return poolAmountOut;
+ }
+
+ /**
+ *
+ * calcSingleInGivenPoolOut
+ * tAi = tokenAmountIn //(pS + pAo)\ / 1 \\
+ * pS = poolSupply || --------- | ^ | --------- || * bI - bI
+ * pAo = poolAmountOut \\ pS / \(wI / tW)//
+ * bI = balanceIn tAi = --------------------------------------------
+ * wI = weightIn / wI \
+ * tW = totalWeight | 1 - ---- | * sF
+ * sF = swapFee \ tW /
+ *
+ */
+ function calcSingleInGivenPoolOut(
+ uint256 tokenBalanceIn,
+ uint256 tokenWeightIn,
+ uint256 poolSupply,
+ uint256 totalWeight,
+ uint256 poolAmountOut,
+ uint256 swapFee
+ ) public pure returns (uint256 tokenAmountIn) {
+ uint256 normalizedWeight = bdiv(tokenWeightIn, totalWeight);
+ uint256 newPoolSupply = badd(poolSupply, poolAmountOut);
+ uint256 poolRatio = bdiv(newPoolSupply, poolSupply);
+
+ //uint newBalTi = poolRatio^(1/weightTi) * balTi;
+ uint256 boo = bdiv(BONE, normalizedWeight);
+ uint256 tokenInRatio = bpow(poolRatio, boo);
+ uint256 newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn);
+ uint256 tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn);
+ // Do reverse order of fees charged in joinswap_ExternAmountIn, this way
+ // ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ```
+ //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ;
+ uint256 zar = bmul(bsub(BONE, normalizedWeight), swapFee);
+ tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar));
+ return tokenAmountIn;
+ }
+
+ /**
+ *
+ * calcSingleOutGivenPoolIn
+ * tAo = tokenAmountOut / / \\
+ * bO = tokenBalanceOut / // pS - (pAi * (1 - eF)) \ / 1 \ \\
+ * pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 ||
+ * ps = poolSupply \ \\ pS / \(wO / tW)/ //
+ * wI = tokenWeightIn tAo = \ \ //
+ * tW = totalWeight / / wO \ \
+ * sF = swapFee * | 1 - | 1 - ---- | * sF |
+ * eF = exitFee \ \ tW / /
+ *
+ */
+ function calcSingleOutGivenPoolIn(
+ uint256 tokenBalanceOut,
+ uint256 tokenWeightOut,
+ uint256 poolSupply,
+ uint256 totalWeight,
+ uint256 poolAmountIn,
+ uint256 swapFee
+ ) public pure returns (uint256 tokenAmountOut) {
+ uint256 normalizedWeight = bdiv(tokenWeightOut, totalWeight);
+ // charge exit fee on the pool token side
+ // pAiAfterExitFee = pAi*(1-exitFee)
+ uint256 poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE));
+ uint256 newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
+ uint256 poolRatio = bdiv(newPoolSupply, poolSupply);
+
+ // newBalTo = poolRatio^(1/weightTo) * balTo;
+ uint256 tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight));
+ uint256 newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut);
+
+ uint256 tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut);
+
+ // charge swap fee on the output token side
+ //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
+ uint256 zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
+ tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz));
+ return tokenAmountOut;
+ }
+
+ /**
+ *
+ * calcPoolInGivenSingleOut
+ * pAi = poolAmountIn // / tAo \\ / wO \ \
+ * bO = tokenBalanceOut // | bO - -------------------------- |\ | ---- | \
+ * tAo = tokenAmountOut pS - || \ 1 - ((1 - (tO / tW)) * sF)/ | ^ \ tW / * pS |
+ * ps = poolSupply \\ -----------------------------------/ /
+ * wO = tokenWeightOut pAi = \\ bO / /
+ * tW = totalWeight -------------------------------------------------------------
+ * sF = swapFee ( 1 - eF )
+ * eF = exitFee
+ *
+ */
+ function calcPoolInGivenSingleOut(
+ uint256 tokenBalanceOut,
+ uint256 tokenWeightOut,
+ uint256 poolSupply,
+ uint256 totalWeight,
+ uint256 tokenAmountOut,
+ uint256 swapFee
+ ) public pure returns (uint256 poolAmountIn) {
+ // charge swap fee on the output token side
+ uint256 normalizedWeight = bdiv(tokenWeightOut, totalWeight);
+ //uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ;
+ uint256 zoo = bsub(BONE, normalizedWeight);
+ uint256 zar = bmul(zoo, swapFee);
+ uint256 tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar));
+
+ uint256 newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee);
+ uint256 tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut);
+
+ //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply;
+ uint256 poolRatio = bpow(tokenOutRatio, normalizedWeight);
+ uint256 newPoolSupply = bmul(poolRatio, poolSupply);
+ uint256 poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply);
+
+ // charge exit fee on the pool token side
+ // pAi = pAiAfterExitFee/(1-exitFee)
+ poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE));
+ return poolAmountIn;
+ }
+}
diff --git a/src/contracts/BNum.sol b/src/contracts/BNum.sol
new file mode 100644
index 00000000..b2cfe6fd
--- /dev/null
+++ b/src/contracts/BNum.sol
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity 0.8.23;
+
+import {BConst} from './BConst.sol';
+
+// solhint-disable private-vars-leading-underscore
+// solhint-disable named-return-values
+contract BNum is BConst {
+ function btoi(uint256 a) internal pure returns (uint256) {
+ unchecked {
+ return a / BONE;
+ }
+ }
+
+ function bfloor(uint256 a) internal pure returns (uint256) {
+ unchecked {
+ return btoi(a) * BONE;
+ }
+ }
+
+ function badd(uint256 a, uint256 b) internal pure returns (uint256) {
+ unchecked {
+ uint256 c = a + b;
+ require(c >= a, 'ERR_ADD_OVERFLOW');
+ return c;
+ }
+ }
+
+ function bsub(uint256 a, uint256 b) internal pure returns (uint256) {
+ unchecked {
+ (uint256 c, bool flag) = bsubSign(a, b);
+ require(!flag, 'ERR_SUB_UNDERFLOW');
+ return c;
+ }
+ }
+
+ function bsubSign(uint256 a, uint256 b) internal pure returns (uint256, bool) {
+ unchecked {
+ if (a >= b) {
+ return (a - b, false);
+ } else {
+ return (b - a, true);
+ }
+ }
+ }
+
+ function bmul(uint256 a, uint256 b) internal pure returns (uint256) {
+ unchecked {
+ uint256 c0 = a * b;
+ require(a == 0 || c0 / a == b, 'ERR_MUL_OVERFLOW');
+ uint256 c1 = c0 + (BONE / 2);
+ require(c1 >= c0, 'ERR_MUL_OVERFLOW');
+ uint256 c2 = c1 / BONE;
+ return c2;
+ }
+ }
+
+ function bdiv(uint256 a, uint256 b) internal pure returns (uint256) {
+ unchecked {
+ require(b != 0, 'ERR_DIV_ZERO');
+ uint256 c0 = a * BONE;
+ require(a == 0 || c0 / a == BONE, 'ERR_DIV_INTERNAL'); // bmul overflow
+ uint256 c1 = c0 + (b / 2);
+ require(c1 >= c0, 'ERR_DIV_INTERNAL'); // badd require
+ uint256 c2 = c1 / b;
+ return c2;
+ }
+ }
+
+ // DSMath.wpow
+ function bpowi(uint256 a, uint256 n) internal pure returns (uint256) {
+ unchecked {
+ uint256 z = n % 2 != 0 ? a : BONE;
+
+ for (n /= 2; n != 0; n /= 2) {
+ a = bmul(a, a);
+
+ if (n % 2 != 0) {
+ z = bmul(z, a);
+ }
+ }
+ return z;
+ }
+ }
+
+ // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
+ // Use `bpowi` for `b^e` and `bpowK` for k iterations
+ // of approximation of b^0.w
+ function bpow(uint256 base, uint256 exp) internal pure returns (uint256) {
+ unchecked {
+ require(base >= MIN_BPOW_BASE, 'ERR_BPOW_BASE_TOO_LOW');
+ require(base <= MAX_BPOW_BASE, 'ERR_BPOW_BASE_TOO_HIGH');
+
+ uint256 whole = bfloor(exp);
+ uint256 remain = bsub(exp, whole);
+
+ uint256 wholePow = bpowi(base, btoi(whole));
+
+ if (remain == 0) {
+ return wholePow;
+ }
+
+ uint256 partialResult = bpowApprox(base, remain, BPOW_PRECISION);
+ return bmul(wholePow, partialResult);
+ }
+ }
+
+ function bpowApprox(uint256 base, uint256 exp, uint256 precision) internal pure returns (uint256) {
+ unchecked {
+ // term 0:
+ uint256 a = exp;
+ (uint256 x, bool xneg) = bsubSign(base, BONE);
+ uint256 term = BONE;
+ uint256 sum = term;
+ bool negative = false;
+
+ // term(k) = numer / denom
+ // = (product(a - i - 1, i=1-->k) * x^k) / (k!)
+ // each iteration, multiply previous term by (a-(k-1)) * x / k
+ // continue until term is less than precision
+ for (uint256 i = 1; term >= precision; i++) {
+ uint256 bigK = i * BONE;
+ (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
+ term = bmul(term, bmul(c, x));
+ term = bdiv(term, bigK);
+ if (term == 0) break;
+
+ if (xneg) negative = !negative;
+ if (cneg) negative = !negative;
+ if (negative) {
+ sum = bsub(sum, term);
+ } else {
+ sum = badd(sum, term);
+ }
+ }
+
+ return sum;
+ }
+ }
+}
diff --git a/src/contracts/BPool.sol b/src/contracts/BPool.sol
new file mode 100644
index 00000000..deddf2a2
--- /dev/null
+++ b/src/contracts/BPool.sol
@@ -0,0 +1,526 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity 0.8.23;
+
+import {BBronze} from './BColor.sol';
+import {BMath} from './BMath.sol';
+import {BToken, IERC20} from './BToken.sol';
+
+contract BPool is BBronze, BToken, BMath {
+ struct Record {
+ bool bound; // is token bound to pool
+ uint256 index; // internal
+ uint256 denorm; // denormalized weight
+ uint256 balance;
+ }
+
+ bool internal _mutex;
+
+ address internal _factory; // BFactory address to push token exitFee to
+ address internal _controller; // has CONTROL role
+ bool internal _publicSwap; // true if PUBLIC can call SWAP functions
+
+ // `setSwapFee` and `finalize` require CONTROL
+ // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
+ uint256 internal _swapFee;
+ bool internal _finalized;
+
+ address[] internal _tokens;
+ mapping(address => Record) internal _records;
+ uint256 internal _totalWeight;
+
+ event LOG_SWAP(
+ address indexed caller,
+ address indexed tokenIn,
+ address indexed tokenOut,
+ uint256 tokenAmountIn,
+ uint256 tokenAmountOut
+ );
+
+ event LOG_JOIN(address indexed caller, address indexed tokenIn, uint256 tokenAmountIn);
+
+ event LOG_EXIT(address indexed caller, address indexed tokenOut, uint256 tokenAmountOut);
+
+ event LOG_CALL(bytes4 indexed sig, address indexed caller, bytes data) anonymous;
+
+ constructor() {
+ _controller = msg.sender;
+ _factory = msg.sender;
+ _swapFee = MIN_FEE;
+ _publicSwap = false;
+ _finalized = false;
+ }
+
+ function setSwapFee(uint256 swapFee) external _logs_ _lock_ {
+ require(!_finalized, 'ERR_IS_FINALIZED');
+ require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
+ require(swapFee >= MIN_FEE, 'ERR_MIN_FEE');
+ require(swapFee <= MAX_FEE, 'ERR_MAX_FEE');
+ _swapFee = swapFee;
+ }
+
+ function setController(address manager) external _logs_ _lock_ {
+ require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
+ _controller = manager;
+ }
+
+ function setPublicSwap(bool public_) external _logs_ _lock_ {
+ require(!_finalized, 'ERR_IS_FINALIZED');
+ require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
+ _publicSwap = public_;
+ }
+
+ function finalize() external _logs_ _lock_ {
+ require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
+ require(!_finalized, 'ERR_IS_FINALIZED');
+ require(_tokens.length >= MIN_BOUND_TOKENS, 'ERR_MIN_TOKENS');
+
+ _finalized = true;
+ _publicSwap = true;
+
+ _mintPoolShare(INIT_POOL_SUPPLY);
+ _pushPoolShare(msg.sender, INIT_POOL_SUPPLY);
+ }
+
+ function bind(address token, uint256 balance, uint256 denorm) external _logs_
+ // _lock_ Bind does not lock because it jumps to `rebind`, which does
+ {
+ require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
+ require(!_records[token].bound, 'ERR_IS_BOUND');
+ require(!_finalized, 'ERR_IS_FINALIZED');
+
+ require(_tokens.length < MAX_BOUND_TOKENS, 'ERR_MAX_TOKENS');
+
+ _records[token] = Record({
+ bound: true,
+ index: _tokens.length,
+ denorm: 0, // balance and denorm will be validated
+ balance: 0 // and set by `rebind`
+ });
+ _tokens.push(token);
+ rebind(token, balance, denorm);
+ }
+
+ function rebind(address token, uint256 balance, uint256 denorm) public _logs_ _lock_ {
+ require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
+ require(_records[token].bound, 'ERR_NOT_BOUND');
+ require(!_finalized, 'ERR_IS_FINALIZED');
+
+ require(denorm >= MIN_WEIGHT, 'ERR_MIN_WEIGHT');
+ require(denorm <= MAX_WEIGHT, 'ERR_MAX_WEIGHT');
+ require(balance >= MIN_BALANCE, 'ERR_MIN_BALANCE');
+
+ // Adjust the denorm and totalWeight
+ uint256 oldWeight = _records[token].denorm;
+ if (denorm > oldWeight) {
+ _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight));
+ require(_totalWeight <= MAX_TOTAL_WEIGHT, 'ERR_MAX_TOTAL_WEIGHT');
+ } else if (denorm < oldWeight) {
+ _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm));
+ }
+ _records[token].denorm = denorm;
+
+ // Adjust the balance record and actual token balance
+ uint256 oldBalance = _records[token].balance;
+ _records[token].balance = balance;
+ if (balance > oldBalance) {
+ _pullUnderlying(token, msg.sender, bsub(balance, oldBalance));
+ } else if (balance < oldBalance) {
+ // In this case liquidity is being withdrawn, so charge EXIT_FEE
+ uint256 tokenBalanceWithdrawn = bsub(oldBalance, balance);
+ uint256 tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE);
+ _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee));
+ _pushUnderlying(token, _factory, tokenExitFee);
+ }
+ }
+
+ // solhint-disable-next-line ordering
+ function unbind(address token) external _logs_ _lock_ {
+ require(msg.sender == _controller, 'ERR_NOT_CONTROLLER');
+ require(_records[token].bound, 'ERR_NOT_BOUND');
+ require(!_finalized, 'ERR_IS_FINALIZED');
+
+ uint256 tokenBalance = _records[token].balance;
+ uint256 tokenExitFee = bmul(tokenBalance, EXIT_FEE);
+
+ _totalWeight = bsub(_totalWeight, _records[token].denorm);
+
+ // Swap the token-to-unbind with the last token,
+ // then delete the last token
+ uint256 index = _records[token].index;
+ uint256 last = _tokens.length - 1;
+ _tokens[index] = _tokens[last];
+ _records[_tokens[index]].index = index;
+ _tokens.pop();
+ _records[token] = Record({bound: false, index: 0, denorm: 0, balance: 0});
+
+ _pushUnderlying(token, msg.sender, bsub(tokenBalance, tokenExitFee));
+ _pushUnderlying(token, _factory, tokenExitFee);
+ }
+
+ // Absorb any tokens that have been sent to this contract into the pool
+ function gulp(address token) external _logs_ _lock_ {
+ require(_records[token].bound, 'ERR_NOT_BOUND');
+ _records[token].balance = IERC20(token).balanceOf(address(this));
+ }
+
+ function getSpotPrice(address tokenIn, address tokenOut) external view _viewlock_ returns (uint256 spotPrice) {
+ require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
+ require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
+ Record storage inRecord = _records[tokenIn];
+ Record storage outRecord = _records[tokenOut];
+ return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
+ }
+
+ function getSpotPriceSansFee(address tokenIn, address tokenOut) external view _viewlock_ returns (uint256 spotPrice) {
+ require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
+ require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
+ Record storage inRecord = _records[tokenIn];
+ Record storage outRecord = _records[tokenOut];
+ return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0);
+ }
+
+ function joinPool(uint256 poolAmountOut, uint256[] calldata maxAmountsIn) external _logs_ _lock_ {
+ require(_finalized, 'ERR_NOT_FINALIZED');
+
+ uint256 poolTotal = totalSupply();
+ uint256 ratio = bdiv(poolAmountOut, poolTotal);
+ require(ratio != 0, 'ERR_MATH_APPROX');
+
+ for (uint256 i = 0; i < _tokens.length; i++) {
+ address t = _tokens[i];
+ uint256 bal = _records[t].balance;
+ uint256 tokenAmountIn = bmul(ratio, bal);
+ require(tokenAmountIn != 0, 'ERR_MATH_APPROX');
+ require(tokenAmountIn <= maxAmountsIn[i], 'ERR_LIMIT_IN');
+ _records[t].balance = badd(_records[t].balance, tokenAmountIn);
+ emit LOG_JOIN(msg.sender, t, tokenAmountIn);
+ _pullUnderlying(t, msg.sender, tokenAmountIn);
+ }
+ _mintPoolShare(poolAmountOut);
+ _pushPoolShare(msg.sender, poolAmountOut);
+ }
+
+ function exitPool(uint256 poolAmountIn, uint256[] calldata minAmountsOut) external _logs_ _lock_ {
+ require(_finalized, 'ERR_NOT_FINALIZED');
+
+ uint256 poolTotal = totalSupply();
+ uint256 exitFee = bmul(poolAmountIn, EXIT_FEE);
+ uint256 pAiAfterExitFee = bsub(poolAmountIn, exitFee);
+ uint256 ratio = bdiv(pAiAfterExitFee, poolTotal);
+ require(ratio != 0, 'ERR_MATH_APPROX');
+
+ _pullPoolShare(msg.sender, poolAmountIn);
+ _pushPoolShare(_factory, exitFee);
+ _burnPoolShare(pAiAfterExitFee);
+
+ for (uint256 i = 0; i < _tokens.length; i++) {
+ address t = _tokens[i];
+ uint256 bal = _records[t].balance;
+ uint256 tokenAmountOut = bmul(ratio, bal);
+ require(tokenAmountOut != 0, 'ERR_MATH_APPROX');
+ require(tokenAmountOut >= minAmountsOut[i], 'ERR_LIMIT_OUT');
+ _records[t].balance = bsub(_records[t].balance, tokenAmountOut);
+ emit LOG_EXIT(msg.sender, t, tokenAmountOut);
+ _pushUnderlying(t, msg.sender, tokenAmountOut);
+ }
+ }
+
+ function swapExactAmountIn(
+ address tokenIn,
+ uint256 tokenAmountIn,
+ address tokenOut,
+ uint256 minAmountOut,
+ uint256 maxPrice
+ ) external _logs_ _lock_ returns (uint256 tokenAmountOut, uint256 spotPriceAfter) {
+ require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
+ require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
+ require(_publicSwap, 'ERR_SWAP_NOT_PUBLIC');
+
+ Record storage inRecord = _records[address(tokenIn)];
+ Record storage outRecord = _records[address(tokenOut)];
+
+ require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO), 'ERR_MAX_IN_RATIO');
+
+ uint256 spotPriceBefore =
+ calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
+ require(spotPriceBefore <= maxPrice, 'ERR_BAD_LIMIT_PRICE');
+
+ tokenAmountOut =
+ calcOutGivenIn(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, _swapFee);
+ require(tokenAmountOut >= minAmountOut, 'ERR_LIMIT_OUT');
+
+ inRecord.balance = badd(inRecord.balance, tokenAmountIn);
+ outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
+
+ spotPriceAfter = calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
+ require(spotPriceAfter >= spotPriceBefore, 'ERR_MATH_APPROX');
+ require(spotPriceAfter <= maxPrice, 'ERR_LIMIT_PRICE');
+ require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), 'ERR_MATH_APPROX');
+
+ emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);
+
+ _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
+ _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
+
+ return (tokenAmountOut, spotPriceAfter);
+ }
+
+ function swapExactAmountOut(
+ address tokenIn,
+ uint256 maxAmountIn,
+ address tokenOut,
+ uint256 tokenAmountOut,
+ uint256 maxPrice
+ ) external _logs_ _lock_ returns (uint256 tokenAmountIn, uint256 spotPriceAfter) {
+ require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
+ require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
+ require(_publicSwap, 'ERR_SWAP_NOT_PUBLIC');
+
+ Record storage inRecord = _records[address(tokenIn)];
+ Record storage outRecord = _records[address(tokenOut)];
+
+ require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), 'ERR_MAX_OUT_RATIO');
+
+ uint256 spotPriceBefore =
+ calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
+ require(spotPriceBefore <= maxPrice, 'ERR_BAD_LIMIT_PRICE');
+
+ tokenAmountIn =
+ calcInGivenOut(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, _swapFee);
+ require(tokenAmountIn <= maxAmountIn, 'ERR_LIMIT_IN');
+
+ inRecord.balance = badd(inRecord.balance, tokenAmountIn);
+ outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
+
+ spotPriceAfter = calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
+ require(spotPriceAfter >= spotPriceBefore, 'ERR_MATH_APPROX');
+ require(spotPriceAfter <= maxPrice, 'ERR_LIMIT_PRICE');
+ require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), 'ERR_MATH_APPROX');
+
+ emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);
+
+ _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
+ _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
+
+ return (tokenAmountIn, spotPriceAfter);
+ }
+
+ function joinswapExternAmountIn(
+ address tokenIn,
+ uint256 tokenAmountIn,
+ uint256 minPoolAmountOut
+ ) external _logs_ _lock_ returns (uint256 poolAmountOut) {
+ require(_finalized, 'ERR_NOT_FINALIZED');
+ require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
+ require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), 'ERR_MAX_IN_RATIO');
+
+ Record storage inRecord = _records[tokenIn];
+
+ poolAmountOut =
+ calcPoolOutGivenSingleIn(inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountIn, _swapFee);
+
+ require(poolAmountOut >= minPoolAmountOut, 'ERR_LIMIT_OUT');
+
+ inRecord.balance = badd(inRecord.balance, tokenAmountIn);
+
+ emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);
+
+ _mintPoolShare(poolAmountOut);
+ _pushPoolShare(msg.sender, poolAmountOut);
+ _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
+
+ return poolAmountOut;
+ }
+
+ function joinswapPoolAmountOut(
+ address tokenIn,
+ uint256 poolAmountOut,
+ uint256 maxAmountIn
+ ) external _logs_ _lock_ returns (uint256 tokenAmountIn) {
+ require(_finalized, 'ERR_NOT_FINALIZED');
+ require(_records[tokenIn].bound, 'ERR_NOT_BOUND');
+
+ Record storage inRecord = _records[tokenIn];
+
+ tokenAmountIn =
+ calcSingleInGivenPoolOut(inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, _swapFee);
+
+ require(tokenAmountIn != 0, 'ERR_MATH_APPROX');
+ require(tokenAmountIn <= maxAmountIn, 'ERR_LIMIT_IN');
+
+ require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), 'ERR_MAX_IN_RATIO');
+
+ inRecord.balance = badd(inRecord.balance, tokenAmountIn);
+
+ emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);
+
+ _mintPoolShare(poolAmountOut);
+ _pushPoolShare(msg.sender, poolAmountOut);
+ _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
+
+ return tokenAmountIn;
+ }
+
+ function exitswapPoolAmountIn(
+ address tokenOut,
+ uint256 poolAmountIn,
+ uint256 minAmountOut
+ ) external _logs_ _lock_ returns (uint256 tokenAmountOut) {
+ require(_finalized, 'ERR_NOT_FINALIZED');
+ require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
+
+ Record storage outRecord = _records[tokenOut];
+
+ tokenAmountOut =
+ calcSingleOutGivenPoolIn(outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, _swapFee);
+
+ require(tokenAmountOut >= minAmountOut, 'ERR_LIMIT_OUT');
+
+ require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), 'ERR_MAX_OUT_RATIO');
+
+ outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
+
+ uint256 exitFee = bmul(poolAmountIn, EXIT_FEE);
+
+ emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);
+
+ _pullPoolShare(msg.sender, poolAmountIn);
+ _burnPoolShare(bsub(poolAmountIn, exitFee));
+ _pushPoolShare(_factory, exitFee);
+ _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
+
+ return tokenAmountOut;
+ }
+
+ function exitswapExternAmountOut(
+ address tokenOut,
+ uint256 tokenAmountOut,
+ uint256 maxPoolAmountIn
+ ) external _logs_ _lock_ returns (uint256 poolAmountIn) {
+ require(_finalized, 'ERR_NOT_FINALIZED');
+ require(_records[tokenOut].bound, 'ERR_NOT_BOUND');
+ require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), 'ERR_MAX_OUT_RATIO');
+
+ Record storage outRecord = _records[tokenOut];
+
+ poolAmountIn = calcPoolInGivenSingleOut(
+ outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, tokenAmountOut, _swapFee
+ );
+
+ require(poolAmountIn != 0, 'ERR_MATH_APPROX');
+ require(poolAmountIn <= maxPoolAmountIn, 'ERR_LIMIT_IN');
+
+ outRecord.balance = bsub(outRecord.balance, tokenAmountOut);
+
+ uint256 exitFee = bmul(poolAmountIn, EXIT_FEE);
+
+ emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);
+
+ _pullPoolShare(msg.sender, poolAmountIn);
+ _burnPoolShare(bsub(poolAmountIn, exitFee));
+ _pushPoolShare(_factory, exitFee);
+ _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
+
+ return poolAmountIn;
+ }
+
+ function isPublicSwap() external view returns (bool) {
+ return _publicSwap;
+ }
+
+ function isFinalized() external view returns (bool) {
+ return _finalized;
+ }
+
+ function isBound(address t) external view returns (bool) {
+ return _records[t].bound;
+ }
+
+ function getNumTokens() external view returns (uint256) {
+ return _tokens.length;
+ }
+
+ function getCurrentTokens() external view _viewlock_ returns (address[] memory tokens) {
+ return _tokens;
+ }
+
+ function getFinalTokens() external view _viewlock_ returns (address[] memory tokens) {
+ require(_finalized, 'ERR_NOT_FINALIZED');
+ return _tokens;
+ }
+
+ function getDenormalizedWeight(address token) external view _viewlock_ returns (uint256) {
+ require(_records[token].bound, 'ERR_NOT_BOUND');
+ return _records[token].denorm;
+ }
+
+ function getTotalDenormalizedWeight() external view _viewlock_ returns (uint256) {
+ return _totalWeight;
+ }
+
+ function getNormalizedWeight(address token) external view _viewlock_ returns (uint256) {
+ require(_records[token].bound, 'ERR_NOT_BOUND');
+ uint256 denorm = _records[token].denorm;
+ return bdiv(denorm, _totalWeight);
+ }
+
+ function getBalance(address token) external view _viewlock_ returns (uint256) {
+ require(_records[token].bound, 'ERR_NOT_BOUND');
+ return _records[token].balance;
+ }
+
+ function getSwapFee() external view _viewlock_ returns (uint256) {
+ return _swapFee;
+ }
+
+ function getController() external view _viewlock_ returns (address) {
+ return _controller;
+ }
+
+ // ==
+ // 'Underlying' token-manipulation functions make external calls but are NOT locked
+ // You must `_lock_` or otherwise ensure reentry-safety
+
+ function _pullUnderlying(address erc20, address from, uint256 amount) internal virtual {
+ bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
+ require(xfer, 'ERR_ERC20_FALSE');
+ }
+
+ function _pushUnderlying(address erc20, address to, uint256 amount) internal virtual {
+ bool xfer = IERC20(erc20).transfer(to, amount);
+ require(xfer, 'ERR_ERC20_FALSE');
+ }
+
+ function _pullPoolShare(address from, uint256 amount) internal {
+ _pull(from, amount);
+ }
+
+ function _pushPoolShare(address to, uint256 amount) internal {
+ _push(to, amount);
+ }
+
+ function _mintPoolShare(uint256 amount) internal {
+ _mint(amount);
+ }
+
+ function _burnPoolShare(uint256 amount) internal {
+ _burn(amount);
+ }
+
+ modifier _logs_() {
+ emit LOG_CALL(msg.sig, msg.sender, msg.data);
+ _;
+ }
+
+ modifier _lock_() {
+ require(!_mutex, 'ERR_REENTRY');
+ _mutex = true;
+ _;
+ _mutex = false;
+ }
+
+ modifier _viewlock_() {
+ require(!_mutex, 'ERR_REENTRY');
+ _;
+ }
+}
diff --git a/src/contracts/BToken.sol b/src/contracts/BToken.sol
new file mode 100644
index 00000000..31ad2402
--- /dev/null
+++ b/src/contracts/BToken.sol
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+pragma solidity 0.8.23;
+
+import {BNum} from './BNum.sol';
+import {IERC20} from 'forge-std/interfaces/IERC20.sol';
+
+abstract contract BTokenBase is BNum, IERC20 {
+ mapping(address => uint256) internal _balance;
+ mapping(address => mapping(address => uint256)) internal _allowance;
+ uint256 internal _totalSupply;
+
+ function _mint(uint256 amt) internal {
+ _balance[address(this)] = badd(_balance[address(this)], amt);
+ _totalSupply = badd(_totalSupply, amt);
+ emit Transfer(address(0), address(this), amt);
+ }
+
+ function _burn(uint256 amt) internal {
+ require(_balance[address(this)] >= amt, 'ERR_INSUFFICIENT_BAL');
+ _balance[address(this)] = bsub(_balance[address(this)], amt);
+ _totalSupply = bsub(_totalSupply, amt);
+ emit Transfer(address(this), address(0), amt);
+ }
+
+ function _move(address src, address dst, uint256 amt) internal {
+ require(_balance[src] >= amt, 'ERR_INSUFFICIENT_BAL');
+ _balance[src] = bsub(_balance[src], amt);
+ _balance[dst] = badd(_balance[dst], amt);
+ emit Transfer(src, dst, amt);
+ }
+
+ function _push(address to, uint256 amt) internal {
+ _move(address(this), to, amt);
+ }
+
+ function _pull(address from, uint256 amt) internal {
+ _move(from, address(this), amt);
+ }
+}
+
+contract BToken is BTokenBase {
+ string internal _name = 'Balancer Pool Token';
+ string internal _symbol = 'BPT';
+ uint8 internal _decimals = 18;
+
+ function approve(address dst, uint256 amt) external override returns (bool) {
+ _allowance[msg.sender][dst] = amt;
+ emit Approval(msg.sender, dst, amt);
+ return true;
+ }
+
+ function increaseApproval(address dst, uint256 amt) external returns (bool) {
+ _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
+ emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
+ return true;
+ }
+
+ function decreaseApproval(address dst, uint256 amt) external returns (bool) {
+ uint256 oldValue = _allowance[msg.sender][dst];
+ if (amt > oldValue) {
+ _allowance[msg.sender][dst] = 0;
+ } else {
+ _allowance[msg.sender][dst] = bsub(oldValue, amt);
+ }
+ emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
+ return true;
+ }
+
+ function transfer(address dst, uint256 amt) external override returns (bool) {
+ _move(msg.sender, dst, amt);
+ return true;
+ }
+
+ function transferFrom(address src, address dst, uint256 amt) external override returns (bool) {
+ require(msg.sender == src || amt <= _allowance[src][msg.sender], 'ERR_BTOKEN_BAD_CALLER');
+ _move(src, dst, amt);
+ if (msg.sender != src && _allowance[src][msg.sender] != type(uint256).max) {
+ _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
+ emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
+ }
+ return true;
+ }
+
+ function allowance(address src, address dst) external view override returns (uint256) {
+ return _allowance[src][dst];
+ }
+
+ function balanceOf(address whom) external view override returns (uint256) {
+ return _balance[whom];
+ }
+
+ function totalSupply() public view override returns (uint256) {
+ return _totalSupply;
+ }
+
+ function name() public view returns (string memory) {
+ return _name;
+ }
+
+ function symbol() public view returns (string memory) {
+ return _symbol;
+ }
+
+ function decimals() public view returns (uint8) {
+ return _decimals;
+ }
+}
diff --git a/test/factory.js b/test/factory.js
deleted file mode 100644
index 905f321d..00000000
--- a/test/factory.js
+++ /dev/null
@@ -1,97 +0,0 @@
-const BPool = artifacts.require('BPool');
-const BFactory = artifacts.require('BFactory');
-const TToken = artifacts.require('TToken');
-const truffleAssert = require('truffle-assertions');
-
-contract('BFactory', async (accounts) => {
- const admin = accounts[0];
- const nonAdmin = accounts[1];
- const user2 = accounts[2];
- const { toWei } = web3.utils;
- const { fromWei } = web3.utils;
- const { hexToUtf8 } = web3.utils;
-
- const MAX = web3.utils.toTwosComplement(-1);
-
- describe('Factory', () => {
- let factory;
- let pool;
- let POOL;
- let WETH;
- let DAI;
- let weth;
- let dai;
-
- before(async () => {
- factory = await BFactory.deployed();
- weth = await TToken.new('Wrapped Ether', 'WETH', 18);
- dai = await TToken.new('Dai Stablecoin', 'DAI', 18);
-
- WETH = weth.address;
- DAI = dai.address;
-
- // admin balances
- await weth.mint(admin, toWei('5'));
- await dai.mint(admin, toWei('200'));
-
- // nonAdmin balances
- await weth.mint(nonAdmin, toWei('1'), { from: admin });
- await dai.mint(nonAdmin, toWei('50'), { from: admin });
-
- POOL = await factory.newBPool.call(); // this works fine in clean room
- await factory.newBPool();
- pool = await BPool.at(POOL);
-
- await weth.approve(POOL, MAX);
- await dai.approve(POOL, MAX);
-
- await weth.approve(POOL, MAX, { from: nonAdmin });
- await dai.approve(POOL, MAX, { from: nonAdmin });
- });
-
- it('BFactory is bronze release', async () => {
- const color = await factory.getColor();
- assert.equal(hexToUtf8(color), 'BRONZE');
- });
-
- it('isBPool on non pool returns false', async () => {
- const isBPool = await factory.isBPool(admin);
- assert.isFalse(isBPool);
- });
-
- it('isBPool on pool returns true', async () => {
- const isBPool = await factory.isBPool(POOL);
- assert.isTrue(isBPool);
- });
-
- it('fails nonAdmin calls collect', async () => {
- await truffleAssert.reverts(factory.collect(nonAdmin, { from: nonAdmin }), 'ERR_NOT_BLABS');
- });
-
- it('admin collects fees', async () => {
- await pool.bind(WETH, toWei('5'), toWei('5'));
- await pool.bind(DAI, toWei('200'), toWei('5'));
-
- await pool.finalize();
-
- await pool.joinPool(toWei('10'), [MAX, MAX], { from: nonAdmin });
- await pool.exitPool(toWei('10'), [toWei('0'), toWei('0')], { from: nonAdmin });
-
- // Exit fee = 0 so this wont do anything
- await factory.collect(POOL);
-
- const adminBalance = await pool.balanceOf(admin);
- assert.equal(fromWei(adminBalance), '100');
- });
-
- it('nonadmin cant set blabs address', async () => {
- await truffleAssert.reverts(factory.setBLabs(nonAdmin, { from: nonAdmin }), 'ERR_NOT_BLABS');
- });
-
- it('admin changes blabs address', async () => {
- await factory.setBLabs(user2);
- const blab = await factory.getBLabs();
- assert.equal(blab, user2);
- });
- });
-});
diff --git a/test/integration/PoolSwap.t.sol b/test/integration/PoolSwap.t.sol
new file mode 100644
index 00000000..585fb752
--- /dev/null
+++ b/test/integration/PoolSwap.t.sol
@@ -0,0 +1,93 @@
+pragma solidity 0.8.23;
+
+import {Test} from 'forge-std/Test.sol';
+
+import {BFactory} from 'contracts/BFactory.sol';
+import {BPool} from 'contracts/BPool.sol';
+import {IERC20} from 'contracts/BToken.sol';
+
+import {GasSnapshot} from 'forge-gas-snapshot/GasSnapshot.sol';
+
+abstract contract PoolSwapIntegrationTest is Test, GasSnapshot {
+ BFactory public factory;
+ BPool public pool;
+
+ IERC20 public tokenA;
+ IERC20 public tokenB;
+
+ address public lp = address(420);
+ address public swapper = address(69);
+
+ function setUp() public {
+ tokenA = IERC20(address(deployMockERC20('TokenA', 'TKA', 18)));
+ tokenB = IERC20(address(deployMockERC20('TokenB', 'TKB', 18)));
+
+ deal(address(tokenA), address(lp), 100e18);
+ deal(address(tokenB), address(lp), 100e18);
+
+ deal(address(tokenA), address(swapper), 1e18);
+
+ factory = new BFactory();
+
+ vm.startPrank(lp);
+ pool = factory.newBPool();
+
+ tokenA.approve(address(pool), type(uint256).max);
+ tokenB.approve(address(pool), type(uint256).max);
+
+ pool.bind(address(tokenA), 1e18, 2e18); // 20% weight?
+ pool.bind(address(tokenB), 1e18, 8e18); // 80%
+
+ pool.finalize();
+ vm.stopPrank();
+ }
+
+ function testSimpleSwap() public {
+ _makeSwap();
+ assertEq(tokenA.balanceOf(address(swapper)), 0.5e18);
+ // NOTE: hardcoded from test result
+ assertEq(tokenB.balanceOf(address(swapper)), 0.096397921069149814e18);
+
+ vm.startPrank(lp);
+
+ uint256 lpBalance = pool.balanceOf(address(lp));
+ pool.exitPool(lpBalance, new uint256[](2));
+
+ // NOTE: no swap fees involved
+ assertEq(tokenA.balanceOf(address(lp)), 100.5e18); // initial 100 + 0.5 tokenA
+ // NOTE: hardcoded from test result
+ assertEq(tokenB.balanceOf(address(lp)), 99.903602078930850186e18); // initial 100 - ~0.09 tokenB
+ }
+
+ function _makeSwap() internal virtual;
+}
+
+contract DirectPoolSwapIntegrationTest is PoolSwapIntegrationTest {
+ function _makeSwap() internal override {
+ vm.startPrank(swapper);
+ tokenA.approve(address(pool), type(uint256).max);
+
+ // swap 0.5 tokenA for tokenB
+ snapStart('swapExactAmountIn');
+ pool.swapExactAmountIn(address(tokenA), 0.5e18, address(tokenB), 0, type(uint256).max);
+ snapEnd();
+
+ vm.stopPrank();
+ }
+}
+
+// TODO: remove `abstract` keyword to make the test runnable
+abstract contract IndirectPoolSwapIntegrationTest is PoolSwapIntegrationTest {
+ function _makeSwap() internal override {
+ vm.startPrank(address(pool));
+ tokenA.approve(address(swapper), type(uint256).max);
+ tokenB.approve(address(swapper), type(uint256).max);
+ vm.stopPrank();
+
+ vm.startPrank(swapper);
+ // swap 0.5 tokenA for tokenB
+ tokenA.transfer(address(pool), 0.5e18);
+ tokenB.transferFrom(address(pool), address(swapper), 0.096397921069149814e18);
+ vm.stopPrank();
+ }
+}
diff --git a/test/math_extreme_weights.js b/test/math_extreme_weights.js
deleted file mode 100644
index 4d9ac084..00000000
--- a/test/math_extreme_weights.js
+++ /dev/null
@@ -1,417 +0,0 @@
-const Decimal = require('decimal.js');
-const truffleAssert = require('truffle-assertions');
-const { calcRelativeDiff } = require('../lib/calc_comparisons');
-
-const BPool = artifacts.require('BPool');
-const BFactory = artifacts.require('BFactory');
-const TToken = artifacts.require('TToken');
-const errorDelta = 10 ** -8;
-const swapFee = 0.001; // 0.001;
-const exitFee = 0;
-const verbose = process.env.VERBOSE;
-
-
-contract('BPool', async (accounts) => {
- const admin = accounts[0];
- const { toWei } = web3.utils;
- const { fromWei } = web3.utils;
- const MAX = web3.utils.toTwosComplement(-1);
-
- let WETH; let DAI;
- let weth; let dai;
- let factory; // BPool factory
- let pool; // first pool w/ defaults
- let POOL; // pool address
-
- const wethBalance = '1000';
- const wethDenorm = '1';
-
- let currentWethBalance = Decimal(wethBalance);
- let previousWethBalance = currentWethBalance;
-
- const daiBalance = '1000';
- const daiDenorm = '49';
-
- let currentDaiBalance = Decimal(daiBalance);
- let previousDaiBalance = currentDaiBalance;
-
- let currentPoolBalance = Decimal(0);
- let previousPoolBalance = Decimal(0);
-
- const sumWeights = Decimal(wethDenorm).add(Decimal(daiDenorm));
- const wethNorm = Decimal(wethDenorm).div(Decimal(sumWeights));
- const daiNorm = Decimal(daiDenorm).div(Decimal(sumWeights));
-
- async function logAndAssertCurrentBalances() {
- let expected = currentPoolBalance;
- let actual = await pool.totalSupply();
- actual = Decimal(fromWei(actual));
- let relDif = calcRelativeDiff(expected, actual);
- if (verbose) {
- console.log('Pool Balance');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- expected = currentWethBalance;
- actual = await pool.getBalance(WETH);
- actual = Decimal(fromWei(actual));
- relDif = calcRelativeDiff(expected, actual);
- if (verbose) {
- console.log('WETH Balance');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- expected = currentDaiBalance;
- actual = await pool.getBalance(DAI);
- actual = Decimal(fromWei(actual));
- relDif = calcRelativeDiff(expected, actual);
- if (verbose) {
- console.log('Dai Balance');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- }
-
- before(async () => {
- factory = await BFactory.deployed();
-
- POOL = await factory.newBPool.call(); // this works fine in clean room
- await factory.newBPool();
- pool = await BPool.at(POOL);
-
- weth = await TToken.new('Wrapped Ether', 'WETH', 18);
- dai = await TToken.new('Dai Stablecoin', 'DAI', 18);
-
- WETH = weth.address;
- DAI = dai.address;
-
- await weth.mint(admin, MAX);
- await dai.mint(admin, MAX);
-
- await weth.approve(POOL, MAX);
- await dai.approve(POOL, MAX);
-
-
- await pool.bind(WETH, toWei(wethBalance), toWei(wethDenorm));
- await pool.bind(DAI, toWei(daiBalance), toWei(daiDenorm));
-
- await pool.setPublicSwap(true);
-
- await pool.setSwapFee(toWei(String(swapFee)));
- });
-
- describe('Extreme weights', () => {
- it('swapExactAmountIn', async () => {
- const tokenIn = WETH;
- const tokenInAmount = toWei('500');
- const tokenOut = DAI;
- const minAmountOut = toWei('0');
- const maxPrice = MAX;
-
- const output = await pool.swapExactAmountIn.call(
- tokenIn, tokenInAmount, tokenOut, minAmountOut, maxPrice,
- );
-
- // Checking outputs
- let expected = Decimal('8.23390841016124456');
- let actual = Decimal(fromWei(output.tokenAmountOut));
- let relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('output[0]');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- expected = Decimal('74.1844011380065814');
- actual = Decimal(fromWei(output.spotPriceAfter));
- relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('output[1]');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
-
- it('swapExactAmountOut', async () => {
- const tokenIn = WETH;
- const maxAmountIn = MAX;
- const tokenOut = DAI;
- const tokenAmountOut = toWei('333.333333333333333333');
- const maxPrice = MAX;
-
- const output = await pool.swapExactAmountOut.call(
- tokenIn, maxAmountIn, tokenOut, tokenAmountOut, maxPrice,
- );
-
- // Checking outputs
- let expected = Decimal('425506505648.348073');
- let actual = Decimal(fromWei(output.tokenAmountIn));
- let relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('output[0]');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- expected = Decimal('31306034272.9265099');
- actual = Decimal(fromWei(output.spotPriceAfter));
- relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('output[1]');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
- it('joinPool', async () => {
- currentPoolBalance = '100';
- await pool.finalize();
-
- // // Call function
- const poolAmountOut = '1';
- await pool.joinPool(toWei(poolAmountOut), [MAX, MAX]);
-
- // // Update balance states
- previousPoolBalance = Decimal(currentPoolBalance);
- currentPoolBalance = Decimal(currentPoolBalance).add(Decimal(poolAmountOut));
-
- // Balances of all tokens increase proportionally to the pool balance
- previousWethBalance = currentWethBalance;
- let balanceChange = (Decimal(poolAmountOut).div(previousPoolBalance)).mul(previousWethBalance);
- currentWethBalance = currentWethBalance.add(balanceChange);
- previousDaiBalance = currentDaiBalance;
- balanceChange = (Decimal(poolAmountOut).div(previousPoolBalance)).mul(previousDaiBalance);
- currentDaiBalance = currentDaiBalance.add(balanceChange);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
- it('exitPool', async () => {
- // Call function
- // so that the balances of all tokens will go back exactly to what they were before joinPool()
- const poolAmountIn = 1 / (1 - exitFee);
- const poolAmountInAfterExitFee = Decimal(poolAmountIn).mul(Decimal(1).sub(exitFee));
-
- await pool.exitPool(toWei(String(poolAmountIn)), [toWei('0'), toWei('0')]);
-
- // Update balance states
- previousPoolBalance = currentPoolBalance;
- currentPoolBalance = currentPoolBalance.sub(poolAmountInAfterExitFee);
- // Balances of all tokens increase proportionally to the pool balance
- previousWethBalance = currentWethBalance;
- let balanceChange = (poolAmountInAfterExitFee.div(previousPoolBalance)).mul(previousWethBalance);
- currentWethBalance = currentWethBalance.sub(balanceChange);
- previousDaiBalance = currentDaiBalance;
- balanceChange = (poolAmountInAfterExitFee.div(previousPoolBalance)).mul(previousDaiBalance);
- currentDaiBalance = currentDaiBalance.sub(balanceChange);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
-
- it('joinswapExternAmountIn', async () => {
- // Call function
- const tokenRatio = 1.1;
- // increase tbalance by 1.1 after swap fee
- const tokenAmountIn = (1 / (1 - swapFee * (1 - wethNorm))) * (currentWethBalance * (tokenRatio - 1));
- await pool.joinswapExternAmountIn(WETH, toWei(String(tokenAmountIn)), toWei('0'));
- // Update balance states
- previousWethBalance = currentWethBalance;
- currentWethBalance = currentWethBalance.add(Decimal(tokenAmountIn));
- previousPoolBalance = currentPoolBalance;
- currentPoolBalance = currentPoolBalance.mul(Decimal(tokenRatio).pow(wethNorm)); // increase by 1.1**wethNorm
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
-
- it('joinswapPoolAmountOut', async () => {
- // Call function
- const poolRatio = 1.1;
- const poolAmountOut = currentPoolBalance * (poolRatio - 1);
- await pool.joinswapPoolAmountOut(DAI, toWei(String(poolAmountOut)), MAX);
- // Update balance states
- previousPoolBalance = currentPoolBalance;
- currentPoolBalance = currentPoolBalance.mul(Decimal(poolRatio)); // increase by 1.1
- previousDaiBalance = currentDaiBalance;
- const numer = previousDaiBalance.mul(Decimal(poolRatio).pow(Decimal(1).div(daiNorm)).sub(Decimal(1)));
- const denom = Decimal(1).sub((Decimal(swapFee)).mul((Decimal(1).sub(daiNorm))));
- currentDaiBalance = currentDaiBalance.plus(numer.div(denom));
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
- it('joinswapExternAmountIn should revert', async () => {
- // Call function
- const tokenRatio = 1.1;
- const tokenAmountIn = (1 / (1 - swapFee * (1 - wethNorm))) * (currentWethBalance * (tokenRatio));
- await truffleAssert.reverts(
- pool.joinswapExternAmountIn(WETH, toWei(String(tokenAmountIn)), toWei('0')),
- 'ERR_MAX_IN_RATIO',
- );
- });
-
- it('joinswapPoolAmountOut should revert', async () => {
- // Call function
- const poolRatio = 0.9;
- const poolAmountOut = currentPoolBalance * (poolRatio);
- await truffleAssert.reverts(
- pool.joinswapPoolAmountOut(DAI, toWei(String(poolAmountOut)), MAX),
- 'ERR_MAX_IN_RATIO',
- );
- });
-
- it('exitswapExternAmountOut should revert', async () => {
- // Call function
- const poolRatioAfterExitFee = 1.1;
- const tokenRatioBeforeSwapFee = poolRatioAfterExitFee ** (1 / daiNorm);
- const tokenAmountOut = currentDaiBalance * (1 - tokenRatioBeforeSwapFee) * (1 - swapFee * (1 - daiNorm));
- await truffleAssert.reverts(
- pool.exitswapExternAmountOut(DAI, toWei(String(tokenAmountOut)), MAX),
- 'ERR_MAX_OUT_RATIO',
- );
- });
-
- it('exitswapPoolAmountIn should revert', async () => {
- // Call function
- const poolRatioAfterExitFee = 0.9;
- const poolAmountIn = currentPoolBalance * (1 - poolRatioAfterExitFee) * (1 / (1 - exitFee));
- await truffleAssert.reverts(
- pool.exitswapPoolAmountIn(WETH, toWei(String(poolAmountIn)), toWei('0')),
- 'ERR_MAX_OUT_RATIO',
- );
- });
-
- it('exitswapExternAmountOut', async () => {
- // Call function
- const poolRatioAfterExitFee = 0.9;
- const tokenRatioBeforeSwapFee = poolRatioAfterExitFee ** (1 / daiNorm);
- const tokenAmountOut = currentDaiBalance * (1 - tokenRatioBeforeSwapFee) * (1 - swapFee * (1 - daiNorm));
- await pool.exitswapExternAmountOut(DAI, toWei(String(tokenAmountOut)), MAX);
- // Update balance states
- previousDaiBalance = currentDaiBalance;
- currentDaiBalance = currentDaiBalance.sub(Decimal(tokenAmountOut));
- previousPoolBalance = currentPoolBalance;
- const balanceChange = previousPoolBalance.mul(Decimal(1).sub(Decimal(poolRatioAfterExitFee)));
- currentPoolBalance = currentPoolBalance.sub(balanceChange);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
- it('poolAmountOut = joinswapExternAmountIn(joinswapPoolAmountOut(poolAmountOut))', async () => {
- const poolAmountOut = 0.1;
- const tokenAmountIn = await pool.joinswapPoolAmountOut.call(WETH, toWei(String(poolAmountOut)), MAX);
- const pAo = await pool.joinswapExternAmountIn.call(WETH, String(tokenAmountIn), toWei('0'));
-
- const expected = Decimal(poolAmountOut);
- const actual = Decimal(fromWei(pAo));
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log(`tokenAmountIn: ${tokenAmountIn})`);
- console.log('poolAmountOut');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
-
- it('tokenAmountIn = joinswapPoolAmountOut(joinswapExternAmountIn(tokenAmountIn))', async () => {
- const tokenAmountIn = '1';
- const poolAmountOut = await pool.joinswapExternAmountIn.call(DAI, toWei(tokenAmountIn), toWei('0'));
- const calculatedtokenAmountIn = await pool.joinswapPoolAmountOut.call(DAI, String(poolAmountOut), MAX);
-
- const expected = Decimal(tokenAmountIn);
- const actual = Decimal(fromWei(calculatedtokenAmountIn));
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log(`poolAmountOut: ${poolAmountOut})`);
- console.log('tokenAmountIn');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
-
- it('poolAmountIn = exitswapExternAmountOut(exitswapPoolAmountIn(poolAmountIn))', async () => {
- const poolAmountIn = 0.1;
- const tokenAmountOut = await pool.exitswapPoolAmountIn.call(WETH, toWei(String(poolAmountIn)), toWei('0'));
- const calculatedpoolAmountIn = await pool.exitswapExternAmountOut.call(WETH, String(tokenAmountOut), MAX);
-
- const expected = Decimal(poolAmountIn);
- const actual = Decimal(fromWei(calculatedpoolAmountIn));
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log(`tokenAmountOut: ${tokenAmountOut})`);
- console.log('poolAmountIn');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
-
- it('tokenAmountOut = exitswapPoolAmountIn(exitswapExternAmountOut(tokenAmountOut))', async () => {
- const tokenAmountOut = 1;
- const poolAmountIn = await pool.exitswapExternAmountOut.call(DAI, toWei(String(tokenAmountOut)), MAX);
- const tAo = await pool.exitswapPoolAmountIn.call(DAI, String(poolAmountIn), toWei('0'));
-
- const expected = Decimal(tokenAmountOut);
- const actual = Decimal(fromWei(tAo));
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log(`poolAmountIn: ${poolAmountIn})`);
- console.log('tokenAmountOut');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
- });
-});
diff --git a/test/math_with_fees.js b/test/math_with_fees.js
deleted file mode 100644
index 2ee744aa..00000000
--- a/test/math_with_fees.js
+++ /dev/null
@@ -1,505 +0,0 @@
-const Decimal = require('decimal.js');
-const {
- calcSpotPrice,
- calcOutGivenIn,
- calcInGivenOut,
- calcRelativeDiff,
-} = require('../lib/calc_comparisons');
-
-const BPool = artifacts.require('BPool');
-const BFactory = artifacts.require('BFactory');
-const TToken = artifacts.require('TToken');
-const errorDelta = 10 ** -8;
-const swapFee = 10 ** -3; // 0.001;
-const exitFee = 0;
-const verbose = process.env.VERBOSE;
-
-contract('BPool', async (accounts) => {
- const { toWei } = web3.utils;
- const { fromWei } = web3.utils;
- const admin = accounts[0];
-
- const MAX = web3.utils.toTwosComplement(-1);
-
- let WETH; let DAI; // addresses
- let weth; let dai; // TTokens
- let factory; // BPool factory
- let pool; // first pool w/ defaults
- let POOL; // pool address
-
- const wethBalance = '4';
- const wethDenorm = '10';
-
- let currentWethBalance = Decimal(wethBalance);
- let previousWethBalance = currentWethBalance;
-
- const daiBalance = '12';
- const daiDenorm = '10';
-
- let currentDaiBalance = Decimal(daiBalance);
- let previousDaiBalance = currentDaiBalance;
-
- let currentPoolBalance = Decimal(0);
- let previousPoolBalance = Decimal(0);
-
- const sumWeights = Decimal(wethDenorm).add(Decimal(daiDenorm));
- const wethNorm = Decimal(wethDenorm).div(Decimal(sumWeights));
- const daiNorm = Decimal(daiDenorm).div(Decimal(sumWeights));
-
- async function logAndAssertCurrentBalances() {
- let expected = currentPoolBalance;
- let actual = await pool.totalSupply();
- actual = Decimal(fromWei(actual));
- let relDif = calcRelativeDiff(expected, actual);
- if (verbose) {
- console.log('Pool Balance');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- expected = currentWethBalance;
- actual = await pool.getBalance(WETH);
- actual = Decimal(fromWei(actual));
- relDif = calcRelativeDiff(expected, actual);
- if (verbose) {
- console.log('WETH Balance');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- expected = currentDaiBalance;
- actual = await pool.getBalance(DAI);
- actual = Decimal(fromWei(actual));
- relDif = calcRelativeDiff(expected, actual);
- if (verbose) {
- console.log('Dai Balance');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- }
-
- before(async () => {
- factory = await BFactory.deployed();
-
- POOL = await factory.newBPool.call(); // this works fine in clean room
- await factory.newBPool();
- pool = await BPool.at(POOL);
-
- weth = await TToken.new('Wrapped Ether', 'WETH', 18);
- dai = await TToken.new('Dai Stablecoin', 'DAI', 18);
-
- WETH = weth.address;
- DAI = dai.address;
-
- await weth.mint(admin, MAX);
- await dai.mint(admin, MAX);
-
- await weth.approve(POOL, MAX);
- await dai.approve(POOL, MAX);
-
- await pool.bind(WETH, toWei(wethBalance), toWei(wethDenorm));
- await pool.bind(DAI, toWei(daiBalance), toWei(daiDenorm));
-
- await pool.setPublicSwap(true);
- await pool.setSwapFee(toWei(String(swapFee)));
- });
-
- describe('With fees', () => {
- it('swapExactAmountIn', async () => {
- const tokenIn = WETH;
- const tokenAmountIn = '2';
- const tokenOut = DAI;
- const minAmountOut = '0';
- const maxPrice = MAX;
-
- const output = await pool.swapExactAmountIn.call(
- tokenIn,
- toWei(tokenAmountIn),
- tokenOut,
- toWei(minAmountOut),
- maxPrice,
- );
-
- // Checking outputs
- let expected = calcOutGivenIn(
- currentWethBalance,
- wethNorm,
- currentDaiBalance,
- daiNorm,
- tokenAmountIn,
- swapFee,
- );
-
- let actual = Decimal(fromWei(output[0]));
- let relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('output[0]');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- expected = calcSpotPrice(
- currentWethBalance.plus(Decimal(2)),
- wethNorm,
- currentDaiBalance.sub(actual),
- daiNorm,
- swapFee,
- );
- // expected = 1 / ((1 - swapFee) * (4 + 2)) / (48 / (4 + 2 * (1 - swapFee)));
- // expected = ((1 / (1 - swapFee)) * (4 + 2)) / (48 / (4 + 2 * (1 - swapFee)));
- actual = fromWei(output[1]);
- relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('output[1]');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
-
- it('swapExactAmountOut', async () => {
- const tokenIn = DAI;
- const maxAmountIn = MAX;
- const tokenOut = WETH;
- const tokenAmountOut = '1';
- const maxPrice = MAX;
-
- const output = await pool.swapExactAmountOut.call(
- tokenIn,
- maxAmountIn,
- tokenOut,
- toWei(tokenAmountOut),
- maxPrice,
- );
-
- // Checking outputs
- // let expected = (48 / (4 - 1) - 12) / (1 - swapFee);
- let expected = calcInGivenOut(
- currentDaiBalance,
- daiNorm,
- currentWethBalance,
- wethNorm,
- tokenAmountOut,
- swapFee,
- );
-
- let actual = fromWei(output[0]);
- let relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('output[0]');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- expected = calcSpotPrice(
- currentDaiBalance.plus(actual),
- daiNorm,
- currentWethBalance.sub(Decimal(1)),
- wethNorm,
- swapFee,
- );
-
- actual = fromWei(output[1]);
- relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('output[1]');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
- it('joinPool', async () => {
- currentPoolBalance = '100';
- await pool.finalize();
-
- // Call function
- const pAo = '1';
- await pool.joinPool(toWei(pAo), [MAX, MAX]);
-
- // Update balance states
- previousPoolBalance = Decimal(currentPoolBalance);
- currentPoolBalance = Decimal(currentPoolBalance).plus(Decimal(pAo));
- // Balances of all tokens increase proportionally to the pool balance
- previousWethBalance = currentWethBalance;
- let balanceChange = (Decimal(pAo).div(previousPoolBalance)).mul(previousWethBalance);
- currentWethBalance = currentWethBalance.plus(balanceChange);
- previousDaiBalance = currentDaiBalance;
- balanceChange = (Decimal(pAo).div(previousPoolBalance)).mul(previousDaiBalance);
- currentDaiBalance = currentDaiBalance.plus(balanceChange);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
- it('exitPool', async () => {
- // Call function
- // so that the balances of all tokens will go back exactly to what they were before joinPool()
- const pAi = 1 / (1 - exitFee);
- const pAiAfterExitFee = pAi * (1 - exitFee);
-
- await pool.exitPool(toWei(String(pAi)), [toWei('0'), toWei('0')]);
-
- // Update balance states
- previousPoolBalance = currentPoolBalance;
- currentPoolBalance = currentPoolBalance.sub(Decimal(pAiAfterExitFee));
- // Balances of all tokens increase proportionally to the pool balance
- previousWethBalance = currentWethBalance;
- let balanceChange = (Decimal(pAiAfterExitFee).div(previousPoolBalance)).mul(previousWethBalance);
- currentWethBalance = currentWethBalance.sub(balanceChange);
- previousDaiBalance = currentDaiBalance;
- balanceChange = (Decimal(pAiAfterExitFee).div(previousPoolBalance)).mul(previousDaiBalance);
- currentDaiBalance = currentDaiBalance.sub(balanceChange);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
-
- it('joinswapExternAmountIn', async () => {
- // Call function
- const poolRatio = 1.1;
- // increase tbalance by 1.1^2 after swap fee
- const tAi = (1 / (1 - swapFee * (1 - wethNorm))) * (currentWethBalance * (poolRatio ** (1 / wethNorm) - 1));
-
- const pAo = await pool.joinswapExternAmountIn.call(WETH, toWei(String(tAi)), toWei('0'));
- // Execute txn called above
- await pool.joinswapExternAmountIn(WETH, toWei(String(tAi)), toWei('0'));
-
- // Update balance states
- previousWethBalance = currentWethBalance;
- currentWethBalance = currentWethBalance.plus(Decimal(tAi));
- previousPoolBalance = currentPoolBalance;
- currentPoolBalance = currentPoolBalance.mul(Decimal(poolRatio)); // increase by 1.1
-
- // Check pAo
- const expected = (currentPoolBalance.sub(previousPoolBalance)); // poolRatio = 1.1
- const actual = fromWei(pAo);
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('pAo');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
-
- it('joinswapPoolAmountOut', async () => {
- // Call function
- const poolRatio = 1.1;
- const pAo = currentPoolBalance * (poolRatio - 1);
-
- const tAi = await pool.joinswapPoolAmountOut.call(DAI, toWei(String(pAo)), MAX); // 10% of current supply
- await pool.joinswapPoolAmountOut(DAI, toWei(String(pAo)), MAX);
-
- // Update balance states
- previousPoolBalance = currentPoolBalance;
- currentPoolBalance = currentPoolBalance.mul(Decimal(poolRatio)); // increase by 1.1
- previousDaiBalance = currentDaiBalance;
- // (21% + swap fees) addition to current Rock supply ;
- const numer = (previousDaiBalance * ((poolRatio ** (1 / daiNorm) - 1) * 1));
- const denom = (1 - swapFee * (1 - daiNorm));
- currentDaiBalance = currentDaiBalance.plus(Decimal(numer / denom));
-
- // Check tAi
- const expected = (currentDaiBalance.sub(previousDaiBalance)); // 0.4641 -> 1.1^4 - 1 = 0.4641
- const actual = fromWei(tAi);
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('tAi');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
-
- it('exitswapPoolAmountIn', async () => {
- // Call function
- const poolRatioAfterExitFee = 0.9;
- const pAi = currentPoolBalance * (1 - poolRatioAfterExitFee) * (1 / (1 - exitFee));
-
- const tAo = await pool.exitswapPoolAmountIn.call(WETH, toWei(String(pAi)), toWei('0'));
- await pool.exitswapPoolAmountIn(WETH, toWei(String(pAi)), toWei('0'));
-
- // Update balance states
- previousPoolBalance = currentPoolBalance;
- currentPoolBalance = currentPoolBalance.sub(Decimal(pAi).mul(Decimal(1).sub(Decimal(exitFee))));
- previousWethBalance = currentWethBalance;
- const mult = (1 - poolRatioAfterExitFee ** (1 / wethNorm)) * (1 - swapFee * (1 - wethNorm));
- currentWethBalance = currentWethBalance.sub(previousWethBalance.mul(Decimal(mult)));
-
- // Check tAo
- const expected = (previousWethBalance.sub(currentWethBalance)); // 0.4641 -> 1.1^4 - 1 = 0.4641
- const actual = fromWei(tAo);
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('tAo');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
-
- it('exitswapExternAmountOut', async () => {
- // Call function
- const poolRatioAfterExitFee = 0.9;
- const tokenRatioBeforeSwapFee = poolRatioAfterExitFee ** (1 / daiNorm);
- const tAo = currentDaiBalance * (1 - tokenRatioBeforeSwapFee) * (1 - swapFee * (1 - daiNorm));
-
- const pAi = await pool.exitswapExternAmountOut.call(DAI, toWei(String(tAo)), MAX);
- await pool.exitswapExternAmountOut(DAI, toWei(String(tAo)), MAX);
-
- // Update balance states
- previousDaiBalance = currentDaiBalance;
- currentDaiBalance = currentDaiBalance.sub(Decimal(tAo));
- previousPoolBalance = currentPoolBalance;
- const balanceChange = previousPoolBalance.mul(Decimal(1).sub(Decimal(poolRatioAfterExitFee)));
- currentPoolBalance = currentPoolBalance.sub(balanceChange);
-
- // check pAi
- // Notice the (1-exitFee) term since only pAi*(1-exitFee) is burned
- const expected = (previousPoolBalance.sub(currentPoolBalance)).div(Decimal(1).sub(Decimal(exitFee)));
- const actual = fromWei(pAi);
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log('pAi');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- // Print current balances after operation
- await logAndAssertCurrentBalances();
- });
-
-
- it('pAo = joinswapExternAmountIn(joinswapPoolAmountOut(pAo))', async () => {
- const pAo = 10;
- const tAi = await pool.joinswapPoolAmountOut.call(WETH, toWei(String(pAo)), MAX);
- const calculatedPAo = await pool.joinswapExternAmountIn.call(WETH, String(tAi), toWei('0'));
-
- const expected = Decimal(pAo);
- const actual = fromWei(calculatedPAo);
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log(`tAi: ${tAi})`);
- console.log('pAo');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
-
- it('tAi = joinswapPoolAmountOut(joinswapExternAmountIn(tAi))', async () => {
- const tAi = 1;
- const pAo = await pool.joinswapExternAmountIn.call(DAI, toWei(String(tAi)), toWei('0'));
- const calculatedtAi = await pool.joinswapPoolAmountOut.call(DAI, String(pAo), MAX);
-
- const expected = Decimal(tAi);
- const actual = fromWei(calculatedtAi);
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log(`pAo: ${pAo})`);
- console.log('tAi');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
-
- it('pAi = exitswapExternAmountOut(exitswapPoolAmountIn(pAi))', async () => {
- const pAi = 10;
- const tAo = await pool.exitswapPoolAmountIn.call(WETH, toWei(String(pAi)), toWei('0'));
- const calculatedPAi = await pool.exitswapExternAmountOut.call(WETH, String(tAo), MAX);
-
- const expected = Decimal(pAi);
- const actual = fromWei(calculatedPAi);
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log(`tAo: ${tAo})`);
- console.log('pAi');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
-
- it('tAo = exitswapPoolAmountIn(exitswapExternAmountOut(tAo))', async () => {
- const tAo = '1';
- const pAi = await pool.exitswapExternAmountOut.call(DAI, toWei(tAo), MAX);
- const calculatedtAo = await pool.exitswapPoolAmountIn.call(DAI, String(pAi), toWei('0'));
-
- const expected = Decimal(tAo);
- const actual = fromWei(calculatedtAo);
- const relDif = calcRelativeDiff(expected, actual);
-
- if (verbose) {
- console.log(`pAi: ${pAi})`);
- console.log('tAo');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
- });
-});
diff --git a/test/num.js b/test/num.js
deleted file mode 100644
index 195cec2b..00000000
--- a/test/num.js
+++ /dev/null
@@ -1,35 +0,0 @@
-const truffleAssert = require('truffle-assertions');
-
-const TMath = artifacts.require('TMath');
-
-contract('TMath', async () => {
- const MAX = web3.utils.toTwosComplement(-1);
-
- describe('BMath', () => {
- let tmath;
- before(async () => {
- tmath = await TMath.deployed();
- });
-
- it('badd throws on overflow', async () => {
- await truffleAssert.reverts(tmath.calc_badd(1, MAX), 'ERR_ADD_OVERFLOW');
- });
-
- it('bsub throws on underflow', async () => {
- await truffleAssert.reverts(tmath.calc_bsub(1, 2), 'ERR_SUB_UNDERFLOW');
- });
-
- it('bmul throws on overflow', async () => {
- await truffleAssert.reverts(tmath.calc_bmul(2, MAX), 'ERR_MUL_OVERFLOW');
- });
-
- it('bdiv throws on div by 0', async () => {
- await truffleAssert.reverts(tmath.calc_bdiv(1, 0), 'ERR_DIV_ZERO');
- });
-
- it('bpow throws on base outside range', async () => {
- await truffleAssert.reverts(tmath.calc_bpow(0, 2), 'ERR_BPOW_BASE_TOO_LOW');
- await truffleAssert.reverts(tmath.calc_bpow(MAX, 2), 'ERR_BPOW_BASE_TOO_HIGH');
- });
- });
-});
diff --git a/test/pool.js b/test/pool.js
deleted file mode 100644
index 2a8abde2..00000000
--- a/test/pool.js
+++ /dev/null
@@ -1,601 +0,0 @@
-const truffleAssert = require('truffle-assertions');
-const { calcOutGivenIn, calcInGivenOut, calcRelativeDiff } = require('../lib/calc_comparisons');
-
-const BPool = artifacts.require('BPool');
-const BFactory = artifacts.require('BFactory');
-const TToken = artifacts.require('TToken');
-const verbose = process.env.VERBOSE;
-
-contract('BPool', async (accounts) => {
- const admin = accounts[0];
- const user1 = accounts[1];
- const user2 = accounts[2];
- const { toWei } = web3.utils;
- const { fromWei } = web3.utils;
- const errorDelta = 10 ** -8;
- const MAX = web3.utils.toTwosComplement(-1);
-
- let WETH; let MKR; let DAI; let
- XXX; // addresses
- let weth; let mkr; let dai; let
- xxx; // TTokens
- let factory; // BPool factory
- let pool; // first pool w/ defaults
- let POOL; // pool address
-
- before(async () => {
- factory = await BFactory.deployed();
-
- POOL = await factory.newBPool.call();
- await factory.newBPool();
- pool = await BPool.at(POOL);
-
- weth = await TToken.new('Wrapped Ether', 'WETH', 18);
- mkr = await TToken.new('Maker', 'MKR', 18);
- dai = await TToken.new('Dai Stablecoin', 'DAI', 18);
- xxx = await TToken.new('XXX', 'XXX', 18);
-
- WETH = weth.address;
- MKR = mkr.address;
- DAI = dai.address;
- XXX = xxx.address;
-
- /*
- Tests assume token prices
- WETH - $200
- MKR - $500
- DAI - $1
- XXX - $0
- */
-
- // Admin balances
- await weth.mint(admin, toWei('50'));
- await mkr.mint(admin, toWei('20'));
- await dai.mint(admin, toWei('10000'));
- await xxx.mint(admin, toWei('10'));
-
- // User1 balances
- await weth.mint(user1, toWei('25'), { from: admin });
- await mkr.mint(user1, toWei('4'), { from: admin });
- await dai.mint(user1, toWei('40000'), { from: admin });
- await xxx.mint(user1, toWei('10'), { from: admin });
-
- // User2 balances
- await weth.mint(user2, toWei('12.2222'), { from: admin });
- await mkr.mint(user2, toWei('1.015333'), { from: admin });
- await dai.mint(user2, toWei('0'), { from: admin });
- await xxx.mint(user2, toWei('51'), { from: admin });
- });
-
- describe('Binding Tokens', () => {
- it('Controller is msg.sender', async () => {
- const controller = await pool.getController();
- assert.equal(controller, admin);
- });
-
- it('Pool starts with no bound tokens', async () => {
- const numTokens = await pool.getNumTokens();
- assert.equal(0, numTokens);
- const isBound = await pool.isBound.call(WETH);
- assert(!isBound);
- });
-
- it('Fails binding tokens that are not approved', async () => {
- await truffleAssert.reverts(
- pool.bind(MKR, toWei('10'), toWei('2.5')),
- 'ERR_BTOKEN_BAD_CALLER',
- );
- });
-
- it('Admin approves tokens', async () => {
- await weth.approve(POOL, MAX);
- await mkr.approve(POOL, MAX);
- await dai.approve(POOL, MAX);
- await xxx.approve(POOL, MAX);
- });
-
- it('Fails binding weights and balances outside MIX MAX', async () => {
- await truffleAssert.reverts(
- pool.bind(WETH, toWei('51'), toWei('1')),
- 'ERR_INSUFFICIENT_BAL',
- );
- await truffleAssert.reverts(
- pool.bind(MKR, toWei('0.0000000000001'), toWei('1')),
- 'ERR_MIN_BALANCE',
- );
- await truffleAssert.reverts(
- pool.bind(DAI, toWei('1000'), toWei('0.99')),
- 'ERR_MIN_WEIGHT',
- );
- await truffleAssert.reverts(
- pool.bind(WETH, toWei('5'), toWei('50.01')),
- 'ERR_MAX_WEIGHT',
- );
- });
-
- it('Fails finalizing pool without 2 tokens', async () => {
- await truffleAssert.reverts(
- pool.finalize(),
- 'ERR_MIN_TOKENS',
- );
- });
-
- it('Admin binds tokens', async () => {
- // Equal weights WETH, MKR, DAI
- await pool.bind(WETH, toWei('50'), toWei('5'));
- await pool.bind(MKR, toWei('20'), toWei('5'));
- await pool.bind(DAI, toWei('10000'), toWei('5'));
- const numTokens = await pool.getNumTokens();
- assert.equal(3, numTokens);
- const totalDernomWeight = await pool.getTotalDenormalizedWeight();
- assert.equal(15, fromWei(totalDernomWeight));
- const wethDenormWeight = await pool.getDenormalizedWeight(WETH);
- assert.equal(5, fromWei(wethDenormWeight));
- const wethNormWeight = await pool.getNormalizedWeight(WETH);
- assert.equal(0.333333333333333333, fromWei(wethNormWeight));
- const mkrBalance = await pool.getBalance(MKR);
- assert.equal(20, fromWei(mkrBalance));
- });
-
- it('Admin unbinds token', async () => {
- await pool.bind(XXX, toWei('10'), toWei('5'));
- let adminBalance = await xxx.balanceOf(admin);
- assert.equal(0, fromWei(adminBalance));
- await pool.unbind(XXX);
- adminBalance = await xxx.balanceOf(admin);
- assert.equal(10, fromWei(adminBalance));
- const numTokens = await pool.getNumTokens();
- assert.equal(3, numTokens);
- const totalDernomWeight = await pool.getTotalDenormalizedWeight();
- assert.equal(15, fromWei(totalDernomWeight));
- });
-
- it('Fails binding above MAX TOTAL WEIGHT', async () => {
- await truffleAssert.reverts(
- pool.bind(XXX, toWei('1'), toWei('40')),
- 'ERR_MAX_TOTAL_WEIGHT',
- );
- });
-
- it('Fails rebinding token or unbinding random token', async () => {
- await truffleAssert.reverts(
- pool.bind(WETH, toWei('0'), toWei('1')),
- 'ERR_IS_BOUND',
- );
- await truffleAssert.reverts(
- pool.rebind(XXX, toWei('0'), toWei('1')),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.unbind(XXX),
- 'ERR_NOT_BOUND',
- );
- });
-
- it('Get current tokens', async () => {
- const currentTokens = await pool.getCurrentTokens();
- assert.sameMembers(currentTokens, [WETH, MKR, DAI]);
- });
-
- it('Fails getting final tokens before finalized', async () => {
- await truffleAssert.reverts(
- pool.getFinalTokens(),
- 'ERR_NOT_FINALIZED',
- );
- });
- });
-
-
- describe('Finalizing pool', () => {
- it('Fails when other users interact before finalizing', async () => {
- await truffleAssert.reverts(
- pool.bind(WETH, toWei('5'), toWei('5'), { from: user1 }),
- 'ERR_NOT_CONTROLLER',
- );
- await truffleAssert.reverts(
- pool.rebind(WETH, toWei('5'), toWei('5'), { from: user1 }),
- 'ERR_NOT_CONTROLLER',
- );
- await truffleAssert.reverts(
- pool.joinPool(toWei('1'), [MAX, MAX], { from: user1 }),
- 'ERR_NOT_FINALIZED',
- );
- await truffleAssert.reverts(
- pool.exitPool(toWei('1'), [toWei('0'), toWei('0')], { from: user1 }),
- 'ERR_NOT_FINALIZED',
- );
- await truffleAssert.reverts(
- pool.unbind(DAI, { from: user1 }),
- 'ERR_NOT_CONTROLLER',
- );
- });
-
- it('Fails calling any swap before finalizing', async () => {
- await truffleAssert.reverts(
- pool.swapExactAmountIn(WETH, toWei('2.5'), DAI, toWei('475'), toWei('200')),
- 'ERR_SWAP_NOT_PUBLIC',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountIn(DAI, toWei('2.5'), WETH, toWei('475'), toWei('200')),
- 'ERR_SWAP_NOT_PUBLIC',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountOut(WETH, toWei('2.5'), DAI, toWei('475'), toWei('200')),
- 'ERR_SWAP_NOT_PUBLIC',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountOut(DAI, toWei('2.5'), WETH, toWei('475'), toWei('200')),
- 'ERR_SWAP_NOT_PUBLIC',
- );
- });
-
- it('Fails calling any join exit swap before finalizing', async () => {
- await truffleAssert.reverts(
- pool.joinswapExternAmountIn(WETH, toWei('2.5'), toWei('0')),
- 'ERR_NOT_FINALIZED',
- );
- await truffleAssert.reverts(
- pool.joinswapPoolAmountOut(WETH, toWei('2.5'), MAX),
- 'ERR_NOT_FINALIZED',
- );
- await truffleAssert.reverts(
- pool.exitswapPoolAmountIn(WETH, toWei('2.5'), toWei('0')),
- 'ERR_NOT_FINALIZED',
- );
- await truffleAssert.reverts(
- pool.exitswapExternAmountOut(WETH, toWei('2.5'), MAX),
- 'ERR_NOT_FINALIZED',
- );
- });
-
- it('Only controller can setPublicSwap', async () => {
- await pool.setPublicSwap(true);
- const publicSwap = pool.isPublicSwap();
- assert(publicSwap);
- await truffleAssert.reverts(pool.setPublicSwap(true, { from: user1 }), 'ERR_NOT_CONTROLLER');
- });
-
- it('Fails setting low swap fees', async () => {
- await truffleAssert.reverts(
- pool.setSwapFee(toWei('0.0000001')),
- 'ERR_MIN_FEE',
- );
- });
-
- it('Fails setting high swap fees', async () => {
- await truffleAssert.reverts(
- pool.setSwapFee(toWei('0.11')),
- 'ERR_MAX_FEE',
- );
- });
-
- it('Fails nonadmin sets fees or controller', async () => {
- await truffleAssert.reverts(
- pool.setSwapFee(toWei('0.003'), { from: user1 }),
- 'ERR_NOT_CONTROLLER',
- );
- await truffleAssert.reverts(
- pool.setController(user1, { from: user1 }),
- 'ERR_NOT_CONTROLLER',
- );
- });
-
- it('Admin sets swap fees', async () => {
- await pool.setSwapFee(toWei('0.003'));
- const swapFee = await pool.getSwapFee();
- assert.equal(0.003, fromWei(swapFee));
- });
-
- it('Fails nonadmin finalizes pool', async () => {
- await truffleAssert.reverts(
- pool.finalize({ from: user1 }),
- 'ERR_NOT_CONTROLLER',
- );
- });
-
- it('Admin finalizes pool', async () => {
- const tx = await pool.finalize();
- const adminBal = await pool.balanceOf(admin);
- assert.equal(100, fromWei(adminBal));
- truffleAssert.eventEmitted(tx, 'Transfer', (event) => event.dst === admin);
- const finalized = pool.isFinalized();
- assert(finalized);
- });
-
- it('Fails finalizing pool after finalized', async () => {
- await truffleAssert.reverts(
- pool.finalize(),
- 'ERR_IS_FINALIZED',
- );
- });
-
- it('Cant setPublicSwap, setSwapFee when finalized', async () => {
- await truffleAssert.reverts(pool.setPublicSwap(false), 'ERR_IS_FINALIZED');
- await truffleAssert.reverts(pool.setSwapFee(toWei('0.01')), 'ERR_IS_FINALIZED');
- });
-
- it('Fails binding new token after finalized', async () => {
- await truffleAssert.reverts(
- pool.bind(XXX, toWei('10'), toWei('5')),
- 'ERR_IS_FINALIZED',
- );
- await truffleAssert.reverts(
- pool.rebind(DAI, toWei('10'), toWei('5')),
- 'ERR_IS_FINALIZED',
- );
- });
-
- it('Fails unbinding after finalized', async () => {
- await truffleAssert.reverts(
- pool.unbind(WETH),
- 'ERR_IS_FINALIZED',
- );
- });
-
- it('Get final tokens', async () => {
- const finalTokens = await pool.getFinalTokens();
- assert.sameMembers(finalTokens, [WETH, MKR, DAI]);
- });
- });
-
- describe('User interactions', () => {
- it('Other users approve tokens', async () => {
- await weth.approve(POOL, MAX, { from: user1 });
- await mkr.approve(POOL, MAX, { from: user1 });
- await dai.approve(POOL, MAX, { from: user1 });
- await xxx.approve(POOL, MAX, { from: user1 });
-
- await weth.approve(POOL, MAX, { from: user2 });
- await mkr.approve(POOL, MAX, { from: user2 });
- await dai.approve(POOL, MAX, { from: user2 });
- await xxx.approve(POOL, MAX, { from: user2 });
- });
-
- it('User1 joins pool', async () => {
- await pool.joinPool(toWei('5'), [MAX, MAX, MAX], { from: user1 });
- const daiBalance = await pool.getBalance(DAI);
- assert.equal(10500, fromWei(daiBalance));
- const userWethBalance = await weth.balanceOf(user1);
- assert.equal(22.5, fromWei(userWethBalance));
- });
-
- /*
- Current pool balances
- WETH - 52.5
- MKR - 21
- DAI - 10,500
- XXX - 0
- */
-
- it('Fails admin unbinding token after finalized and others joined', async () => {
- await truffleAssert.reverts(pool.unbind(DAI), 'ERR_IS_FINALIZED');
- });
-
- it('getSpotPriceSansFee and getSpotPrice', async () => {
- const wethPrice = await pool.getSpotPriceSansFee(DAI, WETH);
- assert.equal(200, fromWei(wethPrice));
-
- const wethPriceFee = await pool.getSpotPrice(DAI, WETH);
- const wethPriceFeeCheck = ((10500 / 5) / (52.5 / 5)) * (1 / (1 - 0.003));
- // 200.6018054162487462
- assert.equal(fromWei(wethPriceFee), wethPriceFeeCheck);
- });
-
- it('Fail swapExactAmountIn unbound or over min max ratios', async () => {
- await truffleAssert.reverts(
- pool.swapExactAmountIn(WETH, toWei('2.5'), XXX, toWei('100'), toWei('200'), { from: user2 }),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountIn(WETH, toWei('26.5'), DAI, toWei('5000'), toWei('200'), { from: user2 }),
- 'ERR_MAX_IN_RATIO',
- );
- });
-
- it('swapExactAmountIn', async () => {
- // 2.5 WETH -> DAI
- const expected = calcOutGivenIn(52.5, 5, 10500, 5, 2.5, 0.003);
- const txr = await pool.swapExactAmountIn(
- WETH,
- toWei('2.5'),
- DAI,
- toWei('475'),
- toWei('200'),
- { from: user2 },
- );
- const log = txr.logs[0];
- assert.equal(log.event, 'LOG_SWAP');
- // 475.905805337091423
-
- const actual = fromWei(log.args[4]);
- const relDif = calcRelativeDiff(expected, actual);
- if (verbose) {
- console.log('swapExactAmountIn');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
-
- const userDaiBalance = await dai.balanceOf(user2);
- assert.equal(fromWei(userDaiBalance), Number(fromWei(log.args[4])));
-
- // 182.804672101083406128
- const wethPrice = await pool.getSpotPrice(DAI, WETH);
- const wethPriceFeeCheck = ((10024.094194662908577 / 5) / (55 / 5)) * (1 / (1 - 0.003));
- assert.approximately(Number(fromWei(wethPrice)), Number(wethPriceFeeCheck), errorDelta);
-
- const daiNormWeight = await pool.getNormalizedWeight(DAI);
- assert.equal(0.333333333333333333, fromWei(daiNormWeight));
- });
-
- it('swapExactAmountOut', async () => {
- // ETH -> 1 MKR
- // const amountIn = (55 * (((21 / (21 - 1)) ** (5 / 5)) - 1)) / (1 - 0.003);
- const expected = calcInGivenOut(55, 5, 21, 5, 1, 0.003);
- const txr = await pool.swapExactAmountOut(
- WETH,
- toWei('3'),
- MKR,
- toWei('1.0'),
- toWei('500'),
- { from: user2 },
- );
- const log = txr.logs[0];
- assert.equal(log.event, 'LOG_SWAP');
- // 2.758274824473420261
-
- const actual = fromWei(log.args[3]);
- const relDif = calcRelativeDiff(expected, actual);
- if (verbose) {
- console.log('swapExactAmountOut');
- console.log(`expected: ${expected})`);
- console.log(`actual : ${actual})`);
- console.log(`relDif : ${relDif})`);
- }
-
- assert.isAtMost(relDif.toNumber(), errorDelta);
- });
-
- it('Fails joins exits with limits', async () => {
- await truffleAssert.reverts(
- pool.joinPool(toWei('10'), [toWei('1'), toWei('1'), toWei('1')]),
- 'ERR_LIMIT_IN',
- );
-
- await truffleAssert.reverts(
- pool.exitPool(toWei('10'), [toWei('10'), toWei('10'), toWei('10')]),
- 'ERR_LIMIT_OUT',
- );
-
- await truffleAssert.reverts(
- pool.joinswapExternAmountIn(DAI, toWei('100'), toWei('10')),
- 'ERR_LIMIT_OUT',
- );
-
- await truffleAssert.reverts(
- pool.joinswapPoolAmountOut(DAI, toWei('10'), toWei('100')),
- 'ERR_LIMIT_IN',
- );
-
- await truffleAssert.reverts(
- pool.exitswapPoolAmountIn(DAI, toWei('1'), toWei('1000')),
- 'ERR_LIMIT_OUT',
- );
-
- await truffleAssert.reverts(
- pool.exitswapExternAmountOut(DAI, toWei('1000'), toWei('1')),
- 'ERR_LIMIT_IN',
- );
- });
-
- it('Fails calling any swap on unbound token', async () => {
- await truffleAssert.reverts(
- pool.swapExactAmountIn(XXX, toWei('2.5'), DAI, toWei('475'), toWei('200')),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountIn(DAI, toWei('2.5'), XXX, toWei('475'), toWei('200')),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountOut(XXX, toWei('2.5'), DAI, toWei('475'), toWei('200')),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountOut(DAI, toWei('2.5'), XXX, toWei('475'), toWei('200')),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.joinswapExternAmountIn(XXX, toWei('2.5'), toWei('0')),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.joinswapPoolAmountOut(XXX, toWei('2.5'), MAX),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.exitswapPoolAmountIn(XXX, toWei('2.5'), toWei('0')),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.exitswapExternAmountOut(XXX, toWei('2.5'), MAX),
- 'ERR_NOT_BOUND',
- );
- });
-
- it('Fails calling weights, balances, spot prices on unbound token', async () => {
- await truffleAssert.reverts(
- pool.getDenormalizedWeight(XXX),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.getNormalizedWeight(XXX),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.getBalance(XXX),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.getSpotPrice(DAI, XXX),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.getSpotPrice(XXX, DAI),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.getSpotPriceSansFee(DAI, XXX),
- 'ERR_NOT_BOUND',
- );
- await truffleAssert.reverts(
- pool.getSpotPriceSansFee(XXX, DAI),
- 'ERR_NOT_BOUND',
- );
- });
- });
-
- describe('BToken interactions', () => {
- it('Token descriptors', async () => {
- const name = await pool.name();
- assert.equal(name, 'Balancer Pool Token');
-
- const symbol = await pool.symbol();
- assert.equal(symbol, 'BPT');
-
- const decimals = await pool.decimals();
- assert.equal(decimals, 18);
- });
-
- it('Token allowances', async () => {
- await pool.approve(user1, toWei('50'));
- let allowance = await pool.allowance(admin, user1);
- assert.equal(fromWei(allowance), 50);
-
- await pool.increaseApproval(user1, toWei('50'));
- allowance = await pool.allowance(admin, user1);
- assert.equal(fromWei(allowance), 100);
-
- await pool.decreaseApproval(user1, toWei('50'));
- allowance = await pool.allowance(admin, user1);
- assert.equal(fromWei(allowance), 50);
-
- await pool.decreaseApproval(user1, toWei('100'));
- allowance = await pool.allowance(admin, user1);
- assert.equal(fromWei(allowance), 0);
- });
-
- it('Token transfers', async () => {
- await truffleAssert.reverts(
- pool.transferFrom(user2, admin, toWei('10')),
- 'ERR_BTOKEN_BAD_CALLER',
- );
-
- await pool.transferFrom(admin, user2, toWei('1'));
- await pool.approve(user2, toWei('10'));
- await pool.transferFrom(admin, user2, toWei('1'), { from: user2 });
- });
- });
-});
diff --git a/test/pool_max_tokens.js b/test/pool_max_tokens.js
deleted file mode 100644
index d97420dd..00000000
--- a/test/pool_max_tokens.js
+++ /dev/null
@@ -1,199 +0,0 @@
-const truffleAssert = require('truffle-assertions');
-
-const BPool = artifacts.require('BPool');
-const BFactory = artifacts.require('BFactory');
-const TToken = artifacts.require('TToken');
-
-contract('BPool', async (accounts) => {
- const admin = accounts[0];
-
- const { toWei } = web3.utils;
- const { fromWei } = web3.utils;
-
- const MAX = web3.utils.toTwosComplement(-1);
-
- let AAA; let BBB; let CCC; let DDD; let EEE; let FFF; let GGG; let HHH; let
- ZZZ; // addresses
- let aaa; let bbb; let ccc; let ddd; let eee; let fff; let ggg; let hhh; let
- zzz; // TTokens
- let factory; // BPool factory
- let FACTORY; // factory address
- let pool; // first pool w/ defaults
- let POOL; // pool address
-
- before(async () => {
- factory = await BFactory.deployed();
- FACTORY = factory.address;
-
- POOL = await factory.newBPool.call();
- await factory.newBPool();
- pool = await BPool.at(POOL);
-
- aaa = await TToken.new('AAA', 'AAA', 18);
- bbb = await TToken.new('BBB', 'BBB', 18);
- ccc = await TToken.new('CCC', 'CCC', 18);
- ddd = await TToken.new('DDD', 'EEE', 18);
- eee = await TToken.new('EEE', 'EEE', 18);
- fff = await TToken.new('FFF', 'FFF', 18);
- ggg = await TToken.new('GGG', 'GGG', 18);
- hhh = await TToken.new('HHH', 'HHH', 18);
- zzz = await TToken.new('ZZZ', 'ZZZ', 18);
-
- AAA = aaa.address;
- BBB = bbb.address;
- CCC = ccc.address;
- DDD = ddd.address;
- EEE = eee.address;
- FFF = fff.address;
- GGG = ggg.address;
- HHH = hhh.address;
- ZZZ = zzz.address;
-
- // Admin balances
- await aaa.mint(admin, toWei('100'));
- await bbb.mint(admin, toWei('100'));
- await ccc.mint(admin, toWei('100'));
- await ddd.mint(admin, toWei('100'));
- await eee.mint(admin, toWei('100'));
- await fff.mint(admin, toWei('100'));
- await ggg.mint(admin, toWei('100'));
- await hhh.mint(admin, toWei('100'));
- await zzz.mint(admin, toWei('100'));
- });
-
- describe('Binding Tokens', () => {
- it('Admin approves tokens', async () => {
- await aaa.approve(POOL, MAX);
- await bbb.approve(POOL, MAX);
- await ccc.approve(POOL, MAX);
- await ddd.approve(POOL, MAX);
- await eee.approve(POOL, MAX);
- await fff.approve(POOL, MAX);
- await ggg.approve(POOL, MAX);
- await hhh.approve(POOL, MAX);
- await zzz.approve(POOL, MAX);
- });
-
- it('Admin binds tokens', async () => {
- await pool.bind(AAA, toWei('50'), toWei('1'));
- await pool.bind(BBB, toWei('50'), toWei('3'));
- await pool.bind(CCC, toWei('50'), toWei('2.5'));
- await pool.bind(DDD, toWei('50'), toWei('7'));
- await pool.bind(EEE, toWei('50'), toWei('10'));
- await pool.bind(FFF, toWei('50'), toWei('1.99'));
- await pool.bind(GGG, toWei('40'), toWei('6'));
- await pool.bind(HHH, toWei('70'), toWei('2.3'));
-
- const totalDernomWeight = await pool.getTotalDenormalizedWeight();
- assert.equal(33.79, fromWei(totalDernomWeight));
- });
-
- it('Fails binding more than 8 tokens', async () => {
- await truffleAssert.reverts(pool.bind(ZZZ, toWei('50'), toWei('2')), 'ERR_MAX_TOKENS');
- });
-
- it('Rebind token at a smaller balance', async () => {
- await pool.rebind(HHH, toWei('50'), toWei('2.1'));
- const balance = await pool.getBalance(HHH);
- assert.equal(fromWei(balance), 50);
-
- const adminBalance = await hhh.balanceOf(admin);
- assert.equal(fromWei(adminBalance), 50);
-
- const factoryBalance = await hhh.balanceOf(FACTORY);
- assert.equal(fromWei(factoryBalance), 0);
-
- const totalDernomWeight = await pool.getTotalDenormalizedWeight();
- assert.equal(33.59, fromWei(totalDernomWeight));
- });
-
- it('Fails gulp on unbound token', async () => {
- await truffleAssert.reverts(pool.gulp(ZZZ), 'ERR_NOT_BOUND');
- });
-
- it('Pool can gulp tokens', async () => {
- await ggg.transferFrom(admin, POOL, toWei('10'));
-
- await pool.gulp(GGG);
- const balance = await pool.getBalance(GGG);
- assert.equal(fromWei(balance), 50);
- });
-
- it('Fails swapExactAmountIn with limits', async () => {
- await pool.setPublicSwap(true);
- await truffleAssert.reverts(
- pool.swapExactAmountIn(
- AAA,
- toWei('1'),
- BBB,
- toWei('0'),
- toWei('0.9'),
- ),
- 'ERR_BAD_LIMIT_PRICE',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountIn(
- AAA,
- toWei('1'),
- BBB,
- toWei('2'),
- toWei('3.5'),
- ),
- 'ERR_LIMIT_OUT',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountIn(
- AAA,
- toWei('1'),
- BBB,
- toWei('0'),
- toWei('3.00001'),
- ),
- 'ERR_LIMIT_PRICE',
- );
- });
-
- it('Fails swapExactAmountOut with limits', async () => {
- await truffleAssert.reverts(
- pool.swapExactAmountOut(
- AAA,
- toWei('51'),
- BBB,
- toWei('40'),
- toWei('5'),
- ),
- 'ERR_MAX_OUT_RATIO',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountOut(
- AAA,
- toWei('5'),
- BBB,
- toWei('1'),
- toWei('1'),
- ),
- 'ERR_BAD_LIMIT_PRICE',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountOut(
- AAA,
- toWei('1'),
- BBB,
- toWei('1'),
- toWei('5'),
- ),
- 'ERR_LIMIT_IN',
- );
- await truffleAssert.reverts(
- pool.swapExactAmountOut(
- AAA,
- toWei('5'),
- BBB,
- toWei('1'),
- toWei('3.00001'),
- ),
- 'ERR_LIMIT_PRICE',
- );
- });
- });
-});
diff --git a/test/unit/BFactory.t.sol b/test/unit/BFactory.t.sol
new file mode 100644
index 00000000..3ee3e4fc
--- /dev/null
+++ b/test/unit/BFactory.t.sol
@@ -0,0 +1,184 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.23;
+
+import {BFactory} from 'contracts/BFactory.sol';
+import {BPool} from 'contracts/BPool.sol';
+import {IERC20} from 'contracts/BToken.sol';
+import {Test} from 'forge-std/Test.sol';
+
+abstract contract Base is Test {
+ BFactory public bFactory;
+ address public owner = makeAddr('owner');
+
+ function setUp() public {
+ vm.prank(owner);
+ bFactory = new BFactory();
+ }
+}
+
+contract BFactory_Unit_Constructor is Base {
+ /**
+ * @notice Test that the owner is set correctly
+ */
+ function test_Deploy() public view {
+ assertEq(owner, bFactory.getBLabs());
+ }
+}
+
+contract BFactory_Unit_IsBPool is Base {
+ /**
+ * @notice Test that a valid pool is present on the mapping
+ */
+ function test_Returns_IsValidPool(address _pool) public {
+ // Writing TRUE (1) to the mapping with the `_pool` key
+ vm.store(address(bFactory), keccak256(abi.encode(_pool, uint256(0))), bytes32(uint256(1)));
+ assertTrue(bFactory.isBPool(address(_pool)));
+ }
+
+ /**
+ * @notice Test that a invalid pool is not present on the mapping
+ */
+ function test_Returns_IsInvalidPool(address _randomPool) public view {
+ vm.assume(_randomPool != address(0));
+ assertFalse(bFactory.isBPool(_randomPool));
+ }
+}
+
+contract BFactory_Unit_NewBPool is Base {
+ /**
+ * @notice Test that the pool is set on the mapping
+ */
+ function test_Set_Pool() public {
+ BPool _pool = bFactory.newBPool();
+ assertTrue(bFactory.isBPool(address(_pool)));
+ }
+
+ /**
+ * @notice Test that event is emitted
+ */
+ function test_Emit_Log(address _randomCaller) public {
+ assumeNotForgeAddress(_randomCaller);
+
+ vm.expectEmit();
+ address _expectedPoolAddress = vm.computeCreateAddress(address(bFactory), 1);
+ emit BFactory.LOG_NEW_POOL(_randomCaller, _expectedPoolAddress);
+ vm.prank(_randomCaller);
+ bFactory.newBPool();
+ }
+
+ /**
+ * @notice Test that msg.sender is set as the controller
+ */
+ function test_Set_Controller(address _randomCaller) public {
+ assumeNotForgeAddress(_randomCaller);
+
+ vm.prank(_randomCaller);
+ BPool _pool = bFactory.newBPool();
+ assertEq(_randomCaller, _pool.getController());
+ }
+
+ /**
+ * @notice Test that the pool address is returned
+ */
+ function test_Returns_Pool() public {
+ address _expectedPoolAddress = vm.computeCreateAddress(address(bFactory), 1);
+ BPool _pool = bFactory.newBPool();
+ assertEq(_expectedPoolAddress, address(_pool));
+ }
+}
+
+contract BFactory_Unit_GetBLabs is Base {
+ /**
+ * @notice Test that the correct owner is returned
+ */
+ function test_Set_Owner(address _randomDeployer) public {
+ vm.prank(_randomDeployer);
+ BFactory _bFactory = new BFactory();
+ assertEq(_randomDeployer, _bFactory.getBLabs());
+ }
+}
+
+contract BFactory_Unit_SetBLabs is Base {
+ /**
+ * @notice Test that only the owner can set the BLabs
+ */
+ function test_Revert_NotLabs(address _randomCaller) public {
+ vm.assume(_randomCaller != owner);
+ vm.expectRevert('ERR_NOT_BLABS');
+ vm.prank(_randomCaller);
+ bFactory.setBLabs(_randomCaller);
+ }
+
+ /**
+ * @notice Test that event is emitted
+ */
+ function test_Emit_Log(address _addressToSet) public {
+ vm.expectEmit();
+ emit BFactory.LOG_BLABS(owner, _addressToSet);
+ vm.prank(owner);
+ bFactory.setBLabs(_addressToSet);
+ }
+
+ /**
+ * @notice Test that the BLabs is set correctly
+ */
+ function test_Set_BLabs(address _addressToSet) public {
+ vm.prank(owner);
+ bFactory.setBLabs(_addressToSet);
+ assertEq(_addressToSet, bFactory.getBLabs());
+ }
+}
+
+contract BFactory_Unit_Collect is Base {
+ /**
+ * @notice Test that only the owner can collect
+ */
+ function test_Revert_NotLabs(address _randomCaller) public {
+ vm.assume(_randomCaller != owner);
+ vm.expectRevert('ERR_NOT_BLABS');
+ vm.prank(_randomCaller);
+ bFactory.collect(BPool(address(0)));
+ }
+
+ /**
+ * @notice Test that LP token `balanceOf` function is called
+ */
+ function test_Call_BalanceOf(address _lpToken, uint256 _toCollect) public {
+ assumeNotForgeAddress(_lpToken);
+
+ vm.mockCall(_lpToken, abi.encodeWithSelector(IERC20.balanceOf.selector, address(bFactory)), abi.encode(_toCollect));
+ vm.mockCall(_lpToken, abi.encodeWithSelector(IERC20.transfer.selector, owner, _toCollect), abi.encode(true));
+
+ vm.expectCall(_lpToken, abi.encodeWithSelector(IERC20.balanceOf.selector, address(bFactory)));
+ vm.prank(owner);
+ bFactory.collect(BPool(_lpToken));
+ }
+
+ /**
+ * @notice Test that LP token `transfer` function is called
+ */
+ function test_Call_Transfer(address _lpToken, uint256 _toCollect) public {
+ assumeNotForgeAddress(_lpToken);
+
+ vm.mockCall(_lpToken, abi.encodeWithSelector(IERC20.balanceOf.selector, address(bFactory)), abi.encode(_toCollect));
+ vm.mockCall(_lpToken, abi.encodeWithSelector(IERC20.transfer.selector, owner, _toCollect), abi.encode(true));
+
+ vm.expectCall(_lpToken, abi.encodeWithSelector(IERC20.transfer.selector, owner, _toCollect));
+ vm.prank(owner);
+ bFactory.collect(BPool(_lpToken));
+ }
+
+ /**
+ * @notice Test that the function fail if the transfer failed
+ */
+ function test_Revert_TransferFailed(address _lpToken, uint256 _toCollect) public {
+ assumeNotForgeAddress(_lpToken);
+
+ vm.mockCall(_lpToken, abi.encodeWithSelector(IERC20.balanceOf.selector, address(bFactory)), abi.encode(_toCollect));
+ vm.mockCall(_lpToken, abi.encodeWithSelector(IERC20.transfer.selector, owner, _toCollect), abi.encode(false));
+
+ vm.expectRevert('ERR_ERC20_FAILED');
+ vm.prank(owner);
+ bFactory.collect(BPool(_lpToken));
+ }
+}
diff --git a/test/unit/BPool.t.sol b/test/unit/BPool.t.sol
new file mode 100644
index 00000000..d4d61b7d
--- /dev/null
+++ b/test/unit/BPool.t.sol
@@ -0,0 +1,3307 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.23;
+
+import {BPool} from 'contracts/BPool.sol';
+import {MockBPool} from 'test/smock/MockBPool.sol';
+
+import {BConst} from 'contracts/BConst.sol';
+import {BMath} from 'contracts/BMath.sol';
+import {IERC20} from 'contracts/BToken.sol';
+import {Test} from 'forge-std/Test.sol';
+import {LibString} from 'solmate/utils/LibString.sol';
+import {Pow} from 'test/utils/Pow.sol';
+import {Utils} from 'test/utils/Utils.sol';
+
+abstract contract BasePoolTest is Test, BConst, Utils, BMath {
+ using LibString for uint256;
+
+ MockBPool public bPool;
+
+ // Deploy this external contract to perform a try-catch when calling bpow.
+ // If the call fails, it means that the function overflowed, then we reject the fuzzed inputs
+ Pow public pow = new Pow();
+
+ function setUp() public {
+ bPool = new MockBPool();
+
+ // Create fake tokens
+ for (uint256 i = 0; i < tokens.length; i++) {
+ tokens[i] = makeAddr(i.toString());
+ }
+ }
+
+ function _setRandomTokens(uint256 _length) internal returns (address[] memory _tokensToAdd) {
+ _tokensToAdd = new address[](_length);
+ for (uint256 i = 0; i < _length; i++) {
+ _tokensToAdd[i] = makeAddr(i.toString());
+ _setRecord(_tokensToAdd[i], BPool.Record({bound: true, index: i, denorm: 0, balance: 0}));
+ }
+ _setTokens(_tokensToAdd);
+ }
+
+ function _mockTransfer(address _token) internal {
+ // TODO: add amount to transfer to check that it's called with the right amount
+ vm.mockCall(_token, abi.encodeWithSelector(IERC20(_token).transfer.selector), abi.encode(true));
+ }
+
+ function _mockTransferFrom(address _token) internal {
+ // TODO: add from and amount to transfer to check that it's called with the right params
+ vm.mockCall(_token, abi.encodeWithSelector(IERC20(_token).transferFrom.selector), abi.encode(true));
+ }
+
+ function _mockBalanceOf(address _token, address _account, uint256 _balance) internal {
+ vm.mockCall(
+ _token, abi.encodeWithSelector(IERC20(_token).balanceOf.selector, address(_account)), abi.encode(_balance)
+ );
+ }
+
+ function _setTokens(address[] memory _tokens) internal {
+ bPool.set__tokens(_tokens);
+ }
+
+ function _setRecord(address _token, BPool.Record memory _record) internal {
+ bPool.set__records(_token, _record);
+ }
+
+ function _setPublicSwap(bool _isPublicSwap) internal {
+ bPool.set__publicSwap(_isPublicSwap);
+ }
+
+ function _setSwapFee(uint256 _swapFee) internal {
+ bPool.set__swapFee(_swapFee);
+ }
+
+ function _setFinalize(bool _isFinalized) internal {
+ bPool.set__finalized(_isFinalized);
+ }
+
+ function _setPoolBalance(address _user, uint256 _balance) internal {
+ deal(address(bPool), _user, _balance, true);
+ }
+
+ function _setTotalSupply(uint256 _totalSupply) internal {
+ _setPoolBalance(address(0), _totalSupply);
+ }
+
+ function _setTotalWeight(uint256 _totalWeight) internal {
+ bPool.set__totalWeight(_totalWeight);
+ }
+
+ function _expectRevertByReentrancy() internal {
+ // Assert that the contract is accessible
+ assertEq(bPool.call__mutex(), false);
+
+ // Simulate ongoing call to the contract
+ bPool.set__mutex(true);
+
+ vm.expectRevert('ERR_REENTRY');
+ }
+
+ function _assumeCalcSpotPrice(
+ uint256 _tokenInBalance,
+ uint256 _tokenInDenorm,
+ uint256 _tokenOutBalance,
+ uint256 _tokenOutDenorm,
+ uint256 _swapFee
+ ) internal pure {
+ vm.assume(_tokenInDenorm > 0);
+ vm.assume(_tokenInBalance < type(uint256).max / BONE);
+ vm.assume(_tokenInBalance * BONE < type(uint256).max - (_tokenInDenorm / 2));
+
+ uint256 _numer = bdiv(_tokenInBalance, _tokenInDenorm);
+ vm.assume(_tokenOutDenorm > 0);
+ vm.assume(_tokenOutBalance < type(uint256).max / BONE);
+ vm.assume(_tokenOutBalance * BONE < type(uint256).max - (_tokenOutDenorm / 2));
+
+ uint256 _denom = bdiv(_tokenOutBalance, _tokenOutDenorm);
+ vm.assume(_denom > 0);
+ vm.assume(_numer < type(uint256).max / BONE);
+ vm.assume(_numer * BONE < type(uint256).max - (_denom / 2));
+ vm.assume(_swapFee <= BONE);
+
+ uint256 _ratio = bdiv(_numer, _denom);
+ vm.assume(bsub(BONE, _swapFee) > 0);
+
+ uint256 _scale = bdiv(BONE, bsub(BONE, _swapFee));
+ vm.assume(_ratio < type(uint256).max / _scale);
+ }
+
+ function _assumeCalcInGivenOut(
+ uint256 _tokenOutDenorm,
+ uint256 _tokenInDenorm,
+ uint256 _tokenOutBalance,
+ uint256 _tokenAmountOut,
+ uint256 _tokenInBalance
+ ) internal pure {
+ uint256 _weightRatio = bdiv(_tokenOutDenorm, _tokenInDenorm);
+ uint256 _diff = bsub(_tokenOutBalance, _tokenAmountOut);
+ uint256 _y = bdiv(_tokenOutBalance, _diff);
+ uint256 _foo = bpow(_y, _weightRatio);
+ vm.assume(bsub(_foo, BONE) < type(uint256).max / _tokenInBalance);
+ }
+
+ function _assumeCalcOutGivenIn(uint256 _tokenInBalance, uint256 _tokenAmountIn, uint256 _swapFee) internal pure {
+ uint256 _adjustedIn = bsub(BONE, _swapFee);
+ _adjustedIn = bmul(_tokenAmountIn, _adjustedIn);
+ vm.assume(_tokenInBalance < type(uint256).max / BONE);
+ vm.assume(_tokenInBalance * BONE < type(uint256).max - (badd(_tokenInBalance, _adjustedIn) / 2));
+ }
+
+ function _assumeCalcPoolOutGivenSingleIn(
+ uint256 _tokenInDenorm,
+ uint256 _tokenInBalance,
+ uint256 _tokenAmountIn,
+ uint256 _swapFee,
+ uint256 _totalWeight,
+ uint256 _totalSupply
+ ) internal pure {
+ uint256 _normalizedWeight = bdiv(_tokenInDenorm, _totalWeight);
+ vm.assume(_normalizedWeight < bdiv(MAX_WEIGHT, MAX_TOTAL_WEIGHT));
+
+ uint256 _zaz = bmul(bsub(BONE, _normalizedWeight), _swapFee);
+ uint256 _tokenAmountInAfterFee = bmul(_tokenAmountIn, bsub(BONE, _zaz));
+ uint256 _newTokenBalanceIn = badd(_tokenInBalance, _tokenAmountInAfterFee);
+ vm.assume(_newTokenBalanceIn < type(uint256).max / BONE);
+ vm.assume(_newTokenBalanceIn > _tokenInBalance);
+
+ uint256 _tokenInRatio = bdiv(_newTokenBalanceIn, _tokenInBalance);
+ uint256 _poolRatio = bpow(_tokenInRatio, _normalizedWeight);
+ vm.assume(_poolRatio < type(uint256).max / _totalSupply);
+ }
+
+ function _assumeCalcSingleInGivenPoolOut(
+ uint256 _tokenInBalance,
+ uint256 _tokenInDenorm,
+ uint256 _poolSupply,
+ uint256 _totalWeight,
+ uint256 _poolAmountOut
+ ) internal view {
+ uint256 _normalizedWeight = bdiv(_tokenInDenorm, _totalWeight);
+ uint256 _newPoolSupply = badd(_poolSupply, _poolAmountOut);
+ vm.assume(_newPoolSupply < type(uint256).max / BONE);
+ vm.assume(_newPoolSupply * BONE < type(uint256).max - (_poolSupply / 2)); // bdiv require
+
+ uint256 _poolRatio = bdiv(_newPoolSupply, _poolSupply);
+ vm.assume(_poolRatio < MAX_BPOW_BASE);
+ vm.assume(BONE > _normalizedWeight);
+
+ uint256 _boo = bdiv(BONE, _normalizedWeight);
+ uint256 _tokenRatio;
+ try pow.pow(_poolRatio, _boo) returns (uint256 _result) {
+ // pow didn't overflow
+ _tokenRatio = _result;
+ } catch {
+ // pow did an overflow. Reject this inputs
+ vm.assume(false);
+ }
+
+ vm.assume(_tokenRatio < type(uint256).max / _tokenInBalance);
+ }
+
+ function _assumeCalcSingleOutGivenPoolIn(
+ uint256 _tokenOutBalance,
+ uint256 _tokenOutDenorm,
+ uint256 _poolSupply,
+ uint256 _totalWeight,
+ uint256 _poolAmountIn,
+ uint256 _swapFee
+ ) internal pure {
+ uint256 _normalizedWeight = bdiv(_tokenOutDenorm, _totalWeight);
+ uint256 _exitFee = bsub(BONE, EXIT_FEE);
+ vm.assume(_poolAmountIn < type(uint256).max / _exitFee);
+
+ uint256 _poolAmountInAfterExitFee = bmul(_poolAmountIn, _exitFee);
+ uint256 _newPoolSupply = bsub(_poolSupply, _poolAmountInAfterExitFee);
+ vm.assume(_newPoolSupply < type(uint256).max / BONE);
+ vm.assume(_newPoolSupply * BONE < type(uint256).max - (_poolSupply / 2)); // bdiv require
+
+ uint256 _poolRatio = bdiv(_newPoolSupply, _poolSupply);
+ vm.assume(_poolRatio < MAX_BPOW_BASE);
+ vm.assume(_poolRatio > MIN_BPOW_BASE);
+ vm.assume(BONE > _normalizedWeight);
+
+ uint256 _tokenOutRatio = bpow(_poolRatio, bdiv(BONE, _normalizedWeight));
+ vm.assume(_tokenOutRatio < type(uint256).max / _tokenOutBalance);
+
+ uint256 _newTokenOutBalance = bmul(_tokenOutRatio, _tokenOutBalance);
+ uint256 _tokenAmountOutBeforeSwapFee = bsub(_tokenOutBalance, _newTokenOutBalance);
+ uint256 _zaz = bmul(bsub(BONE, _normalizedWeight), _swapFee);
+ vm.assume(_tokenAmountOutBeforeSwapFee < type(uint256).max / bsub(BONE, _zaz));
+ }
+
+ function _assumeCalcPoolInGivenSingleOut(
+ uint256 _tokenOutBalance,
+ uint256 _tokenOutDenorm,
+ uint256 _poolSupply,
+ uint256 _totalWeight,
+ uint256 _tokenAmountOut,
+ uint256 _swapFee
+ ) internal pure {
+ uint256 _normalizedWeight = bdiv(_tokenOutDenorm, _totalWeight);
+ vm.assume(BONE > _normalizedWeight);
+
+ uint256 _zoo = bsub(BONE, _normalizedWeight);
+ uint256 _zar = bmul(_zoo, _swapFee);
+ uint256 _tokenAmountOutBeforeSwapFee = bdiv(_tokenAmountOut, bsub(BONE, _zar));
+ uint256 _newTokenOutBalance = bsub(_tokenOutBalance, _tokenAmountOutBeforeSwapFee);
+ vm.assume(_newTokenOutBalance < type(uint256).max / _tokenOutBalance);
+
+ uint256 _tokenOutRatio = bdiv(_newTokenOutBalance, _tokenOutBalance);
+ uint256 _poolRatio = bpow(_tokenOutRatio, _normalizedWeight);
+ vm.assume(_poolRatio < type(uint256).max / _poolSupply);
+ }
+}
+
+contract BPool_Unit_Constructor is BasePoolTest {
+ function test_Deploy(address _deployer) public {
+ vm.prank(_deployer);
+ MockBPool _newBPool = new MockBPool();
+
+ assertEq(_newBPool.call__controller(), _deployer);
+ assertEq(_newBPool.call__factory(), _deployer);
+ assertEq(_newBPool.call__swapFee(), MIN_FEE);
+ assertEq(_newBPool.call__publicSwap(), false);
+ assertEq(_newBPool.call__finalized(), false);
+ }
+}
+
+contract BPool_Unit_IsPublicSwap is BasePoolTest {
+ function test_Returns_IsPublicSwap(bool _isPublicSwap) public {
+ bPool.set__publicSwap(_isPublicSwap);
+ assertEq(bPool.isPublicSwap(), _isPublicSwap);
+ }
+}
+
+contract BPool_Unit_IsFinalized is BasePoolTest {
+ function test_Returns_IsFinalized(bool _isFinalized) public {
+ bPool.set__finalized(_isFinalized);
+ assertEq(bPool.isFinalized(), _isFinalized);
+ }
+}
+
+contract BPool_Unit_IsBound is BasePoolTest {
+ function test_Returns_IsBound(address _token, bool _isBound) public {
+ _setRecord(_token, BPool.Record({bound: _isBound, index: 0, denorm: 0, balance: 0}));
+ assertEq(bPool.isBound(_token), _isBound);
+ }
+}
+
+contract BPool_Unit_GetNumTokens is BasePoolTest {
+ using LibString for *;
+
+ function test_Returns_NumTokens(uint256 _tokensToAdd) public {
+ vm.assume(_tokensToAdd > 0);
+ vm.assume(_tokensToAdd <= MAX_BOUND_TOKENS);
+ _setRandomTokens(_tokensToAdd);
+
+ assertEq(bPool.getNumTokens(), _tokensToAdd);
+ }
+}
+
+contract BPool_Unit_GetCurrentTokens is BasePoolTest {
+ function test_Returns_CurrentTokens(uint256 _length) public {
+ vm.assume(_length > 0);
+ vm.assume(_length <= MAX_BOUND_TOKENS);
+ address[] memory _tokensToAdd = _setRandomTokens(_length);
+
+ assertEq(bPool.getCurrentTokens(), _tokensToAdd);
+ }
+
+ function test_Revert_Reentrancy() public {
+ _expectRevertByReentrancy();
+ bPool.getCurrentTokens();
+ }
+}
+
+contract BPool_Unit_GetFinalTokens is BasePoolTest {
+ function test_Returns_FinalTokens(uint256 _length) public {
+ vm.assume(_length > 0);
+ vm.assume(_length <= MAX_BOUND_TOKENS);
+ address[] memory _tokensToAdd = _setRandomTokens(_length);
+ _setFinalize(true);
+
+ assertEq(bPool.getFinalTokens(), _tokensToAdd);
+ }
+
+ function test_Revert_Reentrancy() public {
+ _expectRevertByReentrancy();
+ bPool.getFinalTokens();
+ }
+
+ function test_Revert_NotFinalized(uint256 _length) public {
+ vm.assume(_length > 0);
+ vm.assume(_length <= MAX_BOUND_TOKENS);
+ _setRandomTokens(_length);
+ _setFinalize(false);
+
+ vm.expectRevert('ERR_NOT_FINALIZED');
+ bPool.getFinalTokens();
+ }
+}
+
+contract BPool_Unit_GetDenormalizedWeight is BasePoolTest {
+ function test_Returns_DenormalizedWeight(address _token, uint256 _weight) public {
+ bPool.set__records(_token, BPool.Record({bound: true, index: 0, denorm: _weight, balance: 0}));
+
+ assertEq(bPool.getDenormalizedWeight(_token), _weight);
+ }
+
+ function test_Revert_Reentrancy() public {
+ _expectRevertByReentrancy();
+ bPool.getDenormalizedWeight(address(0));
+ }
+
+ function test_Revert_NotBound(address _token) public {
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.getDenormalizedWeight(_token);
+ }
+}
+
+contract BPool_Unit_GetTotalDenormalizedWeight is BasePoolTest {
+ function test_Returns_TotalDenormalizedWeight(uint256 _totalWeight) public {
+ _setTotalWeight(_totalWeight);
+
+ assertEq(bPool.getTotalDenormalizedWeight(), _totalWeight);
+ }
+
+ function test_Revert_Reentrancy() public {
+ _expectRevertByReentrancy();
+ bPool.getTotalDenormalizedWeight();
+ }
+}
+
+contract BPool_Unit_GetNormalizedWeight is BasePoolTest {
+ function test_Returns_NormalizedWeight(address _token, uint256 _weight, uint256 _totalWeight) public {
+ _weight = bound(_weight, MIN_WEIGHT, MAX_WEIGHT);
+ _totalWeight = bound(_totalWeight, MIN_WEIGHT, MAX_TOTAL_WEIGHT);
+ vm.assume(_weight < _totalWeight);
+ _setRecord(_token, BPool.Record({bound: true, index: 0, denorm: _weight, balance: 0}));
+ _setTotalWeight(_totalWeight);
+
+ assertEq(bPool.getNormalizedWeight(_token), bdiv(_weight, _totalWeight));
+ }
+
+ function test_Revert_Reentrancy() public {
+ _expectRevertByReentrancy();
+ bPool.getNormalizedWeight(address(0));
+ }
+
+ function test_Revert_NotBound(address _token) public {
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.getNormalizedWeight(_token);
+ }
+}
+
+contract BPool_Unit_GetBalance is BasePoolTest {
+ function test_Returns_Balance(address _token, uint256 _balance) public {
+ bPool.set__records(_token, BPool.Record({bound: true, index: 0, denorm: 0, balance: _balance}));
+
+ assertEq(bPool.getBalance(_token), _balance);
+ }
+
+ function test_Revert_Reentrancy() public {
+ _expectRevertByReentrancy();
+ bPool.getBalance(address(0));
+ }
+
+ function test_Revert_NotBound(address _token) public {
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.getBalance(_token);
+ }
+}
+
+contract BPool_Unit_GetSwapFee is BasePoolTest {
+ function test_Returns_SwapFee(uint256 _swapFee) public {
+ _setSwapFee(_swapFee);
+
+ assertEq(bPool.getSwapFee(), _swapFee);
+ }
+
+ function test_Revert_Reentrancy() public {
+ _expectRevertByReentrancy();
+ bPool.getSwapFee();
+ }
+}
+
+contract BPool_Unit_GetController is BasePoolTest {
+ function test_Returns_Controller(address _controller) public {
+ bPool.set__controller(_controller);
+
+ assertEq(bPool.getController(), _controller);
+ }
+
+ function test_Revert_Reentrancy() public {
+ _expectRevertByReentrancy();
+ bPool.getController();
+ }
+}
+
+contract BPool_Unit_SetSwapFee is BasePoolTest {
+ modifier happyPath(uint256 _fee) {
+ vm.assume(_fee >= MIN_FEE);
+ vm.assume(_fee <= MAX_FEE);
+ _;
+ }
+
+ function test_Revert_Finalized(uint256 _fee) public happyPath(_fee) {
+ _setFinalize(true);
+
+ vm.expectRevert('ERR_IS_FINALIZED');
+ bPool.setSwapFee(_fee);
+ }
+
+ function test_Revert_NotController(address _controller, address _caller, uint256 _fee) public happyPath(_fee) {
+ vm.assume(_controller != _caller);
+ bPool.set__controller(_controller);
+
+ vm.expectRevert('ERR_NOT_CONTROLLER');
+ vm.prank(_caller);
+ bPool.setSwapFee(_fee);
+ }
+
+ function test_Revert_MinFee(uint256 _fee) public {
+ vm.assume(_fee < MIN_FEE);
+
+ vm.expectRevert('ERR_MIN_FEE');
+ bPool.setSwapFee(_fee);
+ }
+
+ function test_Revert_MaxFee(uint256 _fee) public {
+ vm.assume(_fee > MAX_FEE);
+
+ vm.expectRevert('ERR_MAX_FEE');
+ bPool.setSwapFee(_fee);
+ }
+
+ function test_Revert_Reentrancy(uint256 _fee) public happyPath(_fee) {
+ _expectRevertByReentrancy();
+ bPool.setSwapFee(_fee);
+ }
+
+ function test_Set_SwapFee(uint256 _fee) public happyPath(_fee) {
+ vm.assume(_fee >= MIN_FEE);
+ vm.assume(_fee <= MAX_FEE);
+
+ bPool.setSwapFee(_fee);
+
+ assertEq(bPool.call__swapFee(), _fee);
+ }
+
+ function test_Emit_LogCall(uint256 _fee) public happyPath(_fee) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.setSwapFee.selector, _fee);
+ emit BPool.LOG_CALL(BPool.setSwapFee.selector, address(this), _data);
+
+ bPool.setSwapFee(_fee);
+ }
+}
+
+contract BPool_Unit_SetController is BasePoolTest {
+ function test_Revert_NotController(address _controller, address _caller, address _newController) public {
+ vm.assume(_controller != _caller);
+ bPool.set__controller(_controller);
+
+ vm.expectRevert('ERR_NOT_CONTROLLER');
+ vm.prank(_caller);
+ bPool.setController(_newController);
+ }
+
+ function test_Revert_Reentrancy(address _controller) public {
+ _expectRevertByReentrancy();
+ bPool.setController(_controller);
+ }
+
+ function test_Set_Controller(address _controller) public {
+ bPool.setController(_controller);
+
+ assertEq(bPool.call__controller(), _controller);
+ }
+
+ function test_Emit_LogCall(address _controller) public {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.setController.selector, _controller);
+ emit BPool.LOG_CALL(BPool.setController.selector, address(this), _data);
+
+ bPool.setController(_controller);
+ }
+}
+
+contract BPool_Unit_SetPublicSwap is BasePoolTest {
+ function test_Revert_Finalized(bool _isPublicSwap) public {
+ _setFinalize(true);
+
+ vm.expectRevert('ERR_IS_FINALIZED');
+ bPool.setPublicSwap(_isPublicSwap);
+ }
+
+ function test_Revert_NotController(address _controller, address _caller, bool _isPublicSwap) public {
+ vm.assume(_controller != _caller);
+ bPool.set__controller(_controller);
+
+ vm.expectRevert('ERR_NOT_CONTROLLER');
+ vm.prank(_caller);
+ bPool.setPublicSwap(_isPublicSwap);
+ }
+
+ function test_Revert_Reentrancy(bool _isPublicSwap) public {
+ _expectRevertByReentrancy();
+ bPool.setPublicSwap(_isPublicSwap);
+ }
+
+ function test_Set_PublicSwap(bool _isPublicSwap) public {
+ bPool.setPublicSwap(_isPublicSwap);
+
+ assertEq(bPool.call__publicSwap(), _isPublicSwap);
+ }
+
+ function test_Emit_LogCall(bool _isPublicSwap) public {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.setPublicSwap.selector, _isPublicSwap);
+ emit BPool.LOG_CALL(BPool.setPublicSwap.selector, address(this), _data);
+
+ bPool.setPublicSwap(_isPublicSwap);
+ }
+}
+
+contract BPool_Unit_Finalize is BasePoolTest {
+ modifier happyPath(uint256 _tokensLength) {
+ _tokensLength = bound(_tokensLength, MIN_BOUND_TOKENS, MAX_BOUND_TOKENS);
+ _setRandomTokens(_tokensLength);
+ _;
+ }
+
+ function test_Revert_NotController(
+ address _controller,
+ address _caller,
+ uint256 _tokensLength
+ ) public happyPath(_tokensLength) {
+ vm.assume(_controller != _caller);
+ bPool.set__controller(_controller);
+
+ vm.prank(_caller);
+ vm.expectRevert('ERR_NOT_CONTROLLER');
+ bPool.finalize();
+ }
+
+ function test_Revert_Finalized(uint256 _tokensLength) public happyPath(_tokensLength) {
+ _setFinalize(true);
+
+ vm.expectRevert('ERR_IS_FINALIZED');
+ bPool.finalize();
+ }
+
+ function test_Revert_MinTokens(uint256 _tokensLength) public {
+ _tokensLength = bound(_tokensLength, 0, MIN_BOUND_TOKENS - 1);
+ _setRandomTokens(_tokensLength);
+
+ vm.expectRevert('ERR_MIN_TOKENS');
+ bPool.finalize();
+ }
+
+ function test_Revert_Reentrancy(uint256 _tokensLength) public happyPath(_tokensLength) {
+ _expectRevertByReentrancy();
+ bPool.finalize();
+ }
+
+ function test_Set_Finalize(uint256 _tokensLength) public happyPath(_tokensLength) {
+ bPool.finalize();
+
+ assertEq(bPool.call__finalized(), true);
+ }
+
+ function test_Set_PublicSwap(uint256 _tokensLength) public happyPath(_tokensLength) {
+ bPool.finalize();
+
+ assertEq(bPool.call__publicSwap(), true);
+ }
+
+ function test_Mint_InitPoolSupply(uint256 _tokensLength) public happyPath(_tokensLength) {
+ bPool.finalize();
+
+ assertEq(bPool.totalSupply(), INIT_POOL_SUPPLY);
+ }
+
+ function test_Push_InitPoolSupply(uint256 _tokensLength) public happyPath(_tokensLength) {
+ bPool.finalize();
+
+ assertEq(bPool.balanceOf(address(this)), INIT_POOL_SUPPLY);
+ }
+
+ function test_Emit_LogCall(uint256 _tokensLength) public happyPath(_tokensLength) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.finalize.selector);
+ emit BPool.LOG_CALL(BPool.finalize.selector, address(this), _data);
+
+ bPool.finalize();
+ }
+}
+
+contract BPool_Unit_Bind is BasePoolTest {
+ using LibString for *;
+
+ struct Bind_FuzzScenario {
+ address token;
+ uint256 balance;
+ uint256 denorm;
+ uint256 previousTokensAmount;
+ uint256 totalWeight;
+ address[] previousTokens;
+ }
+
+ function _setValues(Bind_FuzzScenario memory _fuzz) internal {
+ // Create mocks
+ _mockTransferFrom(_fuzz.token);
+
+ // Set tokens
+ _setRandomTokens(_fuzz.previousTokensAmount);
+
+ // Set finalize
+ _setFinalize(false);
+ // Set totalWeight
+ _setTotalWeight(_fuzz.totalWeight);
+ }
+
+ function _assumeHappyPath(Bind_FuzzScenario memory _fuzz) internal {
+ assumeNotForgeAddress(_fuzz.token);
+
+ _fuzz.previousTokensAmount = bound(_fuzz.previousTokensAmount, 0, MAX_BOUND_TOKENS - 1);
+ _fuzz.previousTokens = new address[](_fuzz.previousTokensAmount);
+ for (uint256 i = 0; i < _fuzz.previousTokensAmount; i++) {
+ _fuzz.previousTokens[i] = makeAddr(i.toString());
+ vm.assume(_fuzz.token != _fuzz.previousTokens[i]);
+ }
+
+ _fuzz.balance = bound(_fuzz.balance, MIN_BALANCE, type(uint256).max);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, 0, MAX_TOTAL_WEIGHT - MIN_WEIGHT);
+ _fuzz.denorm = bound(_fuzz.denorm, MIN_WEIGHT, MAX_TOTAL_WEIGHT - _fuzz.totalWeight);
+ }
+
+ modifier happyPath(Bind_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotController(
+ Bind_FuzzScenario memory _fuzz,
+ address _controller,
+ address _caller
+ ) public happyPath(_fuzz) {
+ vm.assume(_controller != _caller);
+ bPool.set__controller(_controller);
+
+ vm.prank(_caller);
+ vm.expectRevert('ERR_NOT_CONTROLLER');
+ bPool.bind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Revert_IsBound(Bind_FuzzScenario memory _fuzz, uint256 _tokenIndex) public happyPath(_fuzz) {
+ vm.assume(_fuzz.previousTokensAmount > 0);
+ _tokenIndex = bound(_tokenIndex, 0, _fuzz.previousTokens.length - 1);
+
+ vm.expectRevert('ERR_IS_BOUND');
+ bPool.bind(_fuzz.previousTokens[_tokenIndex], _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Revert_Finalized(Bind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setFinalize(true);
+
+ vm.expectRevert('ERR_IS_FINALIZED');
+ bPool.bind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Revert_MaxPoolTokens(Bind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ address[] memory _tokens = _setRandomTokens(MAX_BOUND_TOKENS);
+ for (uint256 i = 0; i < _tokens.length; i++) {
+ vm.assume(_fuzz.token != _tokens[i]);
+ }
+
+ vm.expectRevert('ERR_MAX_TOKENS');
+ bPool.bind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Set_Record(Bind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.bind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+
+ assertTrue(bPool.isBound(_fuzz.token));
+ assertEq(bPool.call__records(_fuzz.token).index, _fuzz.previousTokensAmount);
+ }
+
+ function test_PushArray_TokenArray(Bind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.bind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+
+ assertEq(bPool.getCurrentTokens().length, _fuzz.previousTokensAmount + 1);
+ assertEq(bPool.getCurrentTokens()[_fuzz.previousTokensAmount], _fuzz.token);
+ }
+
+ function test_Emit_LogCall(Bind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.bind.selector, _fuzz.token, _fuzz.balance, _fuzz.denorm);
+ emit BPool.LOG_CALL(BPool.bind.selector, address(this), _data);
+
+ bPool.bind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Call_Rebind(Bind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ // TODO: this behaviour is not possible to test in current environment.
+ vm.skip(true);
+ vm.expectCall(
+ address(bPool), abi.encodeWithSelector(BPool.rebind.selector, _fuzz.token, _fuzz.balance, _fuzz.denorm)
+ );
+
+ bPool.bind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+}
+
+contract BPool_Unit_Rebind is BasePoolTest {
+ using LibString for *;
+
+ struct Rebind_FuzzScenario {
+ address token;
+ uint256 balance;
+ uint256 previousBalance;
+ uint256 denorm;
+ uint256 previousDenorm;
+ uint256 totalWeight;
+ }
+
+ function _setValues(Rebind_FuzzScenario memory _fuzz) internal {
+ // Create mocks
+ _mockTransferFrom(_fuzz.token);
+ _mockTransfer(_fuzz.token);
+
+ // Set token
+ _setRecord(
+ _fuzz.token, BPool.Record({bound: true, index: 0, denorm: _fuzz.previousDenorm, balance: _fuzz.previousBalance})
+ );
+
+ // Set finalize
+ _setFinalize(false);
+ // Set totalWeight
+ _setTotalWeight(_fuzz.totalWeight);
+ }
+
+ function _assumeHappyPath(Rebind_FuzzScenario memory _fuzz) internal pure {
+ assumeNotForgeAddress(_fuzz.token);
+ _fuzz.balance = bound(_fuzz.balance, MIN_BALANCE, type(uint256).max);
+ _fuzz.previousBalance = bound(_fuzz.previousBalance, MIN_BALANCE, type(uint256).max);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, MIN_WEIGHT, MAX_TOTAL_WEIGHT - MIN_WEIGHT);
+ _fuzz.previousDenorm = bound(_fuzz.previousDenorm, MIN_WEIGHT, _fuzz.totalWeight);
+ _fuzz.denorm = bound(_fuzz.denorm, MIN_WEIGHT, MAX_TOTAL_WEIGHT - _fuzz.totalWeight);
+ }
+
+ modifier happyPath(Rebind_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotController(
+ Rebind_FuzzScenario memory _fuzz,
+ address _controller,
+ address _caller
+ ) public happyPath(_fuzz) {
+ vm.assume(_controller != _caller);
+ bPool.set__controller(_controller);
+
+ vm.prank(_caller);
+ vm.expectRevert('ERR_NOT_CONTROLLER');
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Revert_NotBound(Rebind_FuzzScenario memory _fuzz, address _token) public happyPath(_fuzz) {
+ vm.assume(_token != _fuzz.token);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.rebind(_token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Revert_Finalized(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setFinalize(true);
+
+ vm.expectRevert('ERR_IS_FINALIZED');
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Revert_MinWeight(Rebind_FuzzScenario memory _fuzz, uint256 _denorm) public happyPath(_fuzz) {
+ vm.assume(_denorm < MIN_WEIGHT);
+
+ vm.expectRevert('ERR_MIN_WEIGHT');
+ bPool.rebind(_fuzz.token, _fuzz.balance, _denorm);
+ }
+
+ function test_Revert_MaxWeight(Rebind_FuzzScenario memory _fuzz, uint256 _denorm) public happyPath(_fuzz) {
+ vm.assume(_denorm > MAX_WEIGHT);
+
+ vm.expectRevert('ERR_MAX_WEIGHT');
+ bPool.rebind(_fuzz.token, _fuzz.balance, _denorm);
+ }
+
+ function test_Revert_MinBalance(Rebind_FuzzScenario memory _fuzz, uint256 _balance) public happyPath(_fuzz) {
+ vm.assume(_balance < MIN_BALANCE);
+
+ vm.expectRevert('ERR_MIN_BALANCE');
+ bPool.rebind(_fuzz.token, _balance, _fuzz.denorm);
+ }
+
+ function test_Revert_Reentrancy(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Set_TotalWeightIfDenormMoreThanOldWeight(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.assume(_fuzz.denorm > _fuzz.previousDenorm);
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+
+ assertEq(bPool.call__totalWeight(), _fuzz.totalWeight + (_fuzz.denorm - _fuzz.previousDenorm));
+ }
+
+ function test_Set_TotalWeightIfDenormLessThanOldWeight(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.assume(_fuzz.denorm < _fuzz.previousDenorm);
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+
+ assertEq(bPool.call__totalWeight(), _fuzz.totalWeight - (_fuzz.previousDenorm - _fuzz.denorm));
+ }
+
+ function test_Revert_MaxTotalWeight(Rebind_FuzzScenario memory _fuzz, uint256 _denorm) public happyPath(_fuzz) {
+ _denorm = bound(_denorm, _fuzz.previousDenorm + 1, MAX_WEIGHT);
+ _setTotalWeight(MAX_TOTAL_WEIGHT);
+
+ vm.expectRevert('ERR_MAX_TOTAL_WEIGHT');
+ bPool.rebind(_fuzz.token, _fuzz.balance, _denorm);
+ }
+
+ function test_Set_Denorm(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+
+ assertEq(bPool.call__records(_fuzz.token).denorm, _fuzz.denorm);
+ }
+
+ function test_Set_Balance(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+
+ assertEq(bPool.call__records(_fuzz.token).balance, _fuzz.balance);
+ }
+
+ function test_Pull_IfBalanceMoreThanOldBalance(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.assume(_fuzz.balance > _fuzz.previousBalance);
+
+ vm.expectCall(
+ address(_fuzz.token),
+ abi.encodeWithSelector(
+ IERC20.transferFrom.selector, address(this), address(bPool), _fuzz.balance - _fuzz.previousBalance
+ )
+ );
+
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Push_UnderlyingIfBalanceLessThanOldBalance(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.assume(_fuzz.balance < _fuzz.previousBalance);
+
+ uint256 _tokenBalanceWithdrawn = _fuzz.previousBalance - _fuzz.balance;
+ uint256 _tokenExitFee = bmul(_tokenBalanceWithdrawn, EXIT_FEE);
+ vm.expectCall(
+ address(_fuzz.token),
+ abi.encodeWithSelector(IERC20.transfer.selector, address(this), _tokenBalanceWithdrawn - _tokenExitFee)
+ );
+
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Push_FeeIfBalanceLessThanOldBalance(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.assume(_fuzz.balance < _fuzz.previousBalance);
+
+ uint256 _tokenBalanceWithdrawn = _fuzz.previousBalance - _fuzz.balance;
+ uint256 _tokenExitFee = bmul(_tokenBalanceWithdrawn, EXIT_FEE);
+ vm.expectCall(
+ address(_fuzz.token), abi.encodeWithSelector(IERC20.transfer.selector, bPool.call__factory(), _tokenExitFee)
+ );
+
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+
+ function test_Emit_LogCall(Rebind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.rebind.selector, _fuzz.token, _fuzz.balance, _fuzz.denorm);
+ emit BPool.LOG_CALL(BPool.rebind.selector, address(this), _data);
+
+ bPool.rebind(_fuzz.token, _fuzz.balance, _fuzz.denorm);
+ }
+}
+
+contract BPool_Unit_Unbind is BasePoolTest {
+ using LibString for *;
+
+ struct Unbind_FuzzScenario {
+ uint256 tokenIndex;
+ uint256 balance;
+ uint256 denorm;
+ uint256 previousTokensAmount;
+ uint256 totalWeight;
+ address[] previousTokens;
+ }
+
+ function _setValues(Unbind_FuzzScenario memory _fuzz) internal {
+ // Create mocks
+ _mockTransfer(_fuzz.previousTokens[_fuzz.tokenIndex]);
+
+ // Set tokens
+ _setRandomTokens(_fuzz.previousTokensAmount);
+
+ // Set denorm and balance
+ _setRecord(
+ _fuzz.previousTokens[_fuzz.tokenIndex],
+ BPool.Record({bound: true, index: _fuzz.tokenIndex, denorm: _fuzz.denorm, balance: _fuzz.balance})
+ );
+
+ // Set finalize
+ _setFinalize(false);
+ // Set totalWeight
+ _setTotalWeight(_fuzz.totalWeight);
+ }
+
+ function _assumeHappyPath(Unbind_FuzzScenario memory _fuzz) internal {
+ _fuzz.balance = bound(_fuzz.balance, MIN_BALANCE, type(uint256).max);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, MIN_WEIGHT, MAX_TOTAL_WEIGHT - MIN_WEIGHT);
+ // The token to unbind will be included inside the array
+ _fuzz.previousTokensAmount = bound(_fuzz.previousTokensAmount, 1, MAX_BOUND_TOKENS);
+ _fuzz.tokenIndex = bound(_fuzz.tokenIndex, 0, _fuzz.previousTokensAmount - 1);
+ _fuzz.denorm = bound(_fuzz.denorm, MIN_WEIGHT, _fuzz.totalWeight);
+ _fuzz.previousTokens = new address[](_fuzz.previousTokensAmount);
+ for (uint256 i = 0; i < _fuzz.previousTokensAmount; i++) {
+ _fuzz.previousTokens[i] = makeAddr(i.toString());
+ }
+ }
+
+ modifier happyPath(Unbind_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotController(
+ Unbind_FuzzScenario memory _fuzz,
+ address _controller,
+ address _caller
+ ) public happyPath(_fuzz) {
+ vm.assume(_controller != _caller);
+ bPool.set__controller(_controller);
+
+ vm.prank(_caller);
+ vm.expectRevert('ERR_NOT_CONTROLLER');
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+ }
+
+ function test_Revert_NotBound(Unbind_FuzzScenario memory _fuzz, address _token) public happyPath(_fuzz) {
+ for (uint256 i = 0; i < _fuzz.previousTokensAmount; i++) {
+ vm.assume(_token != _fuzz.previousTokens[i]);
+ }
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.unbind(_token);
+ }
+
+ function test_Revert_Finalized(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setFinalize(true);
+
+ vm.expectRevert('ERR_IS_FINALIZED');
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+ }
+
+ function test_Revert_Reentrancy(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+ }
+
+ function test_Set_TotalWeight(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+
+ assertEq(bPool.call__totalWeight(), _fuzz.totalWeight - _fuzz.denorm);
+ }
+
+ function test_Set_TokenArray(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ address _lastTokenBefore = bPool.call__tokens()[bPool.call__tokens().length - 1];
+
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+
+ // Only check if the token is not the last of the array (that item is always poped out)
+ if (_fuzz.tokenIndex != _fuzz.previousTokensAmount - 1) {
+ address _tokenToUnbindAfter = bPool.call__tokens()[_fuzz.tokenIndex];
+ assertEq(_tokenToUnbindAfter, _lastTokenBefore);
+ }
+ }
+
+ function test_Set_Index(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ address _lastTokenBefore = bPool.call__tokens()[bPool.call__tokens().length - 1];
+
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+
+ // Only check if the token is not the last of the array (that item is always poped out)
+ if (_fuzz.tokenIndex != _fuzz.previousTokensAmount - 1) {
+ assertEq(bPool.call__records(_lastTokenBefore).index, _fuzz.tokenIndex);
+ }
+ }
+
+ function test_PopArray_TokenArray(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+
+ assertEq(bPool.call__tokens().length, _fuzz.previousTokensAmount - 1);
+ }
+
+ function test_Set_Record(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+
+ assertEq(bPool.call__records(_fuzz.previousTokens[_fuzz.tokenIndex]).index, 0);
+ assertEq(bPool.call__records(_fuzz.previousTokens[_fuzz.tokenIndex]).bound, false);
+ assertEq(bPool.call__records(_fuzz.previousTokens[_fuzz.tokenIndex]).denorm, 0);
+ assertEq(bPool.call__records(_fuzz.previousTokens[_fuzz.tokenIndex]).balance, 0);
+ }
+
+ function test_Push_UnderlyingBalance(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ address _token = _fuzz.previousTokens[_fuzz.tokenIndex];
+ uint256 _tokenExitFee = bmul(_fuzz.balance, EXIT_FEE);
+ vm.expectCall(
+ address(_token), abi.encodeWithSelector(IERC20.transfer.selector, address(this), _fuzz.balance - _tokenExitFee)
+ );
+
+ bPool.unbind(_token);
+ }
+
+ function test_Push_UnderlyingFee(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ address _token = _fuzz.previousTokens[_fuzz.tokenIndex];
+ uint256 _tokenExitFee = bmul(_fuzz.balance, EXIT_FEE);
+ vm.expectCall(
+ address(_token), abi.encodeWithSelector(IERC20.transfer.selector, bPool.call__factory(), _tokenExitFee)
+ );
+
+ bPool.unbind(_token);
+ }
+
+ function test_Emit_LogCall(Unbind_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.unbind.selector, _fuzz.previousTokens[_fuzz.tokenIndex]);
+ emit BPool.LOG_CALL(BPool.unbind.selector, address(this), _data);
+
+ bPool.unbind(_fuzz.previousTokens[_fuzz.tokenIndex]);
+ }
+}
+
+contract BPool_Unit_Gulp is BasePoolTest {
+ struct Gulp_FuzzScenario {
+ address token;
+ uint256 balance;
+ }
+
+ modifier happyPath(Gulp_FuzzScenario memory _fuzz) {
+ assumeNotForgeAddress(_fuzz.token);
+ _mockBalanceOf(_fuzz.token, address(bPool), _fuzz.balance);
+ _setRecord(_fuzz.token, BPool.Record({bound: true, index: 0, denorm: 0, balance: _fuzz.balance}));
+ _;
+ }
+
+ function test_Revert_NotBound(Gulp_FuzzScenario memory _fuzz, address _token) public happyPath(_fuzz) {
+ vm.assume(_token != _fuzz.token);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.gulp(_token);
+ }
+
+ function test_Revert_Reentrancy(Gulp_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.gulp(_fuzz.token);
+ }
+
+ function test_Set_Balance(Gulp_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.gulp(_fuzz.token);
+
+ assertEq(bPool.getBalance(_fuzz.token), _fuzz.balance);
+ }
+
+ function test_Emit_LogCall(Gulp_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.gulp.selector, _fuzz.token);
+ emit BPool.LOG_CALL(BPool.gulp.selector, address(this), _data);
+
+ bPool.gulp(_fuzz.token);
+ }
+}
+
+contract BPool_Unit_GetSpotPrice is BasePoolTest {
+ struct GetSpotPrice_FuzzScenario {
+ address tokenIn;
+ address tokenOut;
+ uint256 tokenInBalance;
+ uint256 tokenInDenorm;
+ uint256 tokenOutBalance;
+ uint256 tokenOutDenorm;
+ uint256 swapFee;
+ }
+
+ function _setValues(GetSpotPrice_FuzzScenario memory _fuzz) internal {
+ _setRecord(
+ _fuzz.tokenIn, BPool.Record({bound: true, index: 0, denorm: _fuzz.tokenInDenorm, balance: _fuzz.tokenInBalance})
+ );
+ _setRecord(
+ _fuzz.tokenOut,
+ BPool.Record({bound: true, index: 0, denorm: _fuzz.tokenOutDenorm, balance: _fuzz.tokenOutBalance})
+ );
+ _setSwapFee(_fuzz.swapFee);
+ }
+
+ function _assumeHappyPath(GetSpotPrice_FuzzScenario memory _fuzz) internal pure {
+ vm.assume(_fuzz.tokenIn != _fuzz.tokenOut);
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ }
+
+ modifier happyPath(GetSpotPrice_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotBoundTokenIn(
+ GetSpotPrice_FuzzScenario memory _fuzz,
+ address _tokenIn
+ ) public happyPath(_fuzz) {
+ vm.assume(_tokenIn != _fuzz.tokenIn);
+ vm.assume(_tokenIn != _fuzz.tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.getSpotPrice(_tokenIn, _fuzz.tokenOut);
+ }
+
+ function test_Revert_NotBoundTokenOut(
+ GetSpotPrice_FuzzScenario memory _fuzz,
+ address _tokenOut
+ ) public happyPath(_fuzz) {
+ vm.assume(_tokenOut != _fuzz.tokenIn);
+ vm.assume(_tokenOut != _fuzz.tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.getSpotPrice(_fuzz.tokenIn, _tokenOut);
+ }
+
+ function test_Returns_SpotPrice(GetSpotPrice_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _expectedSpotPrice = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ uint256 _spotPrice = bPool.getSpotPrice(_fuzz.tokenIn, _fuzz.tokenOut);
+ assertEq(_spotPrice, _expectedSpotPrice);
+ }
+
+ function test_Revert_Reentrancy(GetSpotPrice_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.getSpotPrice(_fuzz.tokenIn, _fuzz.tokenOut);
+ }
+}
+
+contract BPool_Unit_GetSpotPriceSansFee is BasePoolTest {
+ struct GetSpotPriceSansFee_FuzzScenario {
+ address tokenIn;
+ address tokenOut;
+ uint256 tokenInBalance;
+ uint256 tokenInDenorm;
+ uint256 tokenOutBalance;
+ uint256 tokenOutDenorm;
+ }
+
+ function _setValues(GetSpotPriceSansFee_FuzzScenario memory _fuzz) internal {
+ _setRecord(
+ _fuzz.tokenIn, BPool.Record({bound: true, index: 0, denorm: _fuzz.tokenInDenorm, balance: _fuzz.tokenInBalance})
+ );
+ _setRecord(
+ _fuzz.tokenOut,
+ BPool.Record({bound: true, index: 0, denorm: _fuzz.tokenOutDenorm, balance: _fuzz.tokenOutBalance})
+ );
+ _setSwapFee(0);
+ }
+
+ function _assumeHappyPath(GetSpotPriceSansFee_FuzzScenario memory _fuzz) internal pure {
+ vm.assume(_fuzz.tokenIn != _fuzz.tokenOut);
+ _assumeCalcSpotPrice(_fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, 0);
+ }
+
+ modifier happyPath(GetSpotPriceSansFee_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotBoundTokenIn(
+ GetSpotPriceSansFee_FuzzScenario memory _fuzz,
+ address _tokenIn
+ ) public happyPath(_fuzz) {
+ vm.assume(_tokenIn != _fuzz.tokenIn);
+ vm.assume(_tokenIn != _fuzz.tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.getSpotPriceSansFee(_tokenIn, _fuzz.tokenOut);
+ }
+
+ function test_Revert_NotBoundTokenOut(
+ GetSpotPriceSansFee_FuzzScenario memory _fuzz,
+ address _tokenOut
+ ) public happyPath(_fuzz) {
+ vm.assume(_tokenOut != _fuzz.tokenIn);
+ vm.assume(_tokenOut != _fuzz.tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.getSpotPriceSansFee(_fuzz.tokenIn, _tokenOut);
+ }
+
+ function test_Returns_SpotPrice(GetSpotPriceSansFee_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _expectedSpotPrice =
+ calcSpotPrice(_fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, 0);
+ uint256 _spotPrice = bPool.getSpotPriceSansFee(_fuzz.tokenIn, _fuzz.tokenOut);
+ assertEq(_spotPrice, _expectedSpotPrice);
+ }
+
+ function test_Revert_Reentrancy(GetSpotPriceSansFee_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.getSpotPriceSansFee(_fuzz.tokenIn, _fuzz.tokenOut);
+ }
+}
+
+contract BPool_Unit_JoinPool is BasePoolTest {
+ struct JoinPool_FuzzScenario {
+ uint256 poolAmountOut;
+ uint256 initPoolSupply;
+ uint256[TOKENS_AMOUNT] balance;
+ }
+
+ function _setValues(JoinPool_FuzzScenario memory _fuzz) internal {
+ // Create mocks
+ for (uint256 i = 0; i < tokens.length; i++) {
+ _mockTransfer(tokens[i]);
+ _mockTransferFrom(tokens[i]);
+ }
+
+ // Set tokens
+ _setTokens(_tokensToMemory());
+
+ // Set balances
+ for (uint256 i = 0; i < tokens.length; i++) {
+ _setRecord(
+ tokens[i],
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: 0, // NOTE: irrelevant for this method
+ balance: _fuzz.balance[i]
+ })
+ );
+ }
+
+ // Set public swap
+ _setPublicSwap(true);
+ // Set finalize
+ _setFinalize(true);
+ // Set totalSupply
+ _setTotalSupply(_fuzz.initPoolSupply);
+ }
+
+ function _assumeHappyPath(JoinPool_FuzzScenario memory _fuzz) internal pure {
+ _fuzz.initPoolSupply = bound(_fuzz.initPoolSupply, INIT_POOL_SUPPLY, type(uint256).max / BONE);
+ _fuzz.poolAmountOut = bound(_fuzz.poolAmountOut, _fuzz.initPoolSupply, type(uint256).max / BONE);
+ vm.assume(_fuzz.poolAmountOut * BONE < type(uint256).max - (_fuzz.initPoolSupply / 2));
+
+ uint256 _ratio = bdiv(_fuzz.poolAmountOut, _fuzz.initPoolSupply);
+ uint256 _maxTokenAmountIn = (type(uint256).max / _ratio) - (BONE / 2);
+
+ for (uint256 i = 0; i < _fuzz.balance.length; i++) {
+ _fuzz.balance[i] = bound(_fuzz.balance[i], MIN_BALANCE, _maxTokenAmountIn);
+ }
+ }
+
+ modifier happyPath(JoinPool_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotFinalized(JoinPool_FuzzScenario memory _fuzz) public {
+ _setFinalize(false);
+
+ vm.expectRevert('ERR_NOT_FINALIZED');
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+ }
+
+ function test_Revert_MathApprox(JoinPool_FuzzScenario memory _fuzz, uint256 _poolAmountOut) public happyPath(_fuzz) {
+ _poolAmountOut = bound(_poolAmountOut, 0, (INIT_POOL_SUPPLY / 2 / BONE) - 1); // bdiv rounds up
+
+ vm.expectRevert('ERR_MATH_APPROX');
+ bPool.joinPool(_poolAmountOut, _maxArray(tokens.length));
+ }
+
+ function test_Revert_TokenArrayMathApprox(JoinPool_FuzzScenario memory _fuzz, uint256 _tokenIndex) public {
+ _assumeHappyPath(_fuzz);
+ _tokenIndex = bound(_tokenIndex, 0, TOKENS_AMOUNT - 1);
+ _fuzz.balance[_tokenIndex] = 0;
+ _setValues(_fuzz);
+
+ vm.expectRevert('ERR_MATH_APPROX');
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+ }
+
+ function test_Revert_TokenArrayLimitIn(
+ JoinPool_FuzzScenario memory _fuzz,
+ uint256 _tokenIndex,
+ uint256[TOKENS_AMOUNT] memory _maxAmountsIn
+ ) public happyPath(_fuzz) {
+ _tokenIndex = bound(_tokenIndex, 0, TOKENS_AMOUNT - 1);
+
+ uint256 _ratio = bdiv(_fuzz.poolAmountOut, _fuzz.initPoolSupply);
+ for (uint256 i = 0; i < _fuzz.balance.length; i++) {
+ uint256 _tokenAmountIn = bmul(_ratio, _fuzz.balance[i]);
+ _maxAmountsIn[i] = _tokenIndex == i ? _tokenAmountIn - 1 : _tokenAmountIn;
+ }
+
+ vm.expectRevert('ERR_LIMIT_IN');
+ bPool.joinPool(_fuzz.poolAmountOut, _staticToDynamicUintArray(_maxAmountsIn));
+ }
+
+ function test_Revert_Reentrancy(JoinPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+ }
+
+ function test_Set_TokenArrayBalance(JoinPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+
+ uint256 _poolTotal = _fuzz.initPoolSupply;
+ uint256 _ratio = bdiv(_fuzz.poolAmountOut, _poolTotal);
+
+ for (uint256 i = 0; i < tokens.length; i++) {
+ uint256 _bal = _fuzz.balance[i];
+ uint256 _tokenAmountIn = bmul(_ratio, _bal);
+ assertEq(bPool.getBalance(tokens[i]), _bal + _tokenAmountIn);
+ }
+ }
+
+ function test_Emit_TokenArrayLogJoin(JoinPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _poolTotal = _fuzz.initPoolSupply;
+ uint256 _ratio = bdiv(_fuzz.poolAmountOut, _poolTotal);
+
+ for (uint256 i = 0; i < tokens.length; i++) {
+ uint256 _bal = _fuzz.balance[i];
+ uint256 _tokenAmountIn = bmul(_ratio, _bal);
+ vm.expectEmit();
+ emit BPool.LOG_JOIN(address(this), tokens[i], _tokenAmountIn);
+ }
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+ }
+
+ function test_Pull_TokenArrayTokenAmountIn(JoinPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _poolTotal = _fuzz.initPoolSupply;
+ uint256 _ratio = bdiv(_fuzz.poolAmountOut, _poolTotal);
+
+ for (uint256 i = 0; i < tokens.length; i++) {
+ uint256 _bal = _fuzz.balance[i];
+ uint256 _tokenAmountIn = bmul(_ratio, _bal);
+ vm.expectCall(
+ address(tokens[i]),
+ abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(bPool), _tokenAmountIn)
+ );
+ }
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+ }
+
+ function test_Mint_PoolShare(JoinPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+
+ assertEq(bPool.totalSupply(), _fuzz.initPoolSupply + _fuzz.poolAmountOut);
+ }
+
+ function test_Push_PoolShare(JoinPool_FuzzScenario memory _fuzz, address _caller) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_caller);
+ vm.assume(_caller != address(0));
+
+ vm.prank(_caller);
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+
+ assertEq(bPool.balanceOf(_caller), _fuzz.poolAmountOut);
+ }
+
+ function test_Emit_LogCall(JoinPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.joinPool.selector, _fuzz.poolAmountOut, _maxArray(tokens.length));
+ emit BPool.LOG_CALL(BPool.joinPool.selector, address(this), _data);
+
+ bPool.joinPool(_fuzz.poolAmountOut, _maxArray(tokens.length));
+ }
+}
+
+contract BPool_Unit_ExitPool is BasePoolTest {
+ struct ExitPool_FuzzScenario {
+ uint256 poolAmountIn;
+ uint256 initPoolSupply;
+ uint256[TOKENS_AMOUNT] balance;
+ }
+
+ function _setValues(ExitPool_FuzzScenario memory _fuzz) internal {
+ // Create mocks
+ for (uint256 i = 0; i < tokens.length; i++) {
+ _mockTransfer(tokens[i]);
+ }
+
+ // Set tokens
+ _setTokens(_tokensToMemory());
+
+ // Set balances
+ for (uint256 i = 0; i < tokens.length; i++) {
+ _setRecord(
+ tokens[i],
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: 0, // NOTE: irrelevant for this method
+ balance: _fuzz.balance[i]
+ })
+ );
+ }
+
+ // Set LP token balance
+ _setPoolBalance(address(this), _fuzz.poolAmountIn); // give LP tokens to fn caller
+ // Set totalSupply
+ _setTotalSupply(_fuzz.initPoolSupply - _fuzz.poolAmountIn);
+ // Set public swap
+ _setPublicSwap(true);
+ // Set finalize
+ _setFinalize(true);
+ }
+
+ function _assumeHappyPath(ExitPool_FuzzScenario memory _fuzz) internal pure {
+ uint256 _maxInitSupply = type(uint256).max / BONE;
+ _fuzz.initPoolSupply = bound(_fuzz.initPoolSupply, INIT_POOL_SUPPLY, _maxInitSupply);
+
+ uint256 _poolAmountInAfterFee = _fuzz.poolAmountIn - (_fuzz.poolAmountIn * EXIT_FEE);
+ vm.assume(_poolAmountInAfterFee <= _fuzz.initPoolSupply);
+ vm.assume(_poolAmountInAfterFee * BONE > _fuzz.initPoolSupply);
+ vm.assume(_poolAmountInAfterFee * BONE < type(uint256).max - (_fuzz.initPoolSupply / 2));
+
+ uint256 _ratio = bdiv(_poolAmountInAfterFee, _fuzz.initPoolSupply);
+ uint256 _maxBalance = type(uint256).max / (_ratio * BONE);
+
+ for (uint256 i = 0; i < _fuzz.balance.length; i++) {
+ _fuzz.balance[i] = bound(_fuzz.balance[i], BONE, _maxBalance);
+ }
+ }
+
+ modifier happyPath(ExitPool_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotFinalized(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setFinalize(false);
+
+ vm.expectRevert('ERR_NOT_FINALIZED');
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+ }
+
+ function test_Revert_MathApprox(ExitPool_FuzzScenario memory _fuzz, uint256 _poolAmountIn) public happyPath(_fuzz) {
+ _poolAmountIn = bound(_poolAmountIn, 0, (INIT_POOL_SUPPLY / 2 / BONE) - 1); // bdiv rounds up
+
+ vm.expectRevert('ERR_MATH_APPROX');
+ bPool.exitPool(_poolAmountIn, _zeroArray(tokens.length));
+ }
+
+ function test_Pull_PoolShare(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ assertEq(bPool.balanceOf(address(this)), _fuzz.poolAmountIn);
+
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+
+ assertEq(bPool.balanceOf(address(this)), 0);
+ }
+
+ function test_Push_PoolShare(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ address _factoryAddress = bPool.call__factory();
+ uint256 _exitFee = bmul(_fuzz.poolAmountIn, EXIT_FEE);
+ uint256 _balanceBefore = bPool.balanceOf(_factoryAddress);
+
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+
+ assertEq(bPool.balanceOf(_factoryAddress), _balanceBefore - _fuzz.poolAmountIn + _exitFee);
+ }
+
+ function test_Burn_PoolShare(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _exitFee = bmul(_fuzz.poolAmountIn, EXIT_FEE);
+ uint256 _pAiAfterExitFee = bsub(_fuzz.poolAmountIn, _exitFee);
+ uint256 _totalSupplyBefore = bPool.totalSupply();
+
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+
+ assertEq(bPool.totalSupply(), _totalSupplyBefore - _pAiAfterExitFee);
+ }
+
+ function test_Revert_TokenArrayMathApprox(
+ ExitPool_FuzzScenario memory _fuzz,
+ uint256 _tokenIndex
+ ) public happyPath(_fuzz) {
+ _assumeHappyPath(_fuzz);
+ _tokenIndex = bound(_tokenIndex, 0, TOKENS_AMOUNT - 1);
+ _fuzz.balance[_tokenIndex] = 0;
+ _setValues(_fuzz);
+
+ vm.expectRevert('ERR_MATH_APPROX');
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+ }
+
+ function test_Revert_TokenArrayLimitOut(
+ ExitPool_FuzzScenario memory _fuzz,
+ uint256 _tokenIndex,
+ uint256[TOKENS_AMOUNT] memory _minAmountsOut
+ ) public happyPath(_fuzz) {
+ _tokenIndex = bound(_tokenIndex, 0, TOKENS_AMOUNT - 1);
+
+ uint256 _poolTotal = _fuzz.initPoolSupply;
+ uint256 _exitFee = bmul(_fuzz.poolAmountIn, EXIT_FEE);
+ uint256 _pAiAfterExitFee = bsub(_fuzz.poolAmountIn, _exitFee);
+ uint256 _ratio = bdiv(_pAiAfterExitFee, _poolTotal);
+
+ for (uint256 i = 0; i < tokens.length; i++) {
+ uint256 _bal = _fuzz.balance[i];
+ uint256 _tokenAmountOut = bmul(_ratio, _bal);
+
+ _minAmountsOut[i] = _tokenIndex == i ? _tokenAmountOut + 1 : _tokenAmountOut;
+ }
+
+ vm.expectRevert('ERR_LIMIT_OUT');
+ bPool.exitPool(_fuzz.poolAmountIn, _staticToDynamicUintArray(_minAmountsOut));
+ }
+
+ function test_Revert_Reentrancy(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+ }
+
+ function test_Set_TokenArrayBalance(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256[] memory _balanceBefore = new uint256[](tokens.length);
+ for (uint256 i = 0; i < tokens.length; i++) {
+ _balanceBefore[i] = bPool.getBalance(tokens[i]);
+ }
+
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+
+ uint256 _exitFee = bmul(_fuzz.poolAmountIn, EXIT_FEE);
+ uint256 _pAiAfterExitFee = bsub(_fuzz.poolAmountIn, _exitFee);
+ uint256 _ratio = bdiv(_pAiAfterExitFee, _fuzz.initPoolSupply);
+
+ for (uint256 i = 0; i < tokens.length; i++) {
+ uint256 _bal = _fuzz.balance[i];
+ uint256 _tokenAmountOut = bmul(_ratio, _bal);
+ assertEq(bPool.getBalance(tokens[i]), _balanceBefore[i] - _tokenAmountOut);
+ }
+ }
+
+ function test_Emit_TokenArrayLogExit(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _exitFee = bmul(_fuzz.poolAmountIn, EXIT_FEE);
+ uint256 _pAiAfterExitFee = bsub(_fuzz.poolAmountIn, _exitFee);
+ uint256 _ratio = bdiv(_pAiAfterExitFee, _fuzz.initPoolSupply);
+
+ for (uint256 i = 0; i < tokens.length; i++) {
+ uint256 _bal = _fuzz.balance[i];
+ uint256 _tokenAmountOut = bmul(_ratio, _bal);
+ vm.expectEmit();
+ emit BPool.LOG_EXIT(address(this), tokens[i], _tokenAmountOut);
+ }
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+ }
+
+ function test_Push_TokenArrayTokenAmountOut(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _exitFee = bmul(_fuzz.poolAmountIn, EXIT_FEE);
+ uint256 _pAiAfterExitFee = bsub(_fuzz.poolAmountIn, _exitFee);
+ uint256 _ratio = bdiv(_pAiAfterExitFee, _fuzz.initPoolSupply);
+
+ for (uint256 i = 0; i < tokens.length; i++) {
+ uint256 _bal = _fuzz.balance[i];
+ uint256 _tokenAmountOut = bmul(_ratio, _bal);
+ vm.expectCall(
+ address(tokens[i]), abi.encodeWithSelector(IERC20.transfer.selector, address(this), _tokenAmountOut)
+ );
+ }
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+ }
+
+ function test_Emit_LogCall(ExitPool_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.exitPool.selector, _fuzz.poolAmountIn, _zeroArray(tokens.length));
+ emit BPool.LOG_CALL(BPool.exitPool.selector, address(this), _data);
+
+ bPool.exitPool(_fuzz.poolAmountIn, _zeroArray(tokens.length));
+ }
+}
+
+contract BPool_Unit_SwapExactAmountIn is BasePoolTest {
+ address tokenIn;
+ address tokenOut;
+
+ struct SwapExactAmountIn_FuzzScenario {
+ uint256 tokenAmountIn;
+ uint256 tokenInBalance;
+ uint256 tokenInDenorm;
+ uint256 tokenOutBalance;
+ uint256 tokenOutDenorm;
+ uint256 swapFee;
+ }
+
+ function _setValues(SwapExactAmountIn_FuzzScenario memory _fuzz) internal {
+ tokenIn = tokens[0];
+ tokenOut = tokens[1];
+
+ // Create mocks for tokenIn and tokenOut (only use the first 2 tokens)
+ _mockTransferFrom(tokenIn);
+ _mockTransfer(tokenOut);
+
+ // Set balances
+ _setRecord(
+ tokenIn,
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: _fuzz.tokenInDenorm,
+ balance: _fuzz.tokenInBalance
+ })
+ );
+ _setRecord(
+ tokenOut,
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: _fuzz.tokenOutDenorm,
+ balance: _fuzz.tokenOutBalance
+ })
+ );
+
+ // Set swapFee
+ _setSwapFee(_fuzz.swapFee);
+ // Set public swap
+ _setPublicSwap(true);
+ // Set finalize
+ _setFinalize(true);
+ }
+
+ function _assumeHappyPath(SwapExactAmountIn_FuzzScenario memory _fuzz) internal pure {
+ // safe bound assumptions
+ _fuzz.tokenInDenorm = bound(_fuzz.tokenInDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.tokenOutDenorm = bound(_fuzz.tokenOutDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+
+ // min - max - calcSpotPrice (spotPriceBefore)
+ _fuzz.tokenInBalance = bound(_fuzz.tokenInBalance, MIN_BALANCE, type(uint256).max / _fuzz.tokenInDenorm);
+ _fuzz.tokenOutBalance = bound(_fuzz.tokenOutBalance, MIN_BALANCE, type(uint256).max / _fuzz.tokenOutDenorm);
+
+ // max - calcSpotPrice (spotPriceAfter)
+ vm.assume(_fuzz.tokenAmountIn < type(uint256).max - _fuzz.tokenInBalance);
+ vm.assume(_fuzz.tokenInBalance + _fuzz.tokenAmountIn < type(uint256).max / _fuzz.tokenInDenorm);
+
+ // internal calculation for calcSpotPrice (spotPriceBefore)
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+
+ // MAX_IN_RATIO
+ vm.assume(_fuzz.tokenAmountIn <= bmul(_fuzz.tokenInBalance, MAX_IN_RATIO));
+
+ // L338 BPool.sol
+ uint256 _spotPriceBefore = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+
+ _assumeCalcOutGivenIn(_fuzz.tokenInBalance, _fuzz.tokenAmountIn, _fuzz.swapFee);
+ uint256 _tokenAmountOut = calcOutGivenIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+ vm.assume(_tokenAmountOut > BONE);
+
+ // internal calculation for calcSpotPrice (spotPriceAfter)
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance + _fuzz.tokenAmountIn,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance - _tokenAmountOut,
+ _fuzz.tokenOutDenorm,
+ _fuzz.swapFee
+ );
+
+ vm.assume(bmul(_spotPriceBefore, _tokenAmountOut) <= _fuzz.tokenAmountIn);
+ }
+
+ modifier happyPath(SwapExactAmountIn_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotBoundTokenIn(
+ SwapExactAmountIn_FuzzScenario memory _fuzz,
+ address _tokenIn
+ ) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_tokenIn);
+ vm.assume(_tokenIn != tokenIn);
+ vm.assume(_tokenIn != tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.swapExactAmountIn(_tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Revert_NotBoundTokenOut(
+ SwapExactAmountIn_FuzzScenario memory _fuzz,
+ address _tokenOut
+ ) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_tokenOut);
+ vm.assume(_tokenOut != tokenIn);
+ vm.assume(_tokenOut != tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, _tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Revert_NotPublic(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setPublicSwap(false);
+
+ vm.expectRevert('ERR_SWAP_NOT_PUBLIC');
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Revert_MaxInRatio(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = bmul(_fuzz.tokenInBalance, MAX_IN_RATIO) + 1;
+
+ vm.expectRevert('ERR_MAX_IN_RATIO');
+ bPool.swapExactAmountIn(tokenIn, _tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Revert_BadLimitPrice(
+ SwapExactAmountIn_FuzzScenario memory _fuzz,
+ uint256 _maxPrice
+ ) public happyPath(_fuzz) {
+ uint256 _spotPriceBefore = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ vm.assume(_spotPriceBefore > 0);
+ _maxPrice = bound(_maxPrice, 0, _spotPriceBefore - 1);
+
+ vm.expectRevert('ERR_BAD_LIMIT_PRICE');
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, _maxPrice);
+ }
+
+ function test_Revert_LimitOut(
+ SwapExactAmountIn_FuzzScenario memory _fuzz,
+ uint256 _minAmountOut
+ ) public happyPath(_fuzz) {
+ uint256 _tokenAmountOut = calcOutGivenIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+ _minAmountOut = bound(_minAmountOut, _tokenAmountOut + 1, type(uint256).max);
+
+ vm.expectRevert('ERR_LIMIT_OUT');
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, _minAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_Reentrancy(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Set_InRecord(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+
+ assertEq(bPool.getBalance(tokenIn), _fuzz.tokenInBalance + _fuzz.tokenAmountIn);
+ }
+
+ function test_Set_OutRecord(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ (uint256 _tokenAmountOut,) = bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+
+ assertEq(bPool.getBalance(tokenOut), _fuzz.tokenOutBalance - _tokenAmountOut);
+ }
+
+ function test_Revert_MathApprox() public {
+ vm.skip(true);
+ // TODO: this revert might be unreachable. Find a way to test it or remove the revert in the code.
+ }
+
+ function test_Revert_LimitPrice(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountOut = calcOutGivenIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+ uint256 _spotPriceBefore = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ uint256 _spotPriceAfter = calcSpotPrice(
+ _fuzz.tokenInBalance + _fuzz.tokenAmountIn,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance - _tokenAmountOut,
+ _fuzz.tokenOutDenorm,
+ _fuzz.swapFee
+ );
+ vm.assume(_spotPriceAfter > _spotPriceBefore);
+
+ vm.expectRevert('ERR_LIMIT_PRICE');
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, _spotPriceBefore);
+ }
+
+ function test_Revert_MathApprox2(SwapExactAmountIn_FuzzScenario memory _fuzz) public {
+ // Replicating _assumeHappyPath, but removing irrelevant assumptions and conditioning the revert
+ _fuzz.tokenInDenorm = bound(_fuzz.tokenInDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.tokenOutDenorm = bound(_fuzz.tokenOutDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+ _fuzz.tokenInBalance = bound(_fuzz.tokenInBalance, MIN_BALANCE, type(uint256).max / _fuzz.tokenInDenorm);
+ _fuzz.tokenOutBalance = bound(_fuzz.tokenOutBalance, MIN_BALANCE, type(uint256).max / _fuzz.tokenOutDenorm);
+ vm.assume(_fuzz.tokenAmountIn < type(uint256).max - _fuzz.tokenInBalance);
+ vm.assume(_fuzz.tokenInBalance + _fuzz.tokenAmountIn < type(uint256).max / _fuzz.tokenInDenorm);
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ vm.assume(_fuzz.tokenAmountIn <= bmul(_fuzz.tokenInBalance, MAX_IN_RATIO));
+ uint256 _spotPriceBefore = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ _assumeCalcOutGivenIn(_fuzz.tokenInBalance, _fuzz.tokenAmountIn, _fuzz.swapFee);
+ uint256 _tokenAmountOut = calcOutGivenIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+ vm.assume(_tokenAmountOut > BONE);
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance + _fuzz.tokenAmountIn,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance - _tokenAmountOut,
+ _fuzz.tokenOutDenorm,
+ _fuzz.swapFee
+ );
+ vm.assume(_spotPriceBefore > bdiv(_fuzz.tokenAmountIn, _tokenAmountOut));
+
+ _setValues(_fuzz);
+
+ vm.expectRevert('ERR_MATH_APPROX');
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Emit_LogSwap(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountOut = calcOutGivenIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+
+ vm.expectEmit();
+ emit BPool.LOG_SWAP(address(this), tokenIn, tokenOut, _fuzz.tokenAmountIn, _tokenAmountOut);
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Pull_TokenAmountIn(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectCall(
+ address(tokenIn),
+ abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(bPool), _fuzz.tokenAmountIn)
+ );
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Push_TokenAmountOut(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountOut = calcOutGivenIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+
+ vm.expectCall(address(tokenOut), abi.encodeWithSelector(IERC20.transfer.selector, address(this), _tokenAmountOut));
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+
+ function test_Returns_AmountAndPrice(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _expectedTokenAmountOut = calcOutGivenIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+ uint256 _expectedSpotPriceAfter = calcSpotPrice(
+ _fuzz.tokenInBalance + _fuzz.tokenAmountIn,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance - _expectedTokenAmountOut,
+ _fuzz.tokenOutDenorm,
+ _fuzz.swapFee
+ );
+
+ (uint256 _tokenAmountOut, uint256 _spotPriceAfter) =
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+
+ assertEq(_tokenAmountOut, _expectedTokenAmountOut);
+ assertEq(_spotPriceAfter, _expectedSpotPriceAfter);
+ }
+
+ function test_Emit_LogCall(SwapExactAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(
+ BPool.swapExactAmountIn.selector, tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max
+ );
+ emit BPool.LOG_CALL(BPool.swapExactAmountIn.selector, address(this), _data);
+
+ bPool.swapExactAmountIn(tokenIn, _fuzz.tokenAmountIn, tokenOut, 0, type(uint256).max);
+ }
+}
+
+contract BPool_Unit_SwapExactAmountOut is BasePoolTest {
+ address tokenIn;
+ address tokenOut;
+
+ struct SwapExactAmountOut_FuzzScenario {
+ uint256 tokenAmountOut;
+ uint256 tokenInBalance;
+ uint256 tokenInDenorm;
+ uint256 tokenOutBalance;
+ uint256 tokenOutDenorm;
+ uint256 swapFee;
+ }
+
+ function _setValues(SwapExactAmountOut_FuzzScenario memory _fuzz) internal {
+ tokenIn = tokens[0];
+ tokenOut = tokens[1];
+
+ // Create mocks for tokenIn and tokenOut (only use the first 2 tokens)
+ _mockTransferFrom(tokenIn);
+ _mockTransfer(tokenOut);
+
+ // Set balances
+ _setRecord(
+ tokenIn,
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: _fuzz.tokenInDenorm,
+ balance: _fuzz.tokenInBalance
+ })
+ );
+ _setRecord(
+ tokenOut,
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: _fuzz.tokenOutDenorm,
+ balance: _fuzz.tokenOutBalance
+ })
+ );
+
+ // Set swapFee
+ _setSwapFee(_fuzz.swapFee);
+ // Set public swap
+ _setPublicSwap(true);
+ // Set finalize
+ _setFinalize(true);
+ }
+
+ function _assumeHappyPath(SwapExactAmountOut_FuzzScenario memory _fuzz) internal pure {
+ // safe bound assumptions
+ _fuzz.tokenInDenorm = bound(_fuzz.tokenInDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.tokenOutDenorm = bound(_fuzz.tokenOutDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+
+ _fuzz.tokenInBalance = bound(_fuzz.tokenInBalance, MIN_BALANCE, type(uint256).max);
+ _fuzz.tokenOutBalance = bound(_fuzz.tokenOutBalance, MIN_BALANCE, type(uint256).max);
+
+ // max - calcSpotPrice (spotPriceBefore)
+ vm.assume(_fuzz.tokenInBalance < type(uint256).max / _fuzz.tokenInDenorm);
+ vm.assume(_fuzz.tokenOutBalance < type(uint256).max / _fuzz.tokenOutDenorm);
+
+ // max - calcSpotPrice (spotPriceAfter)
+ vm.assume(_fuzz.tokenAmountOut < type(uint256).max - _fuzz.tokenOutBalance);
+ vm.assume(_fuzz.tokenOutBalance + _fuzz.tokenAmountOut < type(uint256).max / _fuzz.tokenOutDenorm);
+
+ // internal calculation for calcSpotPrice (spotPriceBefore)
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+
+ // MAX_OUT_RATIO
+ vm.assume(_fuzz.tokenAmountOut <= bmul(_fuzz.tokenOutBalance, MAX_OUT_RATIO));
+
+ // L364 BPool.sol
+ uint256 _spotPriceBefore = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+
+ // internal calculation for calcInGivenOut
+ _assumeCalcInGivenOut(
+ _fuzz.tokenOutDenorm, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenAmountOut, _fuzz.tokenInBalance
+ );
+
+ uint256 _tokenAmountIn = calcInGivenOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+
+ vm.assume(_tokenAmountIn > BONE);
+ vm.assume(_spotPriceBefore <= bdiv(_tokenAmountIn, _fuzz.tokenAmountOut));
+
+ // max - calcSpotPrice (spotPriceAfter)
+ vm.assume(_tokenAmountIn < type(uint256).max - _fuzz.tokenInBalance);
+ vm.assume(_fuzz.tokenInBalance + _tokenAmountIn < type(uint256).max / _fuzz.tokenInDenorm);
+
+ // internal calculation for calcSpotPrice (spotPriceAfter)
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance + _tokenAmountIn,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance - _fuzz.tokenAmountOut,
+ _fuzz.tokenOutDenorm,
+ _fuzz.swapFee
+ );
+ }
+
+ modifier happyPath(SwapExactAmountOut_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotBoundTokenIn(
+ SwapExactAmountOut_FuzzScenario memory _fuzz,
+ address _tokenIn
+ ) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_tokenIn);
+ vm.assume(_tokenIn != tokenIn);
+ vm.assume(_tokenIn != tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.swapExactAmountOut(_tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_NotBoundTokenOut(
+ SwapExactAmountOut_FuzzScenario memory _fuzz,
+ address _tokenOut
+ ) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_tokenOut);
+ vm.assume(_tokenOut != tokenIn);
+ vm.assume(_tokenOut != tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, _tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_NotPublic(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setPublicSwap(false);
+
+ vm.expectRevert('ERR_SWAP_NOT_PUBLIC');
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_MaxOutRatio(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountOut = bmul(_fuzz.tokenOutBalance, MAX_OUT_RATIO) + 1;
+
+ vm.expectRevert('ERR_MAX_OUT_RATIO');
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_BadLimitPrice(
+ SwapExactAmountOut_FuzzScenario memory _fuzz,
+ uint256 _maxPrice
+ ) public happyPath(_fuzz) {
+ uint256 _spotPriceBefore = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ vm.assume(_spotPriceBefore > 0);
+ _maxPrice = bound(_maxPrice, 0, _spotPriceBefore - 1);
+
+ vm.expectRevert('ERR_BAD_LIMIT_PRICE');
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, _maxPrice);
+ }
+
+ function test_Revert_LimitIn(
+ SwapExactAmountOut_FuzzScenario memory _fuzz,
+ uint256 _maxAmountIn
+ ) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = calcInGivenOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+ _maxAmountIn = bound(_maxAmountIn, 0, _tokenAmountIn - 1);
+
+ vm.expectRevert('ERR_LIMIT_IN');
+ bPool.swapExactAmountOut(tokenIn, _maxAmountIn, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_Reentrancy(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Set_InRecord(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ (uint256 _tokenAmountIn,) =
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+
+ assertEq(bPool.getBalance(tokenIn), _fuzz.tokenInBalance + _tokenAmountIn);
+ }
+
+ function test_Set_OutRecord(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+
+ assertEq(bPool.getBalance(tokenOut), _fuzz.tokenOutBalance - _fuzz.tokenAmountOut);
+ }
+
+ function test_Revert_MathApprox() public {
+ vm.skip(true);
+ // TODO: this revert might be unreachable. Find a way to test it or remove the revert in the code.
+ }
+
+ function test_Revert_LimitPrice(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = calcInGivenOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+ uint256 _spotPriceBefore = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ uint256 _spotPriceAfter = calcSpotPrice(
+ _fuzz.tokenInBalance + _tokenAmountIn,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance - _fuzz.tokenAmountOut,
+ _fuzz.tokenOutDenorm,
+ _fuzz.swapFee
+ );
+ vm.assume(_spotPriceAfter > _spotPriceBefore);
+
+ vm.expectRevert('ERR_LIMIT_PRICE');
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, _spotPriceBefore);
+ }
+
+ function test_Revert_MathApprox2(SwapExactAmountOut_FuzzScenario memory _fuzz) public {
+ // Replicating _assumeHappyPath, but removing irrelevant assumptions and conditioning the revert
+ _fuzz.tokenInDenorm = bound(_fuzz.tokenInDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.tokenOutDenorm = bound(_fuzz.tokenOutDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+ _fuzz.tokenInBalance = bound(_fuzz.tokenInBalance, MIN_BALANCE, type(uint256).max);
+ _fuzz.tokenOutBalance = bound(_fuzz.tokenOutBalance, MIN_BALANCE, type(uint256).max);
+ vm.assume(_fuzz.tokenInBalance < type(uint256).max / _fuzz.tokenInDenorm);
+ vm.assume(_fuzz.tokenOutBalance < type(uint256).max / _fuzz.tokenOutDenorm);
+ vm.assume(_fuzz.tokenAmountOut < type(uint256).max - _fuzz.tokenOutBalance);
+ vm.assume(_fuzz.tokenOutBalance + _fuzz.tokenAmountOut < type(uint256).max / _fuzz.tokenOutDenorm);
+ vm.assume(_fuzz.tokenAmountOut <= bmul(_fuzz.tokenOutBalance, MAX_OUT_RATIO));
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ uint256 _spotPriceBefore = calcSpotPrice(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenOutDenorm, _fuzz.swapFee
+ );
+ _assumeCalcInGivenOut(
+ _fuzz.tokenOutDenorm, _fuzz.tokenInDenorm, _fuzz.tokenOutBalance, _fuzz.tokenAmountOut, _fuzz.tokenInBalance
+ );
+ uint256 _tokenAmountIn = calcInGivenOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+ vm.assume(_tokenAmountIn > BONE);
+ vm.assume(_tokenAmountIn < type(uint256).max - _fuzz.tokenInBalance);
+ vm.assume(_fuzz.tokenInBalance + _tokenAmountIn < type(uint256).max / _fuzz.tokenInDenorm);
+ _assumeCalcSpotPrice(
+ _fuzz.tokenInBalance + _tokenAmountIn,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance - _fuzz.tokenAmountOut,
+ _fuzz.tokenOutDenorm,
+ _fuzz.swapFee
+ );
+ vm.assume(_spotPriceBefore > bdiv(_tokenAmountIn, _fuzz.tokenAmountOut));
+
+ _setValues(_fuzz);
+
+ vm.expectRevert('ERR_MATH_APPROX');
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Emit_LogSwap(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = calcInGivenOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+
+ vm.expectEmit();
+ emit BPool.LOG_SWAP(address(this), tokenIn, tokenOut, _tokenAmountIn, _fuzz.tokenAmountOut);
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Pull_TokenAmountIn(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = calcInGivenOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+
+ vm.expectCall(
+ address(tokenIn),
+ abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(bPool), _tokenAmountIn)
+ );
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Push_TokenAmountOut(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectCall(
+ address(tokenOut), abi.encodeWithSelector(IERC20.transfer.selector, address(this), _fuzz.tokenAmountOut)
+ );
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Returns_AmountAndPrice(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _expectedTokenAmountIn = calcInGivenOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+ uint256 _expectedSpotPriceAfter = calcSpotPrice(
+ _fuzz.tokenInBalance + _expectedTokenAmountIn,
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenOutBalance - _fuzz.tokenAmountOut,
+ _fuzz.tokenOutDenorm,
+ _fuzz.swapFee
+ );
+
+ (uint256 _tokenAmountIn, uint256 _spotPriceAfter) =
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+
+ assertEq(_expectedTokenAmountIn, _tokenAmountIn);
+ assertEq(_expectedSpotPriceAfter, _spotPriceAfter);
+ }
+
+ function test_Emit_LogCall(SwapExactAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(
+ BPool.swapExactAmountOut.selector, tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max
+ );
+ emit BPool.LOG_CALL(BPool.swapExactAmountOut.selector, address(this), _data);
+
+ bPool.swapExactAmountOut(tokenIn, type(uint256).max, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+}
+
+contract BPool_Unit_JoinswapExternAmountIn is BasePoolTest {
+ address tokenIn;
+
+ struct JoinswapExternAmountIn_FuzzScenario {
+ uint256 tokenAmountIn;
+ uint256 tokenInBalance;
+ uint256 tokenInDenorm;
+ uint256 totalSupply;
+ uint256 totalWeight;
+ uint256 swapFee;
+ }
+
+ function _setValues(JoinswapExternAmountIn_FuzzScenario memory _fuzz) internal {
+ tokenIn = tokens[0];
+
+ // Create mocks for tokenIn
+ _mockTransferFrom(tokenIn);
+
+ // Set balances
+ _setRecord(
+ tokenIn,
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: _fuzz.tokenInDenorm,
+ balance: _fuzz.tokenInBalance
+ })
+ );
+
+ // Set swapFee
+ _setSwapFee(_fuzz.swapFee);
+ // Set public swap
+ _setPublicSwap(true);
+ // Set finalize
+ _setFinalize(true);
+ // Set totalSupply
+ _setTotalSupply(_fuzz.totalSupply);
+ // Set totalWeight
+ _setTotalWeight(_fuzz.totalWeight);
+ }
+
+ function _assumeHappyPath(JoinswapExternAmountIn_FuzzScenario memory _fuzz) internal pure {
+ // safe bound assumptions
+ _fuzz.tokenInDenorm = bound(_fuzz.tokenInDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, MIN_WEIGHT * TOKENS_AMOUNT, MAX_TOTAL_WEIGHT);
+
+ _fuzz.totalSupply = bound(_fuzz.totalSupply, INIT_POOL_SUPPLY, type(uint256).max);
+ _fuzz.tokenInBalance = bound(_fuzz.tokenInBalance, MIN_BALANCE, type(uint256).max);
+
+ // max
+ vm.assume(_fuzz.tokenInBalance < type(uint256).max - _fuzz.tokenAmountIn);
+
+ // MAX_IN_RATIO
+ vm.assume(_fuzz.tokenInBalance < type(uint256).max / MAX_IN_RATIO);
+ vm.assume(_fuzz.tokenAmountIn <= bmul(_fuzz.tokenInBalance, MAX_IN_RATIO));
+
+ // internal calculation for calcPoolOutGivenSingleIn
+ _assumeCalcPoolOutGivenSingleIn(
+ _fuzz.tokenInDenorm,
+ _fuzz.tokenInBalance,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee,
+ _fuzz.totalWeight,
+ _fuzz.totalSupply
+ );
+ }
+
+ modifier happyPath(JoinswapExternAmountIn_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotFinalized(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setFinalize(false);
+
+ vm.expectRevert('ERR_NOT_FINALIZED');
+ bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+ }
+
+ function test_Revert_NotBound(
+ JoinswapExternAmountIn_FuzzScenario memory _fuzz,
+ address _tokenIn
+ ) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_tokenIn);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.joinswapExternAmountIn(_tokenIn, _fuzz.tokenAmountIn, 0);
+ }
+
+ function test_Revert_MaxInRatio(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = bmul(_fuzz.tokenInBalance, MAX_IN_RATIO);
+
+ vm.expectRevert('ERR_MAX_IN_RATIO');
+ bPool.joinswapExternAmountIn(tokenIn, _tokenAmountIn + 1, 0);
+ }
+
+ function test_Revert_LimitOut(
+ JoinswapExternAmountIn_FuzzScenario memory _fuzz,
+ uint256 _minPoolAmountOut
+ ) public happyPath(_fuzz) {
+ uint256 _poolAmountIn = calcPoolOutGivenSingleIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+ _minPoolAmountOut = bound(_minPoolAmountOut, _poolAmountIn + 1, type(uint256).max);
+
+ vm.expectRevert('ERR_LIMIT_OUT');
+ bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, _minPoolAmountOut);
+ }
+
+ function test_Revert_Reentrancy(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public {
+ _expectRevertByReentrancy();
+ bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+ }
+
+ function test_Set_Balance(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+
+ assertEq(bPool.getBalance(tokenIn), _fuzz.tokenInBalance + _fuzz.tokenAmountIn);
+ }
+
+ function test_Emit_LogJoin(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ emit BPool.LOG_JOIN(address(this), tokenIn, _fuzz.tokenAmountIn);
+
+ bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+ }
+
+ function test_Mint_PoolShare(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ (uint256 _poolAmountOut) = bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+
+ assertEq(bPool.totalSupply(), _fuzz.totalSupply + _poolAmountOut);
+ }
+
+ function test_Push_PoolShare(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _balanceBefore = bPool.balanceOf(address(this));
+
+ (uint256 _poolAmountOut) = bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+
+ assertEq(bPool.balanceOf(address(this)), _balanceBefore + _poolAmountOut);
+ }
+
+ function test_Pull_Underlying(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectCall(
+ address(tokenIn),
+ abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(bPool), _fuzz.tokenAmountIn)
+ );
+ bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+ }
+
+ function test_Returns_PoolAmountOut(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _expectedPoolAmountOut = calcPoolOutGivenSingleIn(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountIn,
+ _fuzz.swapFee
+ );
+
+ (uint256 _poolAmountOut) = bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+
+ assertEq(_poolAmountOut, _expectedPoolAmountOut);
+ }
+
+ function test_Emit_LogCall(JoinswapExternAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.joinswapExternAmountIn.selector, tokenIn, _fuzz.tokenAmountIn, 0);
+ emit BPool.LOG_CALL(BPool.joinswapExternAmountIn.selector, address(this), _data);
+
+ bPool.joinswapExternAmountIn(tokenIn, _fuzz.tokenAmountIn, 0);
+ }
+}
+
+contract BPool_Unit_JoinswapPoolAmountOut is BasePoolTest {
+ address tokenIn;
+
+ struct JoinswapPoolAmountOut_FuzzScenario {
+ uint256 poolAmountOut;
+ uint256 tokenInBalance;
+ uint256 tokenInDenorm;
+ uint256 totalSupply;
+ uint256 totalWeight;
+ uint256 swapFee;
+ }
+
+ function _setValues(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) internal {
+ tokenIn = tokens[0];
+
+ // Create mocks for tokenIn
+ _mockTransferFrom(tokenIn);
+
+ // Set balances
+ _setRecord(
+ tokenIn,
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: _fuzz.tokenInDenorm,
+ balance: _fuzz.tokenInBalance
+ })
+ );
+
+ // Set swapFee
+ _setSwapFee(_fuzz.swapFee);
+ // Set public swap
+ _setPublicSwap(true);
+ // Set finalize
+ _setFinalize(true);
+ // Set totalSupply
+ _setTotalSupply(_fuzz.totalSupply);
+ // Set totalWeight
+ _setTotalWeight(_fuzz.totalWeight);
+ }
+
+ function _assumeHappyPath(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) internal view {
+ // safe bound assumptions
+ _fuzz.tokenInDenorm = bound(_fuzz.tokenInDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, MIN_WEIGHT * TOKENS_AMOUNT, MAX_TOTAL_WEIGHT);
+
+ _fuzz.poolAmountOut = bound(_fuzz.poolAmountOut, INIT_POOL_SUPPLY, type(uint256).max - INIT_POOL_SUPPLY);
+ _fuzz.totalSupply = bound(_fuzz.totalSupply, INIT_POOL_SUPPLY, type(uint256).max - _fuzz.poolAmountOut);
+
+ // min
+ vm.assume(_fuzz.tokenInBalance >= MIN_BALANCE);
+
+ // internal calculation for calcSingleInGivenPoolOut
+ _assumeCalcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.totalSupply, _fuzz.totalWeight, _fuzz.poolAmountOut
+ );
+
+ uint256 _tokenAmountIn = calcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountOut,
+ _fuzz.swapFee
+ );
+
+ // L428 BPool.sol
+ vm.assume(_tokenAmountIn > 0);
+
+ // max
+ vm.assume(_fuzz.tokenInBalance < type(uint256).max - _tokenAmountIn);
+
+ // MAX_IN_RATIO
+ vm.assume(_fuzz.tokenInBalance < type(uint256).max / MAX_IN_RATIO);
+ vm.assume(_tokenAmountIn <= bmul(_fuzz.tokenInBalance, MAX_IN_RATIO));
+ }
+
+ modifier happyPath(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotFinalized(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setFinalize(false);
+
+ vm.expectRevert('ERR_NOT_FINALIZED');
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_NotBound(
+ JoinswapPoolAmountOut_FuzzScenario memory _fuzz,
+ address _tokenIn
+ ) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_tokenIn);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.joinswapPoolAmountOut(_tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_MathApprox(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _fuzz.poolAmountOut = 0;
+
+ vm.expectRevert('ERR_MATH_APPROX');
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_LimitIn(
+ JoinswapPoolAmountOut_FuzzScenario memory _fuzz,
+ uint256 _maxAmountIn
+ ) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = calcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountOut,
+ _fuzz.swapFee
+ );
+ _maxAmountIn = bound(_maxAmountIn, 0, _tokenAmountIn - 1);
+
+ vm.expectRevert('ERR_LIMIT_IN');
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, _maxAmountIn);
+ }
+
+ function test_Revert_MaxInRatio(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public {
+ // Replicating _assumeHappyPath, but removing irrelevant assumptions and conditioning the revert
+ _fuzz.tokenInDenorm = bound(_fuzz.tokenInDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, MIN_WEIGHT * TOKENS_AMOUNT, MAX_TOTAL_WEIGHT);
+ _fuzz.tokenInBalance = bound(_fuzz.tokenInBalance, MIN_BALANCE, type(uint256).max / MAX_IN_RATIO);
+ _fuzz.poolAmountOut = bound(_fuzz.poolAmountOut, INIT_POOL_SUPPLY, type(uint256).max - INIT_POOL_SUPPLY);
+ _fuzz.totalSupply = bound(_fuzz.totalSupply, INIT_POOL_SUPPLY, type(uint256).max - _fuzz.poolAmountOut);
+ _assumeCalcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance, _fuzz.tokenInDenorm, _fuzz.totalSupply, _fuzz.totalWeight, _fuzz.poolAmountOut
+ );
+ uint256 _tokenAmountIn = calcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountOut,
+ _fuzz.swapFee
+ );
+ vm.assume(_tokenAmountIn > bmul(_fuzz.tokenInBalance, MAX_IN_RATIO));
+
+ _setValues(_fuzz);
+
+ vm.expectRevert('ERR_MAX_IN_RATIO');
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_Reentrancy(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public {
+ _expectRevertByReentrancy();
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ }
+
+ function test_Set_Balance(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _balanceBefore = bPool.getBalance(tokenIn);
+
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+
+ uint256 _tokenAmountIn = calcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountOut,
+ _fuzz.swapFee
+ );
+
+ assertEq(bPool.getBalance(tokenIn), _balanceBefore + _tokenAmountIn);
+ }
+
+ function test_Emit_LogJoin(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = calcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountOut,
+ _fuzz.swapFee
+ );
+
+ vm.expectEmit();
+ emit BPool.LOG_JOIN(address(this), tokenIn, _tokenAmountIn);
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ }
+
+ function test_Mint_PoolShare(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+
+ assertEq(bPool.totalSupply(), _fuzz.totalSupply + _fuzz.poolAmountOut);
+ }
+
+ function test_Push_PoolShare(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _balanceBefore = bPool.balanceOf(address(this));
+
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+
+ assertEq(bPool.balanceOf(address(this)), _balanceBefore + _fuzz.poolAmountOut);
+ }
+
+ function test_Pull_Underlying(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountIn = calcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountOut,
+ _fuzz.swapFee
+ );
+
+ vm.expectCall(
+ address(tokenIn),
+ abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(bPool), _tokenAmountIn)
+ );
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ }
+
+ function test_Returns_TokenAmountIn(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _expectedTokenAmountIn = calcSingleInGivenPoolOut(
+ _fuzz.tokenInBalance,
+ _fuzz.tokenInDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountOut,
+ _fuzz.swapFee
+ );
+
+ (uint256 _tokenAmountIn) = bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+
+ assertEq(_expectedTokenAmountIn, _tokenAmountIn);
+ }
+
+ function test_Emit_LogCall(JoinswapPoolAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data =
+ abi.encodeWithSelector(BPool.joinswapPoolAmountOut.selector, tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ emit BPool.LOG_CALL(BPool.joinswapPoolAmountOut.selector, address(this), _data);
+
+ bPool.joinswapPoolAmountOut(tokenIn, _fuzz.poolAmountOut, type(uint256).max);
+ }
+}
+
+contract BPool_Unit_ExitswapPoolAmountIn is BasePoolTest {
+ address tokenOut;
+
+ struct ExitswapPoolAmountIn_FuzzScenario {
+ uint256 poolAmountIn;
+ uint256 tokenOutBalance;
+ uint256 tokenOutDenorm;
+ uint256 totalSupply;
+ uint256 totalWeight;
+ uint256 swapFee;
+ }
+
+ function _setValues(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) internal {
+ tokenOut = tokens[0];
+
+ // Create mocks for tokenOut
+ _mockTransfer(tokenOut);
+
+ // Set balances
+ _setRecord(
+ tokenOut,
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: _fuzz.tokenOutDenorm,
+ balance: _fuzz.tokenOutBalance
+ })
+ );
+
+ // Set swapFee
+ _setSwapFee(_fuzz.swapFee);
+ // Set public swap
+ _setPublicSwap(true);
+ // Set finalize
+ _setFinalize(true);
+ // Set balance
+ _setPoolBalance(address(this), _fuzz.poolAmountIn); // give LP tokens to fn caller
+ // Set totalSupply
+ _setTotalSupply(_fuzz.totalSupply - _fuzz.poolAmountIn);
+ // Set totalWeight
+ _setTotalWeight(_fuzz.totalWeight);
+ }
+
+ function _assumeHappyPath(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) internal pure {
+ // safe bound assumptions
+ _fuzz.tokenOutDenorm = bound(_fuzz.tokenOutDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, MIN_WEIGHT * TOKENS_AMOUNT, MAX_TOTAL_WEIGHT);
+ _fuzz.totalSupply = bound(_fuzz.totalSupply, INIT_POOL_SUPPLY, type(uint256).max);
+
+ // max
+ vm.assume(_fuzz.poolAmountIn < _fuzz.totalSupply);
+ vm.assume(_fuzz.totalSupply < type(uint256).max - _fuzz.poolAmountIn);
+
+ // min
+ vm.assume(_fuzz.tokenOutBalance >= MIN_BALANCE);
+
+ // internal calculation for calcSingleOutGivenPoolIn
+ _assumeCalcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+
+ uint256 _tokenAmountOut = calcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+
+ // max
+ vm.assume(_fuzz.tokenOutBalance < type(uint256).max - _tokenAmountOut);
+
+ // MAX_OUT_RATIO
+ vm.assume(_fuzz.tokenOutBalance < type(uint256).max / MAX_OUT_RATIO);
+ vm.assume(_tokenAmountOut <= bmul(_fuzz.tokenOutBalance, MAX_OUT_RATIO));
+ }
+
+ modifier happyPath(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) {
+ _assumeHappyPath(_fuzz);
+ _setValues(_fuzz);
+ _;
+ }
+
+ function test_Revert_NotFinalized(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _setFinalize(false);
+
+ vm.expectRevert('ERR_NOT_FINALIZED');
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+ }
+
+ function test_Revert_NotBound(
+ ExitswapPoolAmountIn_FuzzScenario memory _fuzz,
+ address _tokenIn
+ ) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_tokenIn);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.exitswapPoolAmountIn(_tokenIn, _fuzz.poolAmountIn, 0);
+ }
+
+ function test_Revert_LimitOut(
+ ExitswapPoolAmountIn_FuzzScenario memory _fuzz,
+ uint256 _minAmountOut
+ ) public happyPath(_fuzz) {
+ uint256 _tokenAmountOut = calcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+ _minAmountOut = bound(_minAmountOut, _tokenAmountOut + 1, type(uint256).max);
+
+ vm.expectRevert('ERR_LIMIT_OUT');
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, _minAmountOut);
+ }
+
+ function test_Revert_MaxOutRatio(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public {
+ // Replicating _assumeHappyPath, but removing irrelevant assumptions and conditioning the revert
+ _fuzz.tokenOutDenorm = bound(_fuzz.tokenOutDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, MIN_WEIGHT * TOKENS_AMOUNT, MAX_TOTAL_WEIGHT);
+ _fuzz.tokenOutBalance = bound(_fuzz.tokenOutBalance, MIN_BALANCE, type(uint256).max / MAX_OUT_RATIO);
+ _fuzz.totalSupply = bound(_fuzz.totalSupply, INIT_POOL_SUPPLY, type(uint256).max);
+ vm.assume(_fuzz.totalSupply < type(uint256).max - _fuzz.poolAmountIn);
+ vm.assume(_fuzz.poolAmountIn < _fuzz.totalSupply);
+ _assumeCalcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+ uint256 _tokenAmountOut = calcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+ vm.assume(_tokenAmountOut > bmul(_fuzz.tokenOutBalance, MAX_OUT_RATIO));
+
+ _setValues(_fuzz);
+
+ vm.expectRevert('ERR_MAX_OUT_RATIO');
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+ }
+
+ function test_Revert_Reentrancy(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _expectRevertByReentrancy();
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+ }
+
+ function test_Set_Balance(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _balanceBefore = bPool.getBalance(tokenOut);
+ uint256 _tokenAmountOut = calcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+
+ assertEq(bPool.getBalance(tokenOut), _balanceBefore - _tokenAmountOut);
+ }
+
+ function test_Emit_LogExit(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountOut = calcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+
+ vm.expectEmit();
+ emit BPool.LOG_EXIT(address(this), tokenOut, _tokenAmountOut);
+
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+ }
+
+ function test_Pull_PoolShare(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _balanceBefore = bPool.balanceOf(address(this));
+
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+
+ assertEq(bPool.balanceOf(address(this)), _balanceBefore - _fuzz.poolAmountIn);
+ }
+
+ function test_Burn_PoolShare(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _totalSupplyBefore = bPool.totalSupply();
+ uint256 _exitFee = bmul(_fuzz.poolAmountIn, EXIT_FEE);
+
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+
+ assertEq(bPool.totalSupply(), _totalSupplyBefore - bsub(_fuzz.poolAmountIn, _exitFee));
+ }
+
+ function test_Push_PoolShare(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ address _factoryAddress = bPool.call__factory();
+ uint256 _balanceBefore = bPool.balanceOf(_factoryAddress);
+ uint256 _exitFee = bmul(_fuzz.poolAmountIn, EXIT_FEE);
+
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+
+ assertEq(bPool.balanceOf(_factoryAddress), _balanceBefore - _fuzz.poolAmountIn + _exitFee);
+ }
+
+ function test_Push_Underlying(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _tokenAmountOut = calcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+
+ vm.expectCall(address(tokenOut), abi.encodeWithSelector(IERC20.transfer.selector, address(this), _tokenAmountOut));
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+ }
+
+ function test_Returns_TokenAmountOut(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _expectedTokenAmountOut = calcSingleOutGivenPoolIn(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.poolAmountIn,
+ _fuzz.swapFee
+ );
+
+ (uint256 _tokenAmountOut) = bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+
+ assertEq(_tokenAmountOut, _expectedTokenAmountOut);
+ }
+
+ function test_Emit_LogCall(ExitswapPoolAmountIn_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data = abi.encodeWithSelector(BPool.exitswapPoolAmountIn.selector, tokenOut, _fuzz.poolAmountIn, 0);
+ emit BPool.LOG_CALL(BPool.exitswapPoolAmountIn.selector, address(this), _data);
+
+ bPool.exitswapPoolAmountIn(tokenOut, _fuzz.poolAmountIn, 0);
+ }
+}
+
+contract BPool_Unit_ExitswapExternAmountOut is BasePoolTest {
+ address tokenOut;
+
+ struct ExitswapExternAmountOut_FuzzScenario {
+ uint256 tokenAmountOut;
+ uint256 tokenOutBalance;
+ uint256 tokenOutDenorm;
+ uint256 totalSupply;
+ uint256 totalWeight;
+ uint256 swapFee;
+ }
+
+ function _setValues(ExitswapExternAmountOut_FuzzScenario memory _fuzz, uint256 _poolAmountIn) internal {
+ tokenOut = tokens[0];
+
+ // Create mocks for tokenOut
+ _mockTransfer(tokenOut);
+
+ // Set balances
+ _setRecord(
+ tokenOut,
+ BPool.Record({
+ bound: true,
+ index: 0, // NOTE: irrelevant for this method
+ denorm: _fuzz.tokenOutDenorm,
+ balance: _fuzz.tokenOutBalance
+ })
+ );
+
+ // Set swapFee
+ _setSwapFee(_fuzz.swapFee);
+ // Set public swap
+ _setPublicSwap(true);
+ // Set finalize
+ _setFinalize(true);
+ // Set balance
+ _setPoolBalance(address(this), _poolAmountIn); // give LP tokens to fn caller
+ // Set totalSupply
+ _setTotalSupply(_fuzz.totalSupply - _poolAmountIn);
+ // Set totalWeight
+ _setTotalWeight(_fuzz.totalWeight);
+ }
+
+ function _assumeHappyPath(ExitswapExternAmountOut_FuzzScenario memory _fuzz)
+ internal
+ pure
+ returns (uint256 _poolAmountIn)
+ {
+ // safe bound assumptions
+ _fuzz.tokenOutDenorm = bound(_fuzz.tokenOutDenorm, MIN_WEIGHT, MAX_WEIGHT);
+ _fuzz.swapFee = bound(_fuzz.swapFee, MIN_FEE, MAX_FEE);
+ _fuzz.totalWeight = bound(_fuzz.totalWeight, MIN_WEIGHT * TOKENS_AMOUNT, MAX_TOTAL_WEIGHT);
+
+ // min
+ _fuzz.totalSupply = bound(_fuzz.totalSupply, INIT_POOL_SUPPLY, type(uint256).max);
+
+ // MAX_OUT_RATIO
+ vm.assume(_fuzz.tokenOutBalance < type(uint256).max / MAX_OUT_RATIO);
+ vm.assume(_fuzz.tokenAmountOut <= bmul(_fuzz.tokenOutBalance, MAX_OUT_RATIO));
+
+ // min
+ vm.assume(_fuzz.tokenOutBalance >= MIN_BALANCE);
+
+ // max
+ vm.assume(_fuzz.tokenOutBalance < type(uint256).max - _fuzz.tokenAmountOut);
+
+ // internal calculation for calcPoolInGivenSingleOut
+ _assumeCalcPoolInGivenSingleOut(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+
+ _poolAmountIn = calcPoolInGivenSingleOut(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+
+ // min
+ vm.assume(_poolAmountIn > 0);
+
+ // max
+ vm.assume(_poolAmountIn < _fuzz.totalSupply);
+ vm.assume(_fuzz.totalSupply < type(uint256).max - _poolAmountIn);
+ }
+
+ modifier happyPath(ExitswapExternAmountOut_FuzzScenario memory _fuzz) {
+ uint256 _poolAmountIn = _assumeHappyPath(_fuzz);
+ _setValues(_fuzz, _poolAmountIn);
+ _;
+ }
+
+ function test_Revert_NotFinalized(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public {
+ _setFinalize(false);
+
+ vm.expectRevert('ERR_NOT_FINALIZED');
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_NotBound(
+ ExitswapExternAmountOut_FuzzScenario memory _fuzz,
+ address _tokenOut
+ ) public happyPath(_fuzz) {
+ assumeNotForgeAddress(_tokenOut);
+
+ vm.expectRevert('ERR_NOT_BOUND');
+ bPool.exitswapExternAmountOut(_tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_MaxOutRatio(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _maxTokenAmountOut = bmul(_fuzz.tokenOutBalance, MAX_OUT_RATIO);
+
+ vm.expectRevert('ERR_MAX_OUT_RATIO');
+ bPool.exitswapExternAmountOut(tokenOut, _maxTokenAmountOut + 1, type(uint256).max);
+ }
+
+ function test_Revert_MathApprox(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ _fuzz.tokenAmountOut = 0;
+
+ vm.expectRevert('ERR_MATH_APPROX');
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Revert_LimitIn(
+ ExitswapExternAmountOut_FuzzScenario memory _fuzz,
+ uint256 _maxPoolAmountIn
+ ) public happyPath(_fuzz) {
+ uint256 _poolAmountIn = calcPoolInGivenSingleOut(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+ _maxPoolAmountIn = bound(_maxPoolAmountIn, 0, _poolAmountIn - 1);
+
+ vm.expectRevert('ERR_LIMIT_IN');
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, _maxPoolAmountIn);
+ }
+
+ function test_Revert_Reentrancy(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public {
+ _expectRevertByReentrancy();
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Set_Balance(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+
+ assertEq(bPool.getBalance(tokenOut), _fuzz.tokenOutBalance - _fuzz.tokenAmountOut);
+ }
+
+ function test_Emit_LogExit(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ emit BPool.LOG_EXIT(address(this), tokenOut, _fuzz.tokenAmountOut);
+
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Pull_PoolShare(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _balanceBefore = bPool.balanceOf(address(this));
+ uint256 _poolAmountIn = calcPoolInGivenSingleOut(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+ uint256 _exitFee = bmul(_poolAmountIn, EXIT_FEE);
+
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+
+ assertEq(bPool.balanceOf(address(this)), _balanceBefore - bsub(_poolAmountIn, _exitFee));
+ }
+
+ function test_Burn_PoolShare(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _totalSupplyBefore = bPool.totalSupply();
+ uint256 _poolAmountIn = calcPoolInGivenSingleOut(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+ uint256 _exitFee = bmul(_poolAmountIn, EXIT_FEE);
+
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+
+ assertEq(bPool.totalSupply(), _totalSupplyBefore - bsub(_poolAmountIn, _exitFee));
+ }
+
+ function test_Push_PoolShare(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ address _factoryAddress = bPool.call__factory();
+ uint256 _balanceBefore = bPool.balanceOf(_factoryAddress);
+ uint256 _poolAmountIn = calcPoolInGivenSingleOut(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+ uint256 _exitFee = bmul(_poolAmountIn, EXIT_FEE);
+
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+
+ assertEq(bPool.balanceOf(_factoryAddress), _balanceBefore - _poolAmountIn + _exitFee);
+ }
+
+ function test_Push_Underlying(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectCall(
+ address(tokenOut), abi.encodeWithSelector(IERC20.transfer.selector, address(this), _fuzz.tokenAmountOut)
+ );
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+
+ function test_Returns_PoolAmountIn(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ uint256 _expectedPoolAmountIn = calcPoolInGivenSingleOut(
+ _fuzz.tokenOutBalance,
+ _fuzz.tokenOutDenorm,
+ _fuzz.totalSupply,
+ _fuzz.totalWeight,
+ _fuzz.tokenAmountOut,
+ _fuzz.swapFee
+ );
+
+ (uint256 _poolAmountIn) = bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+
+ assertEq(_expectedPoolAmountIn, _poolAmountIn);
+ }
+
+ function test_Emit_LogCall(ExitswapExternAmountOut_FuzzScenario memory _fuzz) public happyPath(_fuzz) {
+ vm.expectEmit();
+ bytes memory _data =
+ abi.encodeWithSelector(BPool.exitswapExternAmountOut.selector, tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ emit BPool.LOG_CALL(BPool.exitswapExternAmountOut.selector, address(this), _data);
+
+ bPool.exitswapExternAmountOut(tokenOut, _fuzz.tokenAmountOut, type(uint256).max);
+ }
+}
+
+contract BPool_Unit__PullUnderlying is BasePoolTest {
+ function test_Call_TransferFrom(address _erc20, address _from, uint256 _amount) public {
+ assumeNotForgeAddress(_erc20);
+
+ vm.mockCall(
+ _erc20, abi.encodeWithSelector(IERC20.transferFrom.selector, _from, address(bPool), _amount), abi.encode(true)
+ );
+
+ vm.expectCall(address(_erc20), abi.encodeWithSelector(IERC20.transferFrom.selector, _from, address(bPool), _amount));
+ bPool.call__pullUnderlying(_erc20, _from, _amount);
+ }
+
+ function test_Revert_ERC20False(address _erc20, address _from, uint256 _amount) public {
+ assumeNotForgeAddress(_erc20);
+
+ vm.mockCall(
+ _erc20, abi.encodeWithSelector(IERC20.transferFrom.selector, _from, address(bPool), _amount), abi.encode(false)
+ );
+
+ vm.expectRevert('ERR_ERC20_FALSE');
+ bPool.call__pullUnderlying(_erc20, _from, _amount);
+ }
+}
+
+contract BPool_Unit__PushUnderlying is BasePoolTest {
+ function test_Call_Transfer(address _erc20, address _to, uint256 _amount) public {
+ assumeNotForgeAddress(_erc20);
+
+ vm.mockCall(_erc20, abi.encodeWithSelector(IERC20.transfer.selector, _to, _amount), abi.encode(true));
+
+ vm.expectCall(address(_erc20), abi.encodeWithSelector(IERC20.transfer.selector, _to, _amount));
+ bPool.call__pushUnderlying(_erc20, _to, _amount);
+ }
+
+ function test_Revert_ERC20False(address _erc20, address _to, uint256 _amount) public {
+ assumeNotForgeAddress(_erc20);
+
+ vm.mockCall(_erc20, abi.encodeWithSelector(IERC20.transfer.selector, _to, _amount), abi.encode(false));
+
+ vm.expectRevert('ERR_ERC20_FALSE');
+ bPool.call__pushUnderlying(_erc20, _to, _amount);
+ }
+}
diff --git a/test/utils/Pow.sol b/test/utils/Pow.sol
new file mode 100644
index 00000000..b8f15d85
--- /dev/null
+++ b/test/utils/Pow.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.23;
+
+import {BNum} from 'contracts/BNum.sol';
+
+contract Pow is BNum {
+ function pow(uint256 _base, uint256 _exp) public pure returns (uint256 _result) {
+ _result = bpow(_base, _exp);
+ }
+}
diff --git a/test/utils/Utils.sol b/test/utils/Utils.sol
new file mode 100644
index 00000000..a4134359
--- /dev/null
+++ b/test/utils/Utils.sol
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.23;
+
+import {Test} from 'forge-std/Test.sol';
+
+contract Utils is Test {
+ uint256 public constant TOKENS_AMOUNT = 3;
+
+ address[TOKENS_AMOUNT] public tokens;
+
+ function _tokensToMemory() internal view returns (address[] memory _tokens) {
+ _tokens = new address[](tokens.length);
+ for (uint256 i = 0; i < tokens.length; i++) {
+ _tokens[i] = tokens[i];
+ }
+ }
+
+ function _staticToDynamicUintArray(uint256[TOKENS_AMOUNT] memory _fixedUintArray)
+ internal
+ pure
+ returns (uint256[] memory _memoryUintArray)
+ {
+ _memoryUintArray = new uint256[](_fixedUintArray.length);
+ for (uint256 i = 0; i < _fixedUintArray.length; i++) {
+ _memoryUintArray[i] = _fixedUintArray[i];
+ }
+ }
+
+ /**
+ * @dev Write a uint256 value to a storage slot.
+ * @param _target The address of the contract.
+ * @param _slotNumber The slot number to write to.
+ * @param _value The value to write.
+ */
+ function _writeUintToStorage(address _target, uint256 _slotNumber, uint256 _value) internal {
+ vm.store(_target, bytes32(_slotNumber), bytes32(_value));
+ }
+
+ /**
+ * @dev Write the length of an array in storage.
+ * @dev This must be performed before writing any items to the array.
+ * @param _target The address of the contract.
+ * @param _arraySlotNumber The slot number of the array.
+ * @param _arrayLength The length of the array.
+ */
+ function _writeArrayLengthToStorage(address _target, uint256 _arraySlotNumber, uint256 _arrayLength) internal {
+ _writeUintToStorage(_target, _arraySlotNumber, _arrayLength);
+ }
+
+ /**
+ * @dev Write an address array item to a storage slot.
+ * @param _target The address of the contract.
+ * @param _arraySlotNumber The slot number of the array.
+ * @param _index The index of the item in the array.
+ * @param _value The address value to write.
+ */
+ function _writeAddressArrayItemToStorage(
+ address _target,
+ uint256 _arraySlotNumber,
+ uint256 _index,
+ address _value
+ ) internal {
+ bytes memory _arraySlot = abi.encode(_arraySlotNumber);
+ bytes32 _hashArraySlot = keccak256(_arraySlot);
+ vm.store(_target, bytes32(uint256(_hashArraySlot) + _index), bytes32(abi.encode(_value)));
+ }
+
+ /**
+ * @dev Write a struct property to a mapping in storage.
+ * @param _target The address of the contract.
+ * @param _mappingSlotNumber The slot number of the mapping.
+ * @param _mappingKey The address key of the mapping.
+ * @param _propertySlotNumber The slot number of the property in the struct.
+ * @param _value The value to write.
+ */
+ function _writeStructPropertyAtAddressMapping(
+ address _target,
+ uint256 _mappingSlotNumber,
+ address _mappingKey,
+ uint256 _propertySlotNumber,
+ uint256 _value
+ ) internal {
+ bytes32 _slot = keccak256(abi.encode(_mappingKey, _mappingSlotNumber));
+ _writeUintToStorage(_target, uint256(_slot) + _propertySlotNumber, _value);
+ }
+
+ /**
+ * @dev Write a uint256 value to an address mapping in storage.
+ * @param _target The address of the contract.
+ * @param _mappingSlotNumber The slot number of the mapping.
+ * @param _mappingKey The address key of the mapping.
+ * @param _value The value to write.
+ */
+ function _writeUintAtAddressMapping(
+ address _target,
+ uint256 _mappingSlotNumber,
+ address _mappingKey,
+ uint256 _value
+ ) internal {
+ bytes32 _slot = keccak256(abi.encode(_mappingKey, _mappingSlotNumber));
+ _writeUintToStorage(_target, uint256(_slot), _value);
+ }
+
+ /**
+ * @dev Load an array of type(uint256).max values into memory.
+ * @param _length The length of the array.
+ */
+ function _maxArray(uint256 _length) internal pure returns (uint256[] memory _maxUintArray) {
+ _maxUintArray = new uint256[](_length);
+ for (uint256 i = 0; i < TOKENS_AMOUNT; i++) {
+ _maxUintArray[i] = type(uint256).max;
+ }
+ }
+
+ /**
+ * @dev Load an array of 0 values into memory.
+ * @param _length The length of the array.
+ */
+ function _zeroArray(uint256 _length) internal pure returns (uint256[] memory _zeroUintArray) {
+ _zeroUintArray = new uint256[](_length);
+ }
+}
diff --git a/truffle-config.js b/truffle-config.js
deleted file mode 100644
index 03bd8bd2..00000000
--- a/truffle-config.js
+++ /dev/null
@@ -1,30 +0,0 @@
-module.exports = {
- networks: {
- development: {
- host: 'localhost', // Localhost (default: none)
- port: 8545, // Standard Ethereum port (default: none)
- network_id: '*', // Any network (default: none)
- gas: 10000000,
- },
- coverage: {
- host: 'localhost',
- network_id: '*',
- port: 8555,
- gas: 0xfffffffffff,
- gasPrice: 0x01,
- },
- },
- // Configure your compilers
- compilers: {
- solc: {
- version: '0.5.12',
- settings: { // See the solidity docs for advice about optimization and evmVersion
- optimizer: {
- enabled: true,
- runs: 100,
- },
- evmVersion: 'byzantium',
- },
- },
- },
-};
diff --git a/yarn.lock b/yarn.lock
index 8666fada..5bae79d8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -18,44 +18,247 @@
esutils "^2.0.2"
js-tokens "^4.0.0"
-"@babel/runtime-corejs3@^7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.7.4.tgz#f861adc1cecb9903dfd66ea97917f02ff8d79888"
- integrity sha512-BBIEhzk8McXDcB3IbOi8zQPzzINUp4zcLesVlBSOcyGhzPUU8Xezk5GAG7Sy5GVhGmAO0zGd2qRSeY2g4Obqxw==
+"@commitlint/cli@19.3.0":
+ version "19.3.0"
+ resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.3.0.tgz#44e6da9823a01f0cdcc43054bbefdd2c6c5ddf39"
+ integrity sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==
+ dependencies:
+ "@commitlint/format" "^19.3.0"
+ "@commitlint/lint" "^19.2.2"
+ "@commitlint/load" "^19.2.0"
+ "@commitlint/read" "^19.2.1"
+ "@commitlint/types" "^19.0.3"
+ execa "^8.0.1"
+ yargs "^17.0.0"
+
+"@commitlint/config-conventional@19.2.2":
+ version "19.2.2"
+ resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz#1f4e6975d428985deacf2b3ff6547e02c9302054"
+ integrity sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==
+ dependencies:
+ "@commitlint/types" "^19.0.3"
+ conventional-changelog-conventionalcommits "^7.0.2"
+
+"@commitlint/config-validator@^19.0.3":
+ version "19.0.3"
+ resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.0.3.tgz#052b181a30da6b4fc16dc5230f4589ac95e0bc81"
+ integrity sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==
+ dependencies:
+ "@commitlint/types" "^19.0.3"
+ ajv "^8.11.0"
+
+"@commitlint/ensure@^19.0.3":
+ version "19.0.3"
+ resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-19.0.3.tgz#d172b1b72ca88cbd317ea1ee79f3a03dbaccc76e"
+ integrity sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==
+ dependencies:
+ "@commitlint/types" "^19.0.3"
+ lodash.camelcase "^4.3.0"
+ lodash.kebabcase "^4.1.1"
+ lodash.snakecase "^4.1.1"
+ lodash.startcase "^4.4.0"
+ lodash.upperfirst "^4.3.1"
+
+"@commitlint/execute-rule@^19.0.0":
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz#928fb239ae8deec82a6e3b05ec9cfe20afa83856"
+ integrity sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==
+
+"@commitlint/format@^19.3.0":
+ version "19.3.0"
+ resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-19.3.0.tgz#48dd9e6930d41eb0ca19f36159ee940c5b25d857"
+ integrity sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==
+ dependencies:
+ "@commitlint/types" "^19.0.3"
+ chalk "^5.3.0"
+
+"@commitlint/is-ignored@^19.2.2":
+ version "19.2.2"
+ resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz#503ddcf908ac6b2bc4586a49cb53893a1856f5b2"
+ integrity sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==
+ dependencies:
+ "@commitlint/types" "^19.0.3"
+ semver "^7.6.0"
+
+"@commitlint/lint@^19.2.2":
+ version "19.2.2"
+ resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-19.2.2.tgz#57f69e24bd832a7dcce8ebf82d11e3bf03ccc2a9"
+ integrity sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==
+ dependencies:
+ "@commitlint/is-ignored" "^19.2.2"
+ "@commitlint/parse" "^19.0.3"
+ "@commitlint/rules" "^19.0.3"
+ "@commitlint/types" "^19.0.3"
+
+"@commitlint/load@^19.2.0":
+ version "19.2.0"
+ resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.2.0.tgz#3ca51fdead4f1e1e09c9c7df343306412b1ef295"
+ integrity sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==
+ dependencies:
+ "@commitlint/config-validator" "^19.0.3"
+ "@commitlint/execute-rule" "^19.0.0"
+ "@commitlint/resolve-extends" "^19.1.0"
+ "@commitlint/types" "^19.0.3"
+ chalk "^5.3.0"
+ cosmiconfig "^9.0.0"
+ cosmiconfig-typescript-loader "^5.0.0"
+ lodash.isplainobject "^4.0.6"
+ lodash.merge "^4.6.2"
+ lodash.uniq "^4.5.0"
+
+"@commitlint/message@^19.0.0":
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-19.0.0.tgz#f789dd1b7a1f9c784578e0111f46cc3fecf5a531"
+ integrity sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==
+
+"@commitlint/parse@^19.0.3":
+ version "19.0.3"
+ resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-19.0.3.tgz#a2d09876d458e17ad0e1695b04f41af8b50a41c2"
+ integrity sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==
+ dependencies:
+ "@commitlint/types" "^19.0.3"
+ conventional-changelog-angular "^7.0.0"
+ conventional-commits-parser "^5.0.0"
+
+"@commitlint/read@^19.2.1":
+ version "19.2.1"
+ resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-19.2.1.tgz#7296b99c9a989e60e5927fff8388a1dd44299c2f"
+ integrity sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==
+ dependencies:
+ "@commitlint/top-level" "^19.0.0"
+ "@commitlint/types" "^19.0.3"
+ execa "^8.0.1"
+ git-raw-commits "^4.0.0"
+ minimist "^1.2.8"
+
+"@commitlint/resolve-extends@^19.1.0":
+ version "19.1.0"
+ resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz#fa5b8f921e9c8d76f53624c35bf25b9676bd73fa"
+ integrity sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==
+ dependencies:
+ "@commitlint/config-validator" "^19.0.3"
+ "@commitlint/types" "^19.0.3"
+ global-directory "^4.0.1"
+ import-meta-resolve "^4.0.0"
+ lodash.mergewith "^4.6.2"
+ resolve-from "^5.0.0"
+
+"@commitlint/rules@^19.0.3":
+ version "19.0.3"
+ resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-19.0.3.tgz#de647a9055847cae4f3ae32b4798096b604584f3"
+ integrity sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==
+ dependencies:
+ "@commitlint/ensure" "^19.0.3"
+ "@commitlint/message" "^19.0.0"
+ "@commitlint/to-lines" "^19.0.0"
+ "@commitlint/types" "^19.0.3"
+ execa "^8.0.1"
+
+"@commitlint/to-lines@^19.0.0":
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-19.0.0.tgz#aa6618eb371bafbc0cd3b48f0db565c4a40462c6"
+ integrity sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==
+
+"@commitlint/top-level@^19.0.0":
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-19.0.0.tgz#9c44d7cec533bb9598bfae9658737e2d6a903605"
+ integrity sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==
+ dependencies:
+ find-up "^7.0.0"
+
+"@commitlint/types@^19.0.3":
+ version "19.0.3"
+ resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.0.3.tgz#feff4ecac2b5c359f2a57f9ab094b2ac80ef0266"
+ integrity sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==
+ dependencies:
+ "@types/conventional-commits-parser" "^5.0.0"
+ chalk "^5.3.0"
+
+"@defi-wonderland/natspec-smells@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@defi-wonderland/natspec-smells/-/natspec-smells-1.1.1.tgz#1eed85765ebe4799f8861247308d6365dbf6dbaa"
+ integrity sha512-vtOKN4j32Rxl8c1txXxs/iDlkPRmrL/UzUYWOzowe1HYH8ioPMRrsKAYVriDBLsvSi2bY06Sl3cN9SQJSbVzsA==
dependencies:
- core-js-pure "^3.0.0"
- regenerator-runtime "^0.13.2"
+ fast-glob "3.3.2"
+ solc-typed-ast "18.1.2"
+ yargs "17.7.2"
-"@babel/runtime@^7.3.1":
- version "7.6.3"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f"
- integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==
+"@defi-wonderland/smock-foundry@1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@defi-wonderland/smock-foundry/-/smock-foundry-1.5.0.tgz#e0f91cb40a1805644fbe1bcec8bbb6556d72253c"
+ integrity sha512-GjMc8Tgg+jBzV0zp00WTSlExptthocrnE3FY58Zm4Li+jWwrphKRflGRf4F65f1t976SNIW63mleWJViFa4mRA==
dependencies:
- regenerator-runtime "^0.13.2"
+ fast-glob "3.3.2"
+ handlebars "4.7.7"
+ solc-typed-ast "18.1.3"
+ yargs "17.7.2"
-"@babel/runtime@^7.4.5", "@babel/runtime@^7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.4.tgz#b23a856751e4bf099262f867767889c0e3fe175b"
- integrity sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==
+"@noble/curves@1.3.0", "@noble/curves@~1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e"
+ integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==
dependencies:
- regenerator-runtime "^0.13.2"
+ "@noble/hashes" "1.3.3"
+
+"@noble/hashes@1.3.3", "@noble/hashes@~1.3.2":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699"
+ integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==
-"@sindresorhus/is@^0.14.0":
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
- integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+"@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"
-"@szmarczak/http-timer@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
- integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+"@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"
+
+"@scure/base@~1.1.4":
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d"
+ integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==
+
+"@scure/bip32@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.3.tgz#a9624991dc8767087c57999a5d79488f48eae6c8"
+ integrity sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==
+ dependencies:
+ "@noble/curves" "~1.3.0"
+ "@noble/hashes" "~1.3.2"
+ "@scure/base" "~1.1.4"
+
+"@scure/bip39@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527"
+ integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==
+ dependencies:
+ "@noble/hashes" "~1.3.2"
+ "@scure/base" "~1.1.4"
+
+"@solidity-parser/parser@^0.16.0":
+ version "0.16.2"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa"
+ integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==
dependencies:
- defer-to-connect "^1.0.1"
+ antlr4ts "^0.5.0-alpha.4"
-"@types/bn.js@^4.11.4":
- version "4.11.5"
- resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.5.tgz#40e36197433f78f807524ec623afcf0169ac81dc"
- integrity sha512-AEAZcIZga0JgVMHNtl1CprA/hXX7/wPt79AgR4XqaDt7jyj3QWYw6LPoOiznPtugDmlubUnAahMs2PFxGcQrng==
+"@types/conventional-commits-parser@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8"
+ integrity sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==
dependencies:
"@types/node" "*"
@@ -64,17 +267,7 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.3.tgz#ebfe83507ac506bc3486314a8aa395be66af8d23"
integrity sha512-opgSsy+cEF9N8MgaVPnWVtdJ3o4mV2aMHvDq7thkQUFt0EuOHJon4rQpJfhjmNHB+ikl0Cd6WhWIErOyQ+f7tw==
-"@types/node@^10.12.18":
- version "10.17.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.2.tgz#41b5afbcde1a5a805302a4da3cf399499f1bbf64"
- integrity sha512-sAh60KDol+MpwOr1RTK0+HgBEYejKsxdpmrOS1Wts5bI03dLzq8F7T0sRXDKeaEK8iWDlGfdzxrzg6vx/c5pNA==
-
-"@types/node@^10.3.2":
- version "10.14.15"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.15.tgz#e8f7729b631be1b02ae130ff0b61f3e018000640"
- integrity sha512-CBR5avlLcu0YCILJiDIXeU2pTw7UK/NIxfC63m7d7CVamho1qDEzXKkOtEauQRPMy6MI8mLozth+JJkas7HY6g==
-
-JSONStream@^1.3.4:
+JSONStream@^1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
@@ -82,7993 +275,1824 @@ JSONStream@^1.3.4:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
-abbrev@1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
- integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-
-abbrev@1.0.x:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
- integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU=
+abitype@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.7.1.tgz#16db20abe67de80f6183cf75f3de1ff86453b745"
+ integrity sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==
-abstract-leveldown@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
- integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==
+ajv@^6.12.6:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
dependencies:
- xtend "~4.0.0"
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
-abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1:
- version "2.7.2"
- resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93"
- integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
+ajv@^8.0.1, ajv@^8.11.0:
+ version "8.12.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
+ integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
dependencies:
- xtend "~4.0.0"
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
-abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0:
+ansi-escapes@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f"
+ integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==
+
+ansi-regex@^5.0.0:
version "5.0.0"
- resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6"
- integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==
- dependencies:
- xtend "~4.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+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-regex@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+ integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
-abstract-leveldown@~2.6.0:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
- integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
+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:
- xtend "~4.0.0"
+ color-convert "^1.9.0"
-accepts@~1.3.7:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
- integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+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:
- mime-types "~2.1.24"
- negotiator "0.6.2"
+ color-convert "^2.0.1"
-acorn-jsx@^5.0.0, acorn-jsx@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
- integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==
+ansi-styles@^6.0.0, ansi-styles@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-acorn-jsx@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f"
- integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
+antlr4@^4.11.0:
+ version "4.13.1"
+ resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d"
+ integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==
-acorn@^6.0.7:
- version "6.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
- integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
+antlr4ts@^0.5.0-alpha.4:
+ version "0.5.0-alpha.4"
+ resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a"
+ integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==
-acorn@^7.0.0, acorn@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
- integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
+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==
-aes-js@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
- integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
+array-ify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
+ integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==
-aes-js@^3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
- integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+ast-parents@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3"
+ integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==
-agent-base@4, agent-base@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
- integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
+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==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
dependencies:
- es6-promisify "^5.0.0"
+ possible-typed-array-names "^1.0.0"
-agent-base@~4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
- integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
+axios@^1.6.7, axios@^1.6.8:
+ version "1.6.8"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66"
+ integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+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:
- es6-promisify "^5.0.0"
+ balanced-match "^1.0.0"
-agentkeepalive@^3.4.1:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67"
- integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==
+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:
- humanize-ms "^1.2.1"
+ fill-range "^7.0.1"
-ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.6.1, ajv@^6.9.1:
- version "6.10.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
- integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
+call-bind@^1.0.2, call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
dependencies:
- fast-deep-equal "^2.0.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
-amdefine@>=0.0.4:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
- integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
+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==
-ansi-align@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
- integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
+chalk@5.3.0, chalk@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385"
+ integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
+
+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:
- string-width "^3.0.0"
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
-ansi-colors@3.2.3:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
- integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+chalk@^4.1.2:
+ 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"
-ansi-escapes@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
- integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
+cli-cursor@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea"
+ integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==
+ dependencies:
+ restore-cursor "^4.0.0"
-ansi-escapes@^4.2.1:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d"
- integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==
+cli-truncate@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a"
+ integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==
dependencies:
- type-fest "^0.8.1"
+ slice-ansi "^5.0.0"
+ string-width "^7.0.0"
-ansi-regex@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
- integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
-ansi-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
- integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+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"
-ansi-regex@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
- integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+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"
-ansi-regex@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
- integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
-ansi-styles@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
- integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+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==
-ansi-styles@^3.2.0, 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==
+colorette@^2.0.20:
+ version "2.0.20"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
+ integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
+
+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:
- color-convert "^1.9.0"
+ delayed-stream "~1.0.0"
-antlr4@4.7.1:
- version "4.7.1"
- resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773"
- integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==
+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==
-any-promise@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
- integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+commander@11.1.0, commander@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906"
+ integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==
+
+commander@^12.0.0:
+ version "12.0.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592"
+ integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==
-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 sha1-ZBqlXft9am8KgUHEucCqULbCTdU=
+commander@^8.1.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
-aproba@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
- integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+compare-func@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3"
+ integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==
+ dependencies:
+ array-ify "^1.0.0"
+ dot-prop "^5.1.0"
-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==
+conventional-changelog-angular@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a"
+ integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==
dependencies:
- sprintf-js "~1.0.2"
+ compare-func "^2.0.0"
-aria-query@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc"
- integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=
+conventional-changelog-conventionalcommits@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5"
+ integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==
dependencies:
- ast-types-flow "0.0.7"
- commander "^2.11.0"
+ compare-func "^2.0.0"
-array-flatten@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
- integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+conventional-commits-parser@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a"
+ integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==
+ dependencies:
+ JSONStream "^1.3.5"
+ is-text-path "^2.0.0"
+ meow "^12.0.1"
+ split2 "^4.0.0"
-array-includes@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
- integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=
+cosmiconfig-typescript-loader@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8"
+ integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==
dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.7.0"
+ jiti "^1.19.1"
-asn1.js@^4.0.0:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
- integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
+cosmiconfig@^8.0.0:
+ version "8.3.6"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3"
+ integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==
dependencies:
- bn.js "^4.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
+ import-fresh "^3.3.0"
+ js-yaml "^4.1.0"
+ parse-json "^5.2.0"
+ path-type "^4.0.0"
-asn1@~0.2.3:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
- integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+cosmiconfig@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d"
+ integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==
dependencies:
- safer-buffer "~2.1.0"
+ env-paths "^2.2.1"
+ import-fresh "^3.3.0"
+ js-yaml "^4.1.0"
+ parse-json "^5.2.0"
-assert-plus@1.0.0, assert-plus@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
- integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
-assertion-error@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
- integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+dargs@^8.0.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/dargs/-/dargs-8.1.0.tgz#a34859ea509cbce45485e5aa356fef70bfcc7272"
+ integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==
+
+debug@4.3.4:
+ 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"
+
+decimal.js@^10.4.3:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
-ast-types-flow@0.0.7, ast-types-flow@^0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
- integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0=
+define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
-astral-regex@^1.0.0:
+delayed-stream@~1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-async-eventemitter@^0.2.2:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
- integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
- dependencies:
- async "^2.4.0"
+detect-file@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
+ integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==
-async-limiter@~1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
- integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+detect-indent@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25"
+ integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==
-async@1.x, async@^1.4.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
- integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+detect-newline@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23"
+ integrity sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==
-async@2.6.2:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
- integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==
+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:
- lodash "^4.17.11"
+ path-type "^4.0.0"
-async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
- integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+dot-prop@^5.1.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+ integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
dependencies:
- lodash "^4.17.14"
+ is-obj "^2.0.0"
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+emoji-regex@^10.3.0:
+ version "10.3.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23"
+ integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==
-aws-sign2@~0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
- integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+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==
-aws4@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
- integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
+env-paths@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
-axobject-query@^2.0.2:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.1.tgz#2a3b1271ec722d48a4cd4b3fcc20c853326a49a7"
- integrity sha512-lF98xa/yvy6j3fBHAgQXIYl+J4eZadOSqsPojemUqClzNbBV38wWGpUbQbVEyf4eUF5yF7eHmGgGA2JiHyjeqw==
+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:
- "@babel/runtime" "^7.7.4"
- "@babel/runtime-corejs3" "^7.7.4"
+ is-arrayish "^0.2.1"
-babel-code-frame@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
- integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
dependencies:
- chalk "^1.1.3"
- esutils "^2.0.2"
- js-tokens "^3.0.2"
-
-babel-core@^6.0.14, babel-core@^6.26.0:
- version "6.26.3"
- resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
- integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
- dependencies:
- babel-code-frame "^6.26.0"
- babel-generator "^6.26.0"
- babel-helpers "^6.24.1"
- babel-messages "^6.23.0"
- babel-register "^6.26.0"
- babel-runtime "^6.26.0"
- babel-template "^6.26.0"
- babel-traverse "^6.26.0"
- babel-types "^6.26.0"
- babylon "^6.18.0"
- convert-source-map "^1.5.1"
- debug "^2.6.9"
- json5 "^0.5.1"
- lodash "^4.17.4"
- minimatch "^3.0.4"
- path-is-absolute "^1.0.1"
- private "^0.1.8"
- slash "^1.0.0"
- source-map "^0.5.7"
-
-babel-generator@^6.26.0:
- version "6.26.1"
- resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
- integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
- dependencies:
- babel-messages "^6.23.0"
- babel-runtime "^6.26.0"
- babel-types "^6.26.0"
- detect-indent "^4.0.0"
- jsesc "^1.3.0"
- lodash "^4.17.4"
- source-map "^0.5.7"
- trim-right "^1.0.1"
-
-babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
- integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
- dependencies:
- babel-helper-explode-assignable-expression "^6.24.1"
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-helper-call-delegate@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
- integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
- dependencies:
- babel-helper-hoist-variables "^6.24.1"
- babel-runtime "^6.22.0"
- babel-traverse "^6.24.1"
- babel-types "^6.24.1"
-
-babel-helper-define-map@^6.24.1:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
- integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
- dependencies:
- babel-helper-function-name "^6.24.1"
- babel-runtime "^6.26.0"
- babel-types "^6.26.0"
- lodash "^4.17.4"
-
-babel-helper-explode-assignable-expression@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
- integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
- dependencies:
- babel-runtime "^6.22.0"
- babel-traverse "^6.24.1"
- babel-types "^6.24.1"
-
-babel-helper-function-name@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
- integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
- dependencies:
- babel-helper-get-function-arity "^6.24.1"
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
- babel-traverse "^6.24.1"
- babel-types "^6.24.1"
-
-babel-helper-get-function-arity@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
- integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
- dependencies:
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-helper-hoist-variables@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
- integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
- dependencies:
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-helper-optimise-call-expression@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
- integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
- dependencies:
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-helper-regex@^6.24.1:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
- integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
- dependencies:
- babel-runtime "^6.26.0"
- babel-types "^6.26.0"
- lodash "^4.17.4"
-
-babel-helper-remap-async-to-generator@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
- integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
- dependencies:
- babel-helper-function-name "^6.24.1"
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
- babel-traverse "^6.24.1"
- babel-types "^6.24.1"
-
-babel-helper-replace-supers@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
- integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
- dependencies:
- babel-helper-optimise-call-expression "^6.24.1"
- babel-messages "^6.23.0"
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
- babel-traverse "^6.24.1"
- babel-types "^6.24.1"
-
-babel-helpers@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
- integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
- dependencies:
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
-
-babel-messages@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
- integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-check-es2015-constants@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
- integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-syntax-async-functions@^6.8.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
- integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
-
-babel-plugin-syntax-exponentiation-operator@^6.8.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
- integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
-
-babel-plugin-syntax-trailing-function-commas@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
- integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
-
-babel-plugin-transform-async-to-generator@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
- integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
- dependencies:
- babel-helper-remap-async-to-generator "^6.24.1"
- babel-plugin-syntax-async-functions "^6.8.0"
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-arrow-functions@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
- integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
- integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-block-scoping@^6.23.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
- integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
- dependencies:
- babel-runtime "^6.26.0"
- babel-template "^6.26.0"
- babel-traverse "^6.26.0"
- babel-types "^6.26.0"
- lodash "^4.17.4"
-
-babel-plugin-transform-es2015-classes@^6.23.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
- integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
- dependencies:
- babel-helper-define-map "^6.24.1"
- babel-helper-function-name "^6.24.1"
- babel-helper-optimise-call-expression "^6.24.1"
- babel-helper-replace-supers "^6.24.1"
- babel-messages "^6.23.0"
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
- babel-traverse "^6.24.1"
- babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-computed-properties@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
- integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
- dependencies:
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-destructuring@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
- integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
- integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
- dependencies:
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-for-of@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
- integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-function-name@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
- integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
- dependencies:
- babel-helper-function-name "^6.24.1"
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-literals@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
- integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
- integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
- dependencies:
- babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
- version "6.26.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
- integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
- dependencies:
- babel-plugin-transform-strict-mode "^6.24.1"
- babel-runtime "^6.26.0"
- babel-template "^6.26.0"
- babel-types "^6.26.0"
-
-babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
- integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
- dependencies:
- babel-helper-hoist-variables "^6.24.1"
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-modules-umd@^6.23.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
- integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
- dependencies:
- babel-plugin-transform-es2015-modules-amd "^6.24.1"
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
-
-babel-plugin-transform-es2015-object-super@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
- integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
- dependencies:
- babel-helper-replace-supers "^6.24.1"
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-parameters@^6.23.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
- integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
- dependencies:
- babel-helper-call-delegate "^6.24.1"
- babel-helper-get-function-arity "^6.24.1"
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
- babel-traverse "^6.24.1"
- babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
- integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
- dependencies:
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-spread@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
- integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-sticky-regex@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
- integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
- dependencies:
- babel-helper-regex "^6.24.1"
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-plugin-transform-es2015-template-literals@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
- integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
- integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-es2015-unicode-regex@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
- integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
- dependencies:
- babel-helper-regex "^6.24.1"
- babel-runtime "^6.22.0"
- regexpu-core "^2.0.0"
-
-babel-plugin-transform-exponentiation-operator@^6.22.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
- integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
- dependencies:
- babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
- babel-plugin-syntax-exponentiation-operator "^6.8.0"
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-regenerator@^6.22.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
- integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
- dependencies:
- regenerator-transform "^0.10.0"
-
-babel-plugin-transform-strict-mode@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
- integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
- dependencies:
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
-babel-preset-env@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
- integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
- dependencies:
- babel-plugin-check-es2015-constants "^6.22.0"
- babel-plugin-syntax-trailing-function-commas "^6.22.0"
- babel-plugin-transform-async-to-generator "^6.22.0"
- babel-plugin-transform-es2015-arrow-functions "^6.22.0"
- babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
- babel-plugin-transform-es2015-block-scoping "^6.23.0"
- babel-plugin-transform-es2015-classes "^6.23.0"
- babel-plugin-transform-es2015-computed-properties "^6.22.0"
- babel-plugin-transform-es2015-destructuring "^6.23.0"
- babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
- babel-plugin-transform-es2015-for-of "^6.23.0"
- babel-plugin-transform-es2015-function-name "^6.22.0"
- babel-plugin-transform-es2015-literals "^6.22.0"
- babel-plugin-transform-es2015-modules-amd "^6.22.0"
- babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
- babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
- babel-plugin-transform-es2015-modules-umd "^6.23.0"
- babel-plugin-transform-es2015-object-super "^6.22.0"
- babel-plugin-transform-es2015-parameters "^6.23.0"
- babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
- babel-plugin-transform-es2015-spread "^6.22.0"
- babel-plugin-transform-es2015-sticky-regex "^6.22.0"
- babel-plugin-transform-es2015-template-literals "^6.22.0"
- babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
- babel-plugin-transform-es2015-unicode-regex "^6.22.0"
- babel-plugin-transform-exponentiation-operator "^6.22.0"
- babel-plugin-transform-regenerator "^6.22.0"
- browserslist "^3.2.6"
- invariant "^2.2.2"
- semver "^5.3.0"
-
-babel-register@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
- integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
- dependencies:
- babel-core "^6.26.0"
- babel-runtime "^6.26.0"
- core-js "^2.5.0"
- home-or-tmp "^2.0.0"
- lodash "^4.17.4"
- mkdirp "^0.5.1"
- source-map-support "^0.4.15"
-
-babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
- integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
- dependencies:
- core-js "^2.4.0"
- regenerator-runtime "^0.11.0"
-
-babel-template@^6.24.1, babel-template@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
- integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
- dependencies:
- babel-runtime "^6.26.0"
- babel-traverse "^6.26.0"
- babel-types "^6.26.0"
- babylon "^6.18.0"
- lodash "^4.17.4"
-
-babel-traverse@^6.24.1, babel-traverse@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
- integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
- dependencies:
- babel-code-frame "^6.26.0"
- babel-messages "^6.23.0"
- babel-runtime "^6.26.0"
- babel-types "^6.26.0"
- babylon "^6.18.0"
- debug "^2.6.8"
- globals "^9.18.0"
- invariant "^2.2.2"
- lodash "^4.17.4"
-
-babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
- integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
- dependencies:
- babel-runtime "^6.26.0"
- esutils "^2.0.2"
- lodash "^4.17.4"
- to-fast-properties "^1.0.3"
+ get-intrinsic "^1.2.4"
-babelify@^7.3.0:
- version "7.3.0"
- resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
- integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=
- dependencies:
- babel-core "^6.0.14"
- object-assign "^4.0.0"
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
-babylon@^6.18.0:
- version "6.18.0"
- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
- integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+escalade@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
+ integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
-backoff@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
- integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
- dependencies:
- precond "0.2"
+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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-balanced-match@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
- integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+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==
-base-x@^3.0.2:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.6.tgz#de047ec95f5f7b99ae63d830a2a894c96538b2cd"
- integrity sha512-4PaF8u2+AlViJxRVjurkLTxpp7CaFRD/jo5rPT9ONnKxyhQ8f59yzamEvq7EkriG56yn5On4ONyaG75HLqr46w==
+ethereum-cryptography@^2.0.0:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz#1352270ed3b339fe25af5ceeadcf1b9c8e30768a"
+ integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==
dependencies:
- safe-buffer "^5.0.1"
+ "@noble/curves" "1.3.0"
+ "@noble/hashes" "1.3.3"
+ "@scure/bip32" "1.3.3"
+ "@scure/bip39" "1.2.2"
-base64-js@^1.0.2:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
- integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
-
-bcrypt-pbkdf@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
- integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
- dependencies:
- tweetnacl "^0.14.3"
+eventemitter3@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
+ integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
-bindings@^1.2.1, bindings@^1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
- integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+execa@8.0.1, execa@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c"
+ integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^8.0.1"
+ human-signals "^5.0.0"
+ is-stream "^3.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^5.1.0"
+ onetime "^6.0.0"
+ signal-exit "^4.1.0"
+ strip-final-newline "^3.0.0"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+ integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==
dependencies:
- file-uri-to-path "1.0.0"
+ homedir-polyfill "^1.0.1"
-bip39@2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235"
- integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==
- dependencies:
- create-hash "^1.1.0"
- pbkdf2 "^3.0.9"
- randombytes "^2.0.1"
- safe-buffer "^5.0.1"
- unorm "^1.3.3"
+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==
-bip66@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22"
- integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=
- dependencies:
- safe-buffer "^5.0.1"
+fast-diff@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
+ integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
-bl@^1.0.0:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
- integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
- dependencies:
- readable-stream "^2.3.5"
- safe-buffer "^5.1.1"
-
-bluebird@^3.5.0:
- version "3.5.5"
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
- integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
-
-bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de"
- integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==
-
-bn.js@4.11.6:
- version "4.11.6"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
- integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
-
-bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.4.0, bn.js@^4.8.0:
- version "4.11.8"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
- integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
-
-body-parser@1.19.0, body-parser@^1.16.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
- integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
- dependencies:
- bytes "3.1.0"
- content-type "~1.0.4"
- debug "2.6.9"
- depd "~1.1.2"
- http-errors "1.7.2"
- iconv-lite "0.4.24"
- on-finished "~2.3.0"
- qs "6.7.0"
- raw-body "2.4.0"
- type-is "~1.6.17"
-
-boxen@^3.0.0, boxen@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb"
- integrity sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==
- dependencies:
- ansi-align "^3.0.0"
- camelcase "^5.3.1"
- chalk "^2.4.2"
- cli-boxes "^2.2.0"
- string-width "^3.0.0"
- term-size "^1.2.0"
- type-fest "^0.3.0"
- widest-line "^2.0.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==
+fast-glob@3.3.2, fast-glob@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
+ "@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"
-brorand@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
- integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+ integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
-browser-stdout@1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
- integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+fastq@^1.6.0:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ dependencies:
+ reusify "^1.0.4"
-browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
- integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+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:
- buffer-xor "^1.0.3"
- cipher-base "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.3"
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
+ to-regex-range "^5.0.1"
-browserify-cipher@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
- integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+find-up@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb"
+ integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==
dependencies:
- browserify-aes "^1.0.4"
- browserify-des "^1.0.0"
- evp_bytestokey "^1.0.0"
+ locate-path "^7.2.0"
+ path-exists "^5.0.0"
+ unicorn-magic "^0.1.0"
-browserify-des@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
- integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+findup-sync@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-5.0.0.tgz#54380ad965a7edca00cc8f63113559aadc541bd2"
+ integrity sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==
dependencies:
- cipher-base "^1.0.1"
- des.js "^1.0.0"
- inherits "^2.0.1"
- safe-buffer "^5.1.2"
+ detect-file "^1.0.0"
+ is-glob "^4.0.3"
+ micromatch "^4.0.4"
+ resolve-dir "^1.0.1"
-browserify-rsa@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
- integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
- dependencies:
- bn.js "^4.1.0"
- randombytes "^2.0.1"
-
-browserify-sha3@^0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.4.tgz#086c47b8c82316c9d47022c26185954576dd8e26"
- integrity sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=
- dependencies:
- js-sha3 "^0.6.1"
- safe-buffer "^5.1.1"
-
-browserify-sign@^4.0.0:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
- integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
- dependencies:
- bn.js "^4.1.1"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.2"
- elliptic "^6.0.0"
- inherits "^2.0.1"
- parse-asn1 "^5.0.0"
-
-browserslist@^3.2.6:
- version "3.2.8"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
- integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
- dependencies:
- caniuse-lite "^1.0.30000844"
- electron-to-chromium "^1.3.47"
-
-bs58@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d"
- integrity sha1-VZCNWPGYKrogCPob7Y+RmYopv40=
+follow-redirects@^1.12.1, follow-redirects@^1.15.6:
+ version "1.15.6"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+ integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
-bs58@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
- integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+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:
- base-x "^3.0.2"
+ is-callable "^1.1.3"
-bs58check@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
- integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
- dependencies:
- bs58 "^4.0.0"
- create-hash "^1.1.0"
- safe-buffer "^5.1.2"
+"forge-gas-snapshot@github:marktoda/forge-gas-snapshot#9161f7c":
+ version "0.0.0"
+ resolved "https://codeload.github.com/marktoda/forge-gas-snapshot/tar.gz/9161f7c0b6c6788a89081e2b3b9c67592b71e689"
-buffer-alloc-unsafe@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
- integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+"forge-std@github:foundry-rs/forge-std#5475f85":
+ version "1.7.6"
+ resolved "https://codeload.github.com/foundry-rs/forge-std/tar.gz/5475f852e3f530d7e25dfb4596aa1f9baa8ffdfc"
-buffer-alloc@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
- integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+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:
- buffer-alloc-unsafe "^1.1.0"
- buffer-fill "^1.0.0"
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
-buffer-crc32@~0.2.3:
- version "0.2.13"
- resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
- integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
+fs-extra@^11.2.0:
+ version "11.2.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
+ integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
-buffer-fill@^1.0.0:
+fs.realpath@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
- integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-buffer-from@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
- integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-buffer-to-arraybuffer@^0.0.5:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
- integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
+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==
-buffer-xor@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
- integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+get-east-asian-width@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e"
+ integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==
-buffer@^5.0.5, buffer@^5.2.1:
- version "5.4.0"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.0.tgz#33294f5c1f26e08461e528b69fa06de3c45cbd8c"
- integrity sha512-Xpgy0IwHK2N01ncykXTy6FpCWuM+CJSHoPVBLyNqyrWxsedpLvwsYUhf0ME3WRFNUhos0dMamz9cOS/xRDtU5g==
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
dependencies:
- base64-js "^1.0.2"
- ieee754 "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
-builtins@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
- integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
+get-stdin@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575"
+ integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==
+
+get-stream@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2"
+ integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==
-bytes@3.1.0:
+git-hooks-list@^3.0.0:
version "3.1.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
- integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+ resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.1.0.tgz#386dc531dcc17474cf094743ff30987a3d3e70fc"
+ integrity sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==
-bytewise-core@^1.2.2:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42"
- integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=
+git-raw-commits@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285"
+ integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==
dependencies:
- typewise-core "^1.2"
+ dargs "^8.0.0"
+ meow "^12.0.1"
+ split2 "^4.0.0"
-bytewise@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e"
- integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=
- dependencies:
- bytewise-core "^1.2.2"
- typewise "^1.0.3"
-
-cacache@^12.0.0, cacache@^12.0.2:
- version "12.0.3"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390"
- integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==
- dependencies:
- bluebird "^3.5.5"
- chownr "^1.1.1"
- figgy-pudding "^3.5.1"
- glob "^7.1.4"
- graceful-fs "^4.1.15"
- infer-owner "^1.0.3"
- lru-cache "^5.1.1"
- mississippi "^3.0.0"
- mkdirp "^0.5.1"
- move-concurrently "^1.0.1"
- promise-inflight "^1.0.1"
- rimraf "^2.6.3"
- ssri "^6.0.1"
- unique-filename "^1.1.1"
- y18n "^4.0.0"
-
-cacheable-request@^6.0.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
- integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
- dependencies:
- clone-response "^1.0.2"
- get-stream "^5.1.0"
- http-cache-semantics "^4.0.0"
- keyv "^3.0.0"
- lowercase-keys "^2.0.0"
- normalize-url "^4.1.0"
- responselike "^1.0.2"
-
-cachedown@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15"
- integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=
+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:
- abstract-leveldown "^2.4.1"
- lru-cache "^3.2.0"
+ is-glob "^4.0.1"
-caller-callsite@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
- integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+glob@^8.0.3:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
+ integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
dependencies:
- callsites "^2.0.0"
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
-caller-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
- integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+global-directory@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e"
+ integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==
dependencies:
- caller-callsite "^2.0.0"
-
-callsites@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
- integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
-
-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==
+ ini "4.1.1"
-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==
-
-caniuse-lite@^1.0.30000844:
- version "1.0.30000989"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9"
- integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==
-
-caseless@~0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
- integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+global-modules@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+ integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
+ dependencies:
+ global-prefix "^1.0.1"
+ is-windows "^1.0.1"
+ resolve-dir "^1.0.0"
-chai@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
- integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==
+global-prefix@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+ integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==
dependencies:
- assertion-error "^1.1.0"
- check-error "^1.0.2"
- deep-eql "^3.0.1"
- get-func-name "^2.0.0"
- pathval "^1.1.0"
- type-detect "^4.0.5"
+ expand-tilde "^2.0.2"
+ homedir-polyfill "^1.0.1"
+ ini "^1.3.4"
+ is-windows "^1.0.1"
+ which "^1.2.14"
-chalk@^1.1.1, chalk@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
- integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+globby@^13.1.2:
+ version "13.2.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592"
+ integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==
dependencies:
- ansi-styles "^2.2.1"
- escape-string-regexp "^1.0.2"
- has-ansi "^2.0.0"
- strip-ansi "^3.0.0"
- supports-color "^2.0.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.3.0"
+ ignore "^5.2.4"
+ merge2 "^1.4.1"
+ slash "^4.0.0"
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.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==
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
+ get-intrinsic "^1.1.3"
-chardet@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
- integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+graceful-fs@^4.1.6:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
+ integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
-check-error@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
- integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+graceful-fs@^4.2.0:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
-checkpoint-store@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06"
- integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=
+handlebars@4.7.7:
+ version "4.7.7"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
+ integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
dependencies:
- functional-red-black-tree "^1.0.1"
-
-chownr@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
- integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
-
-chownr@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
- integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==
+ minimist "^1.2.5"
+ neo-async "^2.6.0"
+ source-map "^0.6.1"
+ wordwrap "^1.0.0"
+ optionalDependencies:
+ uglify-js "^3.1.4"
-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==
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
-cint@^8.2.1:
- version "8.2.1"
- resolved "https://registry.yarnpkg.com/cint/-/cint-8.2.1.tgz#70386b1b48e2773d0d63166a55aff94ef4456a12"
- integrity sha1-cDhrG0jidz0NYxZqVa/5TvRFahI=
+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==
-cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
- integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
+ es-define-property "^1.0.0"
-cli-boxes@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
- integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==
+has-proto@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
-cli-cursor@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
- integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
- dependencies:
- restore-cursor "^2.0.0"
+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==
-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==
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
- restore-cursor "^3.1.0"
+ has-symbols "^1.0.3"
-cli-table@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
- integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM=
+hasown@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
dependencies:
- colors "1.0.3"
+ function-bind "^1.1.2"
-cli-width@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
- integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
-
-cliui@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
- integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
+homedir-polyfill@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
+ integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
dependencies:
- string-width "^2.1.1"
- strip-ansi "^4.0.0"
- wrap-ansi "^2.0.0"
+ parse-passwd "^1.0.0"
-cliui@^5.0.0:
+human-signals@^5.0.0:
version "5.0.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
- integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
- dependencies:
- string-width "^3.1.0"
- strip-ansi "^5.2.0"
- wrap-ansi "^5.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28"
+ integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==
-clone-response@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
- integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
- dependencies:
- mimic-response "^1.0.0"
+husky@>=8:
+ version "9.0.11"
+ resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9"
+ integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==
-clone@2.1.2, clone@^2.0.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
- integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+ignore@^5.2.4:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
+ integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
-cobertura-parse@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/cobertura-parse/-/cobertura-parse-1.0.5.tgz#3a8c5d30a97468496a2aabd04b8fa4fb7c3cd20e"
- integrity sha512-uYJfkGhzw1wibe/8jqqHmSaPNWFguzq/IlSj83u3cSnZho/lUnfj0mLTmZGmB3AiKCOTYr22TYwpR1sXy2JEkg==
+import-fresh@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
dependencies:
- mocha "5.0.5"
- xml2js "0.4.19"
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
-code-point-at@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
- integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+import-meta-resolve@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706"
+ integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==
-coinstring@^2.0.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/coinstring/-/coinstring-2.3.0.tgz#cdb63363a961502404a25afb82c2e26d5ff627a4"
- integrity sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
dependencies:
- bs58 "^2.0.1"
- create-hash "^1.1.1"
+ once "^1.3.0"
+ wrappy "1"
-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"
+inherits@2, 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==
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+ini@4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1"
+ integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==
-colors@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
- integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
+ini@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
-combined-stream@^1.0.6, combined-stream@~1.0.6:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
- integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+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:
- delayed-stream "~1.0.0"
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
-commander@2.11.0:
- version "2.11.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
- integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
-commander@2.15.1:
- version "2.15.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
- integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
+is-callable@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+ integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
-commander@2.18.0:
- version "2.18.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970"
- integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-commander@^2.11.0, commander@~2.20.3:
- 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==
+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==
-commander@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
- integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+is-fullwidth-code-point@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
+ integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
-commander@~2.8.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
- integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
+is-fullwidth-code-point@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704"
+ integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==
dependencies:
- graceful-readlink ">= 1.0.0"
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+ get-east-asian-width "^1.0.0"
-concat-stream@^1.5.0, concat-stream@^1.5.1:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
- integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+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:
- buffer-from "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^2.2.2"
- typedarray "^0.0.6"
-
-configstore@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7"
- integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==
- dependencies:
- dot-prop "^4.1.0"
- graceful-fs "^4.1.2"
- make-dir "^1.0.0"
- unique-string "^1.0.0"
- write-file-atomic "^2.0.0"
- xdg-basedir "^3.0.0"
-
-confusing-browser-globals@^1.0.7:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd"
- integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
-
-contains-path@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
- integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
+ has-tostringtag "^1.0.0"
-content-disposition@0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
- integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+is-glob@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
dependencies:
- safe-buffer "5.1.2"
-
-content-type@~1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
- integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+ is-extglob "^2.1.1"
-convert-source-map@^1.5.1:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
- integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
+is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
- safe-buffer "~5.1.1"
+ is-extglob "^2.1.1"
-cookie-signature@1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
- integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+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==
-cookie@0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
- integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
-cookiejar@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
- integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+is-plain-obj@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
+ integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
-copy-concurrently@^1.0.0:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
- integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
- dependencies:
- aproba "^1.1.1"
- fs-write-stream-atomic "^1.0.8"
- iferr "^0.1.5"
- mkdirp "^0.5.1"
- rimraf "^2.5.4"
- run-queue "^1.0.0"
-
-core-js-pure@^3.0.0:
- version "3.4.7"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.4.7.tgz#c998e1892da9949200c7452cbd33c0df95be9f54"
- integrity sha512-Am3uRS8WCdTFA3lP7LtKR0PxgqYzjAMGKXaZKSNSC/8sqU0Wfq8R/YzoRs2rqtOVEunfgH+0q3O0BKOg0AvjPw==
-
-core-js@^2.4.0, core-js@^2.5.0:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
- integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
-
-core-util-is@1.0.2, core-util-is@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-cors@^2.8.1:
- version "2.8.5"
- resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
- integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
- dependencies:
- object-assign "^4"
- vary "^1"
-
-cosmiconfig@^5.0.7:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
- integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
- dependencies:
- import-fresh "^2.0.0"
- is-directory "^0.3.1"
- js-yaml "^3.13.1"
- parse-json "^4.0.0"
-
-coveralls@^3.0.8:
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.8.tgz#3ed8f0ebdcf8a87ff3f9f4bde220b86d998ebe64"
- integrity sha512-lkQlg29RhV9zwB0gDaEAWoap8xPgFxtPsVIpTNiDDtWNrvtP1/RmGJRRAV/Loz2gihmppObkSL0wnptEGUXaOQ==
- dependencies:
- cobertura-parse "^1.0.5"
- js-yaml "^3.13.1"
- lcov-parse "^1.0.0"
- log-driver "^1.2.7"
- minimist "^1.2.0"
- request "^2.88.0"
-
-create-ecdh@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
- integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
- dependencies:
- bn.js "^4.1.0"
- elliptic "^6.0.0"
+is-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
+ integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
-create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2, create-hash@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
- integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
- dependencies:
- cipher-base "^1.0.1"
- inherits "^2.0.1"
- md5.js "^1.3.4"
- ripemd160 "^2.0.1"
- sha.js "^2.4.0"
-
-create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
- integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
- dependencies:
- cipher-base "^1.0.3"
- create-hash "^1.1.0"
- inherits "^2.0.1"
- ripemd160 "^2.0.0"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-cross-fetch@^2.1.0, cross-fetch@^2.1.1:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e"
- integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==
- dependencies:
- node-fetch "2.1.2"
- whatwg-fetch "2.0.4"
-
-cross-spawn@^5.0.1:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
- integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
+is-text-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636"
+ integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==
dependencies:
- lru-cache "^4.0.1"
- shebang-command "^1.2.0"
- which "^1.2.9"
+ text-extensions "^2.0.0"
-cross-spawn@^6.0.0, cross-spawn@^6.0.5:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+is-typed-array@^1.1.3:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
+ integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
dependencies:
- nice-try "^1.0.4"
- path-key "^2.0.1"
- semver "^5.5.0"
- shebang-command "^1.2.0"
- which "^1.2.9"
-
-crypto-browserify@3.12.0:
- version "3.12.0"
- resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
- integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
- dependencies:
- browserify-cipher "^1.0.0"
- browserify-sign "^4.0.0"
- create-ecdh "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.0"
- diffie-hellman "^5.0.0"
- inherits "^2.0.1"
- pbkdf2 "^3.0.3"
- public-encrypt "^4.0.0"
- randombytes "^2.0.0"
- randomfill "^1.0.3"
-
-crypto-random-string@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
- integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
-
-cyclist@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
- integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
+ which-typed-array "^1.1.14"
-d@1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
- integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
- dependencies:
- es5-ext "^0.10.50"
- type "^1.0.1"
+is-windows@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
-damerau-levenshtein@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414"
- integrity sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-dashdash@^1.12.0:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
- integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
- dependencies:
- assert-plus "^1.0.0"
+jiti@^1.19.1:
+ version "1.21.0"
+ resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
+ integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
-death@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318"
- integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=
+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==
-debug-log@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
- integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=
+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==
-debug@2.6.9, debug@^2.2.0, debug@^2.6.8, 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==
+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:
- ms "2.0.0"
+ argparse "^2.0.1"
-debug@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
- integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
- dependencies:
- ms "2.0.0"
+jsel@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/jsel/-/jsel-1.1.6.tgz#9257fee6c6e8ad8e75d5706503fe84f376035896"
+ integrity sha512-7E6r8kVzjmKhwXR/82Z+43edfOJGRvLvx6cJZ+SS2MGAPPtYZGnaIsFHpQMA1IbIPA9twDProkob4IIAJ0ZqSw==
-debug@3.2.6, debug@^3.1.0:
- version "3.2.6"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
- integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
- dependencies:
- ms "^2.1.1"
+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==
-debug@^4.0.1, debug@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
- dependencies:
- ms "^2.1.1"
+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==
-decamelize@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
- integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+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==
-decimal.js@^10.2.0:
- version "10.2.0"
- resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231"
- integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==
+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"
-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 sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+jsonparse@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+ integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
-decompress-response@^3.2.0, decompress-response@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
- integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
- dependencies:
- mimic-response "^1.0.0"
+lilconfig@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc"
+ integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==
-decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
- integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
+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==
+
+lint-staged@>=10:
+ version "15.2.2"
+ resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.2.tgz#ad7cbb5b3ab70e043fa05bff82a09ed286bc4c5f"
+ integrity sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==
+ dependencies:
+ chalk "5.3.0"
+ commander "11.1.0"
+ debug "4.3.4"
+ execa "8.0.1"
+ lilconfig "3.0.0"
+ listr2 "8.0.1"
+ micromatch "4.0.5"
+ pidtree "0.6.0"
+ string-argv "0.3.2"
+ yaml "2.3.4"
+
+listr2@8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.1.tgz#4d3f50ae6cec3c62bdf0e94f5c2c9edebd4b9c34"
+ integrity sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==
dependencies:
- file-type "^5.2.0"
- is-stream "^1.1.0"
- tar-stream "^1.5.2"
+ cli-truncate "^4.0.0"
+ colorette "^2.0.20"
+ eventemitter3 "^5.0.1"
+ log-update "^6.0.0"
+ rfdc "^1.3.0"
+ wrap-ansi "^9.0.0"
-decompress-tarbz2@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
- integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
+locate-path@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a"
+ integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==
dependencies:
- decompress-tar "^4.1.0"
- file-type "^6.1.0"
- is-stream "^1.1.0"
- seek-bzip "^1.0.5"
- unbzip2-stream "^1.0.9"
+ p-locate "^6.0.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.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
-decompress-targz@^4.0.0:
+lodash.kebabcase@^4.1.1:
version "4.1.1"
- resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
- integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
- dependencies:
- decompress-tar "^4.1.1"
- file-type "^5.2.0"
- is-stream "^1.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
+ integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==
-decompress-unzip@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
- integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
- dependencies:
- file-type "^3.8.0"
- get-stream "^2.2.0"
- pify "^2.3.0"
- yauzl "^2.4.2"
+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==
-decompress@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
- integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
- dependencies:
- decompress-tar "^4.0.0"
- decompress-tarbz2 "^4.0.0"
- decompress-targz "^4.0.0"
- decompress-unzip "^4.0.1"
- graceful-fs "^4.1.10"
- make-dir "^1.0.0"
- pify "^2.3.0"
- strip-dirs "^2.0.0"
-
-deep-eql@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
- integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
- dependencies:
- type-detect "^4.0.0"
+lodash.mergewith@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
+ integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
-deep-equal@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
- integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
+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==
-deep-extend@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
- integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+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==
-deep-is@~0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
- integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+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==
-defer-to-connect@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e"
- integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
-deferred-leveldown@~1.2.1:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb"
- integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
- dependencies:
- abstract-leveldown "~2.6.0"
+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.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-deferred-leveldown@~4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20"
- integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==
+log-update@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59"
+ integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==
dependencies:
- abstract-leveldown "~5.0.0"
- inherits "^2.0.3"
+ ansi-escapes "^6.2.0"
+ cli-cursor "^4.0.0"
+ slice-ansi "^7.0.0"
+ strip-ansi "^7.1.0"
+ wrap-ansi "^9.0.0"
-define-properties@^1.1.2, define-properties@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
- integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+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:
- object-keys "^1.0.12"
+ yallist "^4.0.0"
-defined@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
- integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+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==
-deglob@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/deglob/-/deglob-4.0.1.tgz#0685c6383992fd6009be10653a2b1116696fad55"
- integrity sha512-/g+RDZ7yf2HvoW+E5Cy+K94YhgcFgr6C8LuHZD1O5HoNPkf3KY6RfXJ0DBGlB/NkLi5gml+G9zqRzk9S0mHZCg==
- dependencies:
- find-root "^1.0.0"
- glob "^7.0.5"
- ignore "^5.0.0"
- pkg-config "^1.1.0"
- run-parallel "^1.1.2"
- uniq "^1.0.1"
+meow@^12.0.1:
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6"
+ integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==
-delayed-stream@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+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==
-depd@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
- integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+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==
-des.js@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
- integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
+micromatch@4.0.5, 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:
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
+ braces "^3.0.2"
+ picomatch "^2.3.1"
-destroy@~1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
- integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+mime-db@1.40.0:
+ version "1.40.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
+ integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
-detect-indent@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
- integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+mime-types@^2.1.12:
+ version "2.1.24"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
+ integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
dependencies:
- repeating "^2.0.0"
+ mime-db "1.40.0"
-diff@3.5.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
- integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+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==
-diffie-hellman@^5.0.0:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
- integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
- dependencies:
- bn.js "^4.1.0"
- miller-rabin "^4.0.0"
- randombytes "^2.0.0"
+mimic-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+ integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
-doctrine@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
- integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+minimatch@^5.0.1:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
dependencies:
- esutils "^2.0.2"
- isarray "^1.0.0"
+ brace-expansion "^2.0.1"
-doctrine@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
- integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
- dependencies:
- esutils "^2.0.2"
-
-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"
-
-dom-walk@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
- integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
-
-dot-prop@^4.1.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
- integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
- dependencies:
- is-obj "^1.0.0"
-
-drbg.js@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b"
- integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=
- dependencies:
- browserify-aes "^1.0.6"
- create-hash "^1.1.2"
- create-hmac "^1.1.4"
-
-duplexer3@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
- integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
-
-duplexify@^3.4.2, duplexify@^3.6.0:
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
- integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
- dependencies:
- end-of-stream "^1.0.0"
- inherits "^2.0.1"
- readable-stream "^2.0.0"
- stream-shift "^1.0.0"
-
-ecc-jsbn@~0.1.1:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
- integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
- dependencies:
- jsbn "~0.1.0"
- safer-buffer "^2.1.0"
-
-ee-first@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
- integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-
-electron-to-chromium@^1.3.47:
- version "1.3.225"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.225.tgz#c6786475b5eb5f491ade01a78b82ba2c5bfdf72b"
- integrity sha512-7W/L3jw7HYE+tUPbcVOGBmnSrlUmyZ/Uyg24QS7Vx0a9KodtNrN0r0Q/LyGHrcYMtw2rv7E49F/vTXwlV/fuaA==
-
-elliptic@6.3.3:
- version "6.3.3"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f"
- integrity sha1-VILZZG1UvLif19mU/J4ulWiHbj8=
- dependencies:
- bn.js "^4.4.0"
- brorand "^1.0.1"
- hash.js "^1.0.0"
- inherits "^2.0.1"
-
-elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.4.1:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.0.tgz#2b8ed4c891b7de3200e14412a5b8248c7af505ca"
- integrity sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==
- dependencies:
- bn.js "^4.4.0"
- brorand "^1.0.1"
- hash.js "^1.0.0"
- hmac-drbg "^1.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.0"
-
-emoji-regex@^7.0.1, emoji-regex@^7.0.2:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
- integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
-
-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==
-
-encodeurl@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
- integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
-
-encoding-down@5.0.4, encoding-down@~5.0.0:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614"
- integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==
- dependencies:
- abstract-leveldown "^5.0.0"
- inherits "^2.0.3"
- level-codec "^9.0.0"
- level-errors "^2.0.0"
- xtend "^4.0.1"
-
-encoding@^0.1.11:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
- integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
- dependencies:
- iconv-lite "~0.4.13"
-
-end-of-stream@^1.0.0, end-of-stream@^1.1.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
- integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
- dependencies:
- once "^1.4.0"
-
-err-code@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
- integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
-
-errno@~0.1.1:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
- integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
- dependencies:
- prr "~1.0.1"
-
-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.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
- integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
- dependencies:
- es-to-primitive "^1.2.0"
- function-bind "^1.1.1"
- has "^1.0.3"
- is-callable "^1.1.4"
- is-regex "^1.0.4"
- object-keys "^1.0.12"
-
-es-abstract@^1.15.0:
- version "1.16.2"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.2.tgz#4e874331645e9925edef141e74fc4bd144669d34"
- integrity sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==
- dependencies:
- es-to-primitive "^1.2.1"
- function-bind "^1.1.1"
- has "^1.0.3"
- has-symbols "^1.0.1"
- is-callable "^1.1.4"
- is-regex "^1.0.4"
- object-inspect "^1.7.0"
- object-keys "^1.1.1"
- string.prototype.trimleft "^2.1.0"
- string.prototype.trimright "^2.1.0"
-
-es-to-primitive@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
- integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
- dependencies:
- is-callable "^1.1.4"
- is-date-object "^1.0.1"
- is-symbol "^1.0.2"
-
-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"
-
-es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14:
- version "0.10.50"
- resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778"
- integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==
- dependencies:
- es6-iterator "~2.0.3"
- es6-symbol "~3.1.1"
- next-tick "^1.0.0"
-
-es6-iterator@~2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
- integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
- dependencies:
- d "1"
- es5-ext "^0.10.35"
- es6-symbol "^3.1.1"
-
-es6-promise@^4.0.3:
- version "4.2.8"
- resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
- integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
-
-es6-promisify@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
- integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
- dependencies:
- es6-promise "^4.0.3"
-
-es6-symbol@^3.1.1, es6-symbol@~3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
- integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
- dependencies:
- d "1"
- es5-ext "~0.10.14"
-
-escape-html@~1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
- integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
-
-escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, 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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-
-escodegen@1.8.x:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
- integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=
- dependencies:
- esprima "^2.7.1"
- estraverse "^1.9.1"
- esutils "^2.0.2"
- optionator "^0.8.1"
- optionalDependencies:
- source-map "~0.2.0"
-
-eslint-config-airbnb-base@^14.0.0:
- version "14.0.0"
- resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz#8a7bcb9643d13c55df4dd7444f138bf4efa61e17"
- integrity sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==
- dependencies:
- confusing-browser-globals "^1.0.7"
- object.assign "^4.1.0"
- object.entries "^1.1.0"
-
-eslint-config-airbnb@^18.0.1:
- version "18.0.1"
- resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz#a3a74cc29b46413b6096965025381df8fb908559"
- integrity sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==
- dependencies:
- eslint-config-airbnb-base "^14.0.0"
- object.assign "^4.1.0"
- object.entries "^1.1.0"
-
-eslint-config-standard-jsx@8.0.1:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.0.1.tgz#987bdeb063f0bfbd1de55300b02fdd220c94a68a"
- integrity sha512-SDnpVLSzTcT0eLNTG7s8ffRi3WadBBpw+pFsiBj4BcrHOFOga9O/7mjtNRyPgetmsiDPWGxsiS4UdJLZhaIukA==
-
-eslint-config-standard@14.0.1:
- version "14.0.1"
- resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.0.1.tgz#375c3636fb4bd453cb95321d873de12e4eef790b"
- integrity sha512-1RWsAKTDTZgA8bIM6PSC9aTGDAUlKqNkYNJlTZ5xYD/HYkIM6GlcefFvgcJ8xi0SWG5203rttKYX28zW+rKNOg==
-
-eslint-import-resolver-node@^0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a"
- integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==
- dependencies:
- debug "^2.6.9"
- resolve "^1.5.0"
-
-eslint-module-utils@^2.4.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c"
- integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==
- dependencies:
- debug "^2.6.8"
- pkg-dir "^2.0.0"
-
-eslint-plugin-es@^1.4.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998"
- integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==
- dependencies:
- eslint-utils "^1.4.2"
- regexpp "^2.0.1"
-
-eslint-plugin-eslint-plugin@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5"
- integrity sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg==
-
-eslint-plugin-import@^2.18.2, eslint-plugin-import@~2.18.0:
- version "2.18.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6"
- integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==
- dependencies:
- array-includes "^3.0.3"
- contains-path "^0.1.0"
- debug "^2.6.9"
- doctrine "1.5.0"
- eslint-import-resolver-node "^0.3.2"
- eslint-module-utils "^2.4.0"
- has "^1.0.3"
- minimatch "^3.0.4"
- object.values "^1.1.0"
- read-pkg-up "^2.0.0"
- resolve "^1.11.0"
-
-eslint-plugin-jsx-a11y@^6.2.3:
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa"
- integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==
- dependencies:
- "@babel/runtime" "^7.4.5"
- aria-query "^3.0.0"
- array-includes "^3.0.3"
- ast-types-flow "^0.0.7"
- axobject-query "^2.0.2"
- damerau-levenshtein "^1.0.4"
- emoji-regex "^7.0.2"
- has "^1.0.3"
- jsx-ast-utils "^2.2.1"
-
-eslint-plugin-node@~9.1.0:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz#f2fd88509a31ec69db6e9606d76dabc5adc1b91a"
- integrity sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw==
- dependencies:
- eslint-plugin-es "^1.4.0"
- eslint-utils "^1.3.1"
- ignore "^5.1.1"
- minimatch "^3.0.4"
- resolve "^1.10.1"
- semver "^6.1.0"
-
-eslint-plugin-promise@~4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"
- integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==
-
-eslint-plugin-react@^7.17.0:
- version "7.17.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.17.0.tgz#a31b3e134b76046abe3cd278e7482bd35a1d12d7"
- integrity sha512-ODB7yg6lxhBVMeiH1c7E95FLD4E/TwmFjltiU+ethv7KPdCwgiFuOZg9zNRHyufStTDLl/dEFqI2Q1VPmCd78A==
- dependencies:
- array-includes "^3.0.3"
- doctrine "^2.1.0"
- eslint-plugin-eslint-plugin "^2.1.0"
- has "^1.0.3"
- jsx-ast-utils "^2.2.3"
- object.entries "^1.1.0"
- object.fromentries "^2.0.1"
- object.values "^1.1.0"
- prop-types "^15.7.2"
- resolve "^1.13.1"
-
-eslint-plugin-react@~7.14.2:
- version "7.14.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13"
- integrity sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==
- dependencies:
- array-includes "^3.0.3"
- doctrine "^2.1.0"
- has "^1.0.3"
- jsx-ast-utils "^2.1.0"
- object.entries "^1.1.0"
- object.fromentries "^2.0.0"
- object.values "^1.1.0"
- prop-types "^15.7.2"
- resolve "^1.10.1"
-
-eslint-plugin-standard@~4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
- integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
-
-eslint-scope@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
- integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
- dependencies:
- esrecurse "^4.1.0"
- estraverse "^4.1.1"
-
-eslint-scope@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
- integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
- dependencies:
- esrecurse "^4.1.0"
- estraverse "^4.1.1"
-
-eslint-utils@^1.3.1, eslint-utils@^1.4.2:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
- integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==
- dependencies:
- eslint-visitor-keys "^1.0.0"
-
-eslint-utils@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
- integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
- dependencies:
- eslint-visitor-keys "^1.1.0"
-
-eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
- integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
-
-eslint@^5.6.0:
- version "5.16.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
- integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- ajv "^6.9.1"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
- doctrine "^3.0.0"
- eslint-scope "^4.0.3"
- eslint-utils "^1.3.1"
- eslint-visitor-keys "^1.0.0"
- espree "^5.0.1"
- esquery "^1.0.1"
- esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- functional-red-black-tree "^1.0.1"
- glob "^7.1.2"
- globals "^11.7.0"
- ignore "^4.0.6"
- import-fresh "^3.0.0"
- imurmurhash "^0.1.4"
- inquirer "^6.2.2"
- js-yaml "^3.13.0"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.11"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
- natural-compare "^1.4.0"
- optionator "^0.8.2"
- path-is-inside "^1.0.2"
- progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^5.5.1"
- strip-ansi "^4.0.0"
- strip-json-comments "^2.0.1"
- table "^5.2.3"
- text-table "^0.2.0"
-
-eslint@^6.7.1:
- version "6.7.1"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.1.tgz#269ccccec3ef60ab32358a44d147ac209154b919"
- integrity sha512-UWzBS79pNcsDSxgxbdjkmzn/B6BhsXMfUaOHnNwyE8nD+Q6pyT96ow2MccVayUTV4yMid4qLhMiQaywctRkBLA==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- ajv "^6.10.0"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
- doctrine "^3.0.0"
- eslint-scope "^5.0.0"
- eslint-utils "^1.4.3"
- eslint-visitor-keys "^1.1.0"
- espree "^6.1.2"
- esquery "^1.0.1"
- esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- 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"
- inquirer "^7.0.0"
- is-glob "^4.0.0"
- js-yaml "^3.13.1"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.14"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
- natural-compare "^1.4.0"
- optionator "^0.8.3"
- progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^6.1.2"
- strip-ansi "^5.2.0"
- strip-json-comments "^3.0.1"
- table "^5.2.3"
- text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-
-eslint@~6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646"
- integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- ajv "^6.10.0"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
- doctrine "^3.0.0"
- eslint-scope "^5.0.0"
- eslint-utils "^1.3.1"
- eslint-visitor-keys "^1.0.0"
- espree "^6.0.0"
- esquery "^1.0.1"
- esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^11.7.0"
- ignore "^4.0.6"
- import-fresh "^3.0.0"
- imurmurhash "^0.1.4"
- inquirer "^6.4.1"
- is-glob "^4.0.0"
- js-yaml "^3.13.1"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.14"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
- natural-compare "^1.4.0"
- optionator "^0.8.2"
- progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^6.1.2"
- strip-ansi "^5.2.0"
- strip-json-comments "^3.0.1"
- table "^5.2.3"
- text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-
-espree@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
- integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
- dependencies:
- acorn "^6.0.7"
- acorn-jsx "^5.0.0"
- eslint-visitor-keys "^1.0.0"
-
-espree@^6.0.0:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de"
- integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==
- dependencies:
- acorn "^7.0.0"
- acorn-jsx "^5.0.2"
- eslint-visitor-keys "^1.1.0"
-
-espree@^6.1.2:
- version "6.1.2"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d"
- integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==
- dependencies:
- acorn "^7.1.0"
- acorn-jsx "^5.1.0"
- eslint-visitor-keys "^1.1.0"
-
-esprima@2.7.x, esprima@^2.7.1:
- version "2.7.3"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
- integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=
-
-esprima@^4.0.0:
- 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.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
- integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
- dependencies:
- estraverse "^4.0.0"
-
-esrecurse@^4.1.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
- integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
- dependencies:
- estraverse "^4.1.0"
-
-estraverse@^1.9.1:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
- integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=
-
-estraverse@^4.0.0, estraverse@^4.1.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==
-
-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==
-
-etag@~1.8.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
- integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+minimist@^1.2.5, minimist@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
-eth-block-tracker@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1"
- integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==
- dependencies:
- eth-query "^2.1.0"
- ethereumjs-tx "^1.3.3"
- ethereumjs-util "^5.1.3"
- ethjs-util "^0.1.3"
- json-rpc-engine "^3.6.0"
- pify "^2.3.0"
- tape "^4.6.3"
-
-eth-ens-namehash@2.0.8:
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
- integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
- dependencies:
- idna-uts46-hx "^2.3.1"
- js-sha3 "^0.5.7"
-
-eth-json-rpc-infura@^3.1.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.0.tgz#62c3f516b51351038c32a548704467cec113ca8f"
- integrity sha512-FLcpdxPRVBCUc7yoE+wHGvyYg2lATedP+/q7PsKvaSzQpJbgTG4ZjLnyrLanxDr6M1k/dSNa6V5QnILwjUKJcw==
- dependencies:
- cross-fetch "^2.1.1"
- eth-json-rpc-middleware "^1.5.0"
- json-rpc-engine "^3.4.0"
- json-rpc-error "^2.0.0"
- tape "^4.8.0"
-
-eth-json-rpc-middleware@^1.5.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f"
- integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==
- dependencies:
- async "^2.5.0"
- eth-query "^2.1.2"
- eth-tx-summary "^3.1.2"
- ethereumjs-block "^1.6.0"
- ethereumjs-tx "^1.3.3"
- ethereumjs-util "^5.1.2"
- ethereumjs-vm "^2.1.0"
- fetch-ponyfill "^4.0.0"
- json-rpc-engine "^3.6.0"
- json-rpc-error "^2.0.0"
- json-stable-stringify "^1.0.1"
- promise-to-callback "^1.0.0"
- tape "^4.6.3"
-
-eth-lib@0.2.7:
- version "0.2.7"
- resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca"
- integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=
- dependencies:
- bn.js "^4.11.6"
- elliptic "^6.4.0"
- xhr-request-promise "^0.1.2"
-
-eth-lib@0.2.8:
- version "0.2.8"
- resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
- integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
- dependencies:
- bn.js "^4.11.6"
- elliptic "^6.4.0"
- xhr-request-promise "^0.1.2"
-
-eth-lib@^0.1.26:
- version "0.1.27"
- resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.27.tgz#f0b0fd144f865d2d6bf8257a40004f2e75ca1dd6"
- integrity sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==
- dependencies:
- bn.js "^4.11.6"
- elliptic "^6.4.0"
- keccakjs "^0.2.1"
- nano-json-stream-parser "^0.1.2"
- servify "^0.1.12"
- ws "^3.0.0"
- xhr-request-promise "^0.1.2"
-
-eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
+ms@2.1.2:
version "2.1.2"
- resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
- integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=
- dependencies:
- json-rpc-random-id "^1.0.0"
- xtend "^4.0.1"
-
-eth-sig-util@2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.2.0.tgz#769fa3d296b450f6618dedeefe076642c923a16f"
- integrity sha512-bAxW35bL4U2lrtjjV8rFGJ8B27z4Sn5v9eIaNdpPUnPfUAtrvx5j8atfyV+k+JOnbppcvKhWCO1rQSBk4kkAhw==
- dependencies:
- buffer "^5.2.1"
- elliptic "^6.4.0"
- ethereumjs-abi "0.6.5"
- ethereumjs-util "^5.1.1"
- tweetnacl "^1.0.0"
- tweetnacl-util "^0.15.0"
-
-eth-sig-util@^1.4.2:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210"
- integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=
- dependencies:
- ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
- ethereumjs-util "^5.1.1"
-
-eth-tx-summary@^3.1.2:
- version "3.2.4"
- resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c"
- integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==
- dependencies:
- async "^2.1.2"
- clone "^2.0.0"
- concat-stream "^1.5.1"
- end-of-stream "^1.1.0"
- eth-query "^2.0.2"
- ethereumjs-block "^1.4.1"
- ethereumjs-tx "^1.1.1"
- ethereumjs-util "^5.0.1"
- ethereumjs-vm "^2.6.0"
- through2 "^2.0.3"
-
-ethashjs@~0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.7.tgz#30bfe4196726690a0c59d3b8272e70d4d0c34bae"
- integrity sha1-ML/kGWcmaQoMWdO4Jy5w1NDDS64=
- dependencies:
- async "^1.4.2"
- buffer-xor "^1.0.3"
- ethereumjs-util "^4.0.1"
- miller-rabin "^4.0.0"
-
-ethereum-common@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
- integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
-
-ethereum-common@^0.0.18:
- version "0.0.18"
- resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
- integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
-
-ethereumjs-abi@0.6.5:
- version "0.6.5"
- resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
- integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=
- dependencies:
- bn.js "^4.10.0"
- ethereumjs-util "^4.3.0"
-
-ethereumjs-abi@0.6.7:
- version "0.6.7"
- resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.7.tgz#d1d1c5cdb8d910a7d97645ba9e93be5d153bba2e"
- integrity sha512-EMLOA8ICO5yAaXDhjVEfYjsJIXYutY8ufTE93eEKwsVtp2usQreKwsDTJ9zvam3omYqNuffr8IONIqb2uUslGQ==
- dependencies:
- bn.js "^4.11.8"
- ethereumjs-util "^6.0.0"
-
-"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
- version "0.6.8"
- resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b"
- dependencies:
- bn.js "^4.11.8"
- ethereumjs-util "^6.0.0"
-
-ethereumjs-account@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9"
- integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==
- dependencies:
- ethereumjs-util "^6.0.0"
- rlp "^2.2.1"
- safe-buffer "^5.1.1"
-
-ethereumjs-account@^2.0.3:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84"
- integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
- dependencies:
- ethereumjs-util "^5.0.0"
- rlp "^2.0.0"
- safe-buffer "^5.1.1"
-
-ethereumjs-block@2.2.0, ethereumjs-block@~2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz#8c6c3ab4a5eff0a16d9785fbeedbe643f4dbcbef"
- integrity sha512-Ye+uG/L2wrp364Zihdlr/GfC3ft+zG8PdHcRtsBFNNH1CkOhxOwdB8friBU85n89uRZ9eIMAywCq0F4CwT1wAw==
- dependencies:
- async "^2.0.1"
- ethereumjs-common "^1.1.0"
- ethereumjs-tx "^1.2.2"
- ethereumjs-util "^5.0.0"
- merkle-patricia-tree "^2.1.2"
-
-ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
- integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
- dependencies:
- async "^2.0.1"
- ethereum-common "0.2.0"
- ethereumjs-tx "^1.2.2"
- ethereumjs-util "^5.0.0"
- merkle-patricia-tree "^2.1.2"
-
-ethereumjs-blockchain@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-3.4.0.tgz#92240da6ecd86b3d8d324df69510b381f26c966b"
- integrity sha512-wxPSmt6EQjhbywkFbftKcb0qRFIZWocHMuDa8/AB4eWL/UPYalNcDyLaxYbrDytmhHid3Uu8G/tA3C/TxZBuOQ==
- dependencies:
- async "^2.6.1"
- ethashjs "~0.0.7"
- ethereumjs-block "~2.2.0"
- ethereumjs-common "^1.1.0"
- ethereumjs-util "~6.0.0"
- flow-stoplight "^1.0.0"
- level-mem "^3.0.1"
- lru-cache "^5.1.1"
- safe-buffer "^5.1.2"
- semaphore "^1.1.0"
-
-ethereumjs-common@^1.1.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.3.1.tgz#a5cffac41beb7ad393283b2e5aa71fadf8a9cc73"
- integrity sha512-kexqNgM2q29RKoZPPjehPREeqbr/vhYfT9Ho8FVeH3f7USjBuYp1iZ1qjqklk8FSMvEKPpMJFYSOunikw30Prw==
-
-ethereumjs-testrpc-sc@6.5.1-sc.1:
- version "6.5.1-sc.1"
- resolved "https://registry.yarnpkg.com/ethereumjs-testrpc-sc/-/ethereumjs-testrpc-sc-6.5.1-sc.1.tgz#514020faa813d9f5cb9ae13739de7c8704ff0ec2"
- integrity sha512-DPBwpMFFH5DTXicYjLLdTq6VLnD8p4oo5QfC9EmRKLzDsWRNXDhA9cgcdUZhhXuPM+mVAem7Q+o3Y3CQ5f+FKA==
- dependencies:
- ethereumjs-util "6.1.0"
- source-map-support "0.5.12"
- yargs "13.2.4"
-
-ethereumjs-tx@1.3.7, ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
- integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
- dependencies:
- ethereum-common "^0.0.18"
- ethereumjs-util "^5.0.0"
-
-ethereumjs-util@6.1.0, ethereumjs-util@^6.0.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8"
- integrity sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==
- dependencies:
- bn.js "^4.11.0"
- create-hash "^1.1.2"
- ethjs-util "0.1.6"
- keccak "^1.0.2"
- rlp "^2.0.0"
- safe-buffer "^5.1.1"
- secp256k1 "^3.0.1"
-
-ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6"
- integrity sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=
- dependencies:
- bn.js "^4.8.0"
- create-hash "^1.1.2"
- keccakjs "^0.2.0"
- rlp "^2.0.0"
- secp256k1 "^3.0.1"
-
-ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642"
- integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==
- dependencies:
- bn.js "^4.11.0"
- create-hash "^1.1.2"
- ethjs-util "^0.1.3"
- keccak "^1.0.2"
- rlp "^2.0.0"
- safe-buffer "^5.1.1"
- secp256k1 "^3.0.1"
-
-ethereumjs-util@~6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.0.0.tgz#f14841c182b918615afefd744207c7932c8536c0"
- integrity sha512-E3yKUyl0Fs95nvTFQZe/ZSNcofhDzUsDlA5y2uoRmf1+Ec7gpGhNCsgKkZBRh7Br5op8mJcYF/jFbmjj909+nQ==
- dependencies:
- bn.js "^4.11.0"
- create-hash "^1.1.2"
- ethjs-util "^0.1.6"
- keccak "^1.0.2"
- rlp "^2.0.0"
- safe-buffer "^5.1.1"
- secp256k1 "^3.0.1"
-
-ethereumjs-vm@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-3.0.0.tgz#70fea2964a6797724b0d93fe080f9984ad18fcdd"
- integrity sha512-lNu+G/RWPRCrQM5s24MqgU75PEGiAhL4Ombw0ew6m08d+amsxf/vGAb98yDNdQqqHKV6JbwO/tCGfdqXGI6Cug==
- dependencies:
- async "^2.1.2"
- async-eventemitter "^0.2.2"
- ethereumjs-account "^2.0.3"
- ethereumjs-block "~2.2.0"
- ethereumjs-blockchain "^3.4.0"
- ethereumjs-common "^1.1.0"
- ethereumjs-util "^6.0.0"
- fake-merkle-patricia-tree "^1.0.1"
- functional-red-black-tree "^1.0.1"
- merkle-patricia-tree "^2.3.2"
- rustbn.js "~0.2.0"
- safe-buffer "^5.1.1"
-
-ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
- integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==
- dependencies:
- async "^2.1.2"
- async-eventemitter "^0.2.2"
- ethereumjs-account "^2.0.3"
- ethereumjs-block "~2.2.0"
- ethereumjs-common "^1.1.0"
- ethereumjs-util "^6.0.0"
- fake-merkle-patricia-tree "^1.0.1"
- functional-red-black-tree "^1.0.1"
- merkle-patricia-tree "^2.3.2"
- rustbn.js "~0.2.0"
- safe-buffer "^5.1.1"
-
-ethereumjs-wallet@0.6.3:
- version "0.6.3"
- resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz#b0eae6f327637c2aeb9ccb9047b982ac542e6ab1"
- integrity sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w==
- dependencies:
- aes-js "^3.1.1"
- bs58check "^2.1.2"
- ethereumjs-util "^6.0.0"
- hdkey "^1.1.0"
- randombytes "^2.0.6"
- safe-buffer "^5.1.2"
- scrypt.js "^0.3.0"
- utf8 "^3.0.0"
- uuid "^3.3.2"
-
-ethers@4.0.0-beta.3:
- version "4.0.0-beta.3"
- resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.0-beta.3.tgz#15bef14e57e94ecbeb7f9b39dd0a4bd435bc9066"
- integrity sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==
- dependencies:
- "@types/node" "^10.3.2"
- aes-js "3.0.0"
- bn.js "^4.4.0"
- elliptic "6.3.3"
- hash.js "1.1.3"
- js-sha3 "0.5.7"
- scrypt-js "2.0.3"
- setimmediate "1.0.4"
- uuid "2.0.1"
- xmlhttprequest "1.8.0"
-
-ethers@^4.0.27:
- version "4.0.39"
- resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.39.tgz#5ce9dfffedb03936415743f63b37d96280886a47"
- integrity sha512-QVtC8TTUgTrnlQjQvdFJ7fkSWKwp8HVTbKRmrdbVryrPzJHMTf3WSeRNvLF2enGyAFtyHJyFNnjN0fSshcEr9w==
- dependencies:
- "@types/node" "^10.3.2"
- aes-js "3.0.0"
- bn.js "^4.4.0"
- elliptic "6.3.3"
- hash.js "1.1.3"
- js-sha3 "0.5.7"
- scrypt-js "2.0.4"
- setimmediate "1.0.4"
- uuid "2.0.1"
- xmlhttprequest "1.8.0"
-
-ethjs-unit@0.1.6, ethjs-unit@^0.1.6:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
- integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
- dependencies:
- bn.js "4.11.6"
- number-to-bn "1.7.0"
-
-ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
- integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
- dependencies:
- is-hex-prefixed "1.0.0"
- strip-hex-prefix "1.0.0"
-
-eventemitter3@3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
- integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
-
-events@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
- integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
- integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
- dependencies:
- md5.js "^1.3.4"
- safe-buffer "^5.1.1"
-
-execa@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
- integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
- dependencies:
- cross-spawn "^5.0.1"
- get-stream "^3.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@^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"
-
-express@^4.14.0:
- version "4.17.1"
- resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
- integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
- dependencies:
- accepts "~1.3.7"
- array-flatten "1.1.1"
- body-parser "1.19.0"
- content-disposition "0.5.3"
- content-type "~1.0.4"
- cookie "0.4.0"
- cookie-signature "1.0.6"
- debug "2.6.9"
- depd "~1.1.2"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- etag "~1.8.1"
- finalhandler "~1.1.2"
- fresh "0.5.2"
- merge-descriptors "1.0.1"
- methods "~1.1.2"
- on-finished "~2.3.0"
- parseurl "~1.3.3"
- path-to-regexp "0.1.7"
- proxy-addr "~2.0.5"
- qs "6.7.0"
- range-parser "~1.2.1"
- safe-buffer "5.1.2"
- send "0.17.1"
- serve-static "1.14.1"
- setprototypeof "1.1.1"
- statuses "~1.5.0"
- type-is "~1.6.18"
- utils-merge "1.0.1"
- vary "~1.1.2"
-
-extend@~3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
- integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+neo-async@^2.6.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-external-editor@^3.0.3:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
- integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+npm-run-path@^5.1.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f"
+ integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==
dependencies:
- chardet "^0.7.0"
- iconv-lite "^0.4.24"
- tmp "^0.0.33"
-
-extsprintf@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
- integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+ path-key "^4.0.0"
-extsprintf@^1.2.0:
+once@^1.3.0:
version "1.4.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
- integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
-
-fake-merkle-patricia-tree@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
- integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM=
- dependencies:
- checkpoint-store "^1.1.0"
-
-fast-deep-equal@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
- integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
-
-fast-diff@^1.1.2, fast-diff@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
- integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
-
-fast-json-stable-stringify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
- integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
-
-fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
-
-fd-slicer@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
- integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
- dependencies:
- pend "~1.2.0"
-
-fetch-ponyfill@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893"
- integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=
- dependencies:
- node-fetch "~1.7.1"
-
-figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
- version "3.5.1"
- resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
- integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
-
-figures@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
- integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
- dependencies:
- escape-string-regexp "^1.0.5"
-
-figures@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec"
- integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==
- dependencies:
- escape-string-regexp "^1.0.5"
-
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
- dependencies:
- flat-cache "^2.0.1"
-
-file-type@^3.8.0:
- version "3.9.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
- integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
-
-file-type@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
- integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
-
-file-type@^6.1.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
- integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
-
-file-uri-to-path@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
- integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
-
-finalhandler@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
- integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
- dependencies:
- debug "2.6.9"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- on-finished "~2.3.0"
- parseurl "~1.3.3"
- statuses "~1.5.0"
- unpipe "~1.0.0"
-
-find-root@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
- integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
-
-find-up@3.0.0, find-up@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
- integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
- dependencies:
- locate-path "^3.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"
-
-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 sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
- dependencies:
- locate-path "^2.0.0"
-
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
- dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
-
-flat@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2"
- integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
- is-buffer "~2.0.3"
-
-flatted@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08"
- integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
-
-flow-stoplight@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b"
- integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=
+ wrappy "1"
-flush-write-stream@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
- integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
- dependencies:
- inherits "^2.0.3"
- readable-stream "^2.3.6"
-
-for-each@^0.3.3, 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"
-
-forever-agent@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
- integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
-
-form-data@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
- integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.6"
- mime-types "^2.1.12"
-
-forwarded@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
- integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
-
-fresh@0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
- integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
-
-from2@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
- integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
- dependencies:
- inherits "^2.0.1"
- readable-stream "^2.0.0"
-
-fs-constants@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
- integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-
-fs-extra@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
- integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-fs-minipass@^1.2.5:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07"
- integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==
- dependencies:
- minipass "^2.2.1"
-
-fs-write-stream-atomic@^1.0.8:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
- integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
- dependencies:
- graceful-fs "^4.1.2"
- iferr "^0.1.5"
- imurmurhash "^0.1.4"
- readable-stream "1 || 2"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-
-function-bind@^1.0.2, function-bind@^1.1.1, 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==
-
-functional-red-black-tree@^1.0.1, 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 sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
-
-funding@^1.0.0:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/funding/-/funding-1.0.8.tgz#99640755b28080debd74a9337d448b8af00f827f"
- integrity sha512-M4yYVbIgS9jxKY0XS89DDpsiMHe+JiwavRaXCmJxNmhJhVPEi8KigfP6mP69oOWaTDrCfrF4rE36OhGfoHkTTQ==
- dependencies:
- boxen "^3.2.0"
- chalk "^2.4.2"
- ci-info "^2.0.0"
- term-size "^2.1.0"
- word-wrap "^1.2.3"
-
-ganache-cli@^6.7.0:
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.7.0.tgz#b59845578221bdf686cf124d007c5ee62e85a62f"
- integrity sha512-9CZsClo9hl5MxGL7hkk14mie89Q94P0idh92jcV7LmppTYTCG7SHatuwcfqN7emFHArMt3fneN4QbH2do2N6Ow==
- dependencies:
- ethereumjs-util "6.1.0"
- source-map-support "0.5.12"
- yargs "13.2.4"
-
-ganache-core@^2.6.1:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.7.0.tgz#9897c7ad6ebe934e92f88e62fcf3c6cc1f1a807f"
- integrity sha512-oZBNb2pZlD/uMxHDYJp4SBfavwblcGyqNPiZBgilp2n1fO/rnZwEAcpKE+1Uq1sO27YxuKJosm3Jvr9NarOWGA==
- dependencies:
- abstract-leveldown "3.0.0"
- async "2.6.2"
- bip39 "2.5.0"
- cachedown "1.0.0"
- clone "2.1.2"
- debug "3.2.6"
- encoding-down "5.0.4"
- eth-sig-util "2.2.0"
- ethereumjs-abi "0.6.7"
- ethereumjs-account "3.0.0"
- ethereumjs-block "2.2.0"
- ethereumjs-tx "1.3.7"
- ethereumjs-util "6.1.0"
- ethereumjs-vm "3.0.0"
- heap "0.2.6"
- level-sublevel "6.6.4"
- levelup "3.1.1"
- lodash "4.17.14"
- merkle-patricia-tree "2.3.2"
- seedrandom "3.0.1"
- source-map-support "0.5.12"
- tmp "0.1.0"
- web3-provider-engine "14.2.0"
- websocket "1.0.29"
- optionalDependencies:
- ethereumjs-wallet "0.6.3"
- web3 "1.2.1"
-
-genfun@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
- integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
-
-get-caller-file@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
- integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
-
-get-caller-file@^2.0.1:
- 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-func-name@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
- integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
-
-get-stdin@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6"
- integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==
-
-get-stream@^2.2.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
- integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
- dependencies:
- object-assign "^4.0.1"
- pinkie-promise "^2.0.0"
-
-get-stream@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
- integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
-
-get-stream@^4.0.0, get-stream@^4.1.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.1.0:
+onetime@^5.1.0:
version "5.1.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
- integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
- dependencies:
- pump "^3.0.0"
-
-getpass@^0.1.1:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
- integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
- dependencies:
- assert-plus "^1.0.0"
-
-glob-parent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954"
- integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==
- dependencies:
- is-glob "^4.0.1"
-
-glob@7.1.2:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
- integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@7.1.3:
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
- integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^5.0.15:
- version "5.0.15"
- resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
- integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "2 || 3"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.0.0, glob@^7.1.4:
- version "7.1.5"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0"
- integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.0.5, glob@^7.1.3, glob@~7.1.4:
- version "7.1.4"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
- integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.1.2:
- version "7.1.6"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
- integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-global-dirs@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
- integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
- dependencies:
- ini "^1.3.4"
-
-global@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
- integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
- dependencies:
- min-document "^2.19.0"
- process "^0.11.10"
-
-global@~4.3.0:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
- integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
- dependencies:
- min-document "^2.19.0"
- process "~0.5.1"
-
-globals@^11.7.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.3.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13"
- integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==
- dependencies:
- type-fest "^0.8.1"
-
-globals@^9.18.0:
- version "9.18.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
- integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
-
-got@9.6.0, got@^9.6.0:
- version "9.6.0"
- resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
- integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
- dependencies:
- "@sindresorhus/is" "^0.14.0"
- "@szmarczak/http-timer" "^1.1.2"
- cacheable-request "^6.0.0"
- decompress-response "^3.3.0"
- duplexer3 "^0.1.4"
- get-stream "^4.1.0"
- lowercase-keys "^1.0.1"
- mimic-response "^1.0.1"
- p-cancelable "^1.0.0"
- to-readable-stream "^1.0.0"
- url-parse-lax "^3.0.0"
-
-got@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
- integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
- dependencies:
- decompress-response "^3.2.0"
- duplexer3 "^0.1.4"
- get-stream "^3.0.0"
- is-plain-obj "^1.1.0"
- is-retry-allowed "^1.0.0"
- is-stream "^1.0.0"
- isurl "^1.0.0-alpha5"
- lowercase-keys "^1.0.0"
- p-cancelable "^0.3.0"
- p-timeout "^1.1.1"
- safe-buffer "^5.0.1"
- timed-out "^4.0.0"
- url-parse-lax "^1.0.0"
- url-to-options "^1.0.1"
-
-graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
- integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
-
-"graceful-readlink@>= 1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
- integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
-
-growl@1.10.3:
- version "1.10.3"
- resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f"
- integrity sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==
-
-growl@1.10.5:
- version "1.10.5"
- resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
- integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
-
-handlebars@^4.0.1:
- version "4.7.6"
- resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e"
- integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==
- dependencies:
- minimist "^1.2.5"
- neo-async "^2.6.0"
- source-map "^0.6.1"
- wordwrap "^1.0.0"
- optionalDependencies:
- uglify-js "^3.1.4"
-
-har-schema@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
- integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
-
-har-validator@~5.1.0:
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
- integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
- dependencies:
- ajv "^6.5.5"
- har-schema "^2.0.0"
-
-has-ansi@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
- integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
- dependencies:
- ansi-regex "^2.0.0"
-
-has-flag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
- integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
-
-has-flag@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
- integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=
-
-has-flag@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
-
-has-symbol-support-x@^1.4.1:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
- integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
-
-has-symbols@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
- integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
-
-has-symbols@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
- integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
-
-has-to-string-tag-x@^1.2.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
- integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
- dependencies:
- has-symbol-support-x "^1.4.1"
-
-has-yarn@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
- integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
-
-has@^1.0.1, has@^1.0.3, 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-base@^3.0.0:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
- integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-hash.js@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
- integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==
- dependencies:
- inherits "^2.0.3"
- minimalistic-assert "^1.0.0"
-
-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"
-
-hdkey@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.1.tgz#c2b3bfd5883ff9529b72f2f08b28be0972a9f64a"
- integrity sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==
- dependencies:
- coinstring "^2.0.0"
- safe-buffer "^5.1.1"
- secp256k1 "^3.0.1"
-
-he@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
- integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
-
-he@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
- integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-
-heap@0.2.6:
- version "0.2.6"
- resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac"
- integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=
-
-hmac-drbg@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
- integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
- dependencies:
- hash.js "^1.0.3"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.1"
-
-home-or-tmp@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
- integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
- dependencies:
- os-homedir "^1.0.0"
- os-tmpdir "^1.0.1"
-
-hosted-git-info@^2.1.4:
- version "2.8.4"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546"
- integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==
-
-hosted-git-info@^2.7.1:
- version "2.8.5"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c"
- integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==
-
-http-cache-semantics@^3.8.1:
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
- integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
-
-http-cache-semantics@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5"
- integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==
-
-http-errors@1.7.2:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
- integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
- dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.1"
- statuses ">= 1.5.0 < 2"
- toidentifier "1.0.0"
-
-http-errors@~1.7.2:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
- integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
- dependencies:
- depd "~1.1.2"
- inherits "2.0.4"
- setprototypeof "1.1.1"
- statuses ">= 1.5.0 < 2"
- toidentifier "1.0.0"
-
-http-https@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
- integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=
-
-http-proxy-agent@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
- integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
- dependencies:
- agent-base "4"
- debug "3.1.0"
-
-http-signature@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
- integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
- dependencies:
- assert-plus "^1.0.0"
- jsprim "^1.2.2"
- sshpk "^1.7.0"
-
-https-proxy-agent@^2.2.3:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
- integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
- dependencies:
- agent-base "^4.3.0"
- debug "^3.1.0"
-
-humanize-ms@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
- integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
- dependencies:
- ms "^2.0.0"
-
-iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13:
- 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"
-
-idna-uts46-hx@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
- integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
- dependencies:
- punycode "2.1.0"
-
-ieee754@^1.1.4:
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
- integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
-
-iferr@^0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
- integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
-
-ignore-walk@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
- integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
- dependencies:
- minimatch "^3.0.4"
-
-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.0.0, ignore@^5.1.1:
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
- integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
-
-immediate@^3.2.3, immediate@~3.2.3:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
- integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
-
-import-fresh@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
- integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
- dependencies:
- caller-path "^2.0.0"
- resolve-from "^3.0.0"
-
-import-fresh@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118"
- integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==
- dependencies:
- parent-module "^1.0.0"
- resolve-from "^4.0.0"
-
-import-lazy@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
- integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
-
-imurmurhash@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
-
-infer-owner@^1.0.3, infer-owner@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
- integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-inherits@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
- integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
-
-ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
- integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
-
-inquirer@^6.2.2, inquirer@^6.4.1:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
- integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
- dependencies:
- ansi-escapes "^3.2.0"
- chalk "^2.4.2"
- cli-cursor "^2.1.0"
- cli-width "^2.0.0"
- external-editor "^3.0.3"
- figures "^2.0.0"
- lodash "^4.17.12"
- mute-stream "0.0.7"
- run-async "^2.2.0"
- rxjs "^6.4.0"
- string-width "^2.1.0"
- strip-ansi "^5.1.0"
- through "^2.3.6"
-
-inquirer@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a"
- integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==
- dependencies:
- ansi-escapes "^4.2.1"
- chalk "^2.4.2"
- cli-cursor "^3.1.0"
- cli-width "^2.0.0"
- external-editor "^3.0.3"
- figures "^3.0.0"
- lodash "^4.17.15"
- mute-stream "0.0.8"
- run-async "^2.2.0"
- rxjs "^6.4.0"
- string-width "^4.1.0"
- strip-ansi "^5.1.0"
- through "^2.3.6"
-
-interpret@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
- integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
-
-invariant@^2.2.2:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
- integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
- dependencies:
- loose-envify "^1.0.0"
-
-invert-kv@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
- integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
-
-ip@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
- integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
-
-ipaddr.js@1.9.0:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
- integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
-
-is-arrayish@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
- integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
-
-is-buffer@~2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
- integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
-
-is-callable@^1.1.3, is-callable@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
- integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
-
-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-date-object@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
- integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
-
-is-directory@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
- integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
-
-is-extglob@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
- integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-
-is-finite@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
- integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
- dependencies:
- number-is-nan "^1.0.0"
-
-is-fn@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c"
- integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=
-
-is-fullwidth-code-point@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
- integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
- dependencies:
- number-is-nan "^1.0.0"
-
-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 sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
-
-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-function@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
- integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
-
-is-glob@^4.0.0, is-glob@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-hex-prefixed@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
- integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
-
-is-installed-globally@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
- integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
- dependencies:
- global-dirs "^0.1.0"
- is-path-inside "^1.0.0"
-
-is-natural-number@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
- integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
-
-is-npm@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053"
- integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==
-
-is-obj@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
- integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
-
-is-object@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
- integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
-
-is-path-inside@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
- integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
- dependencies:
- path-is-inside "^1.0.1"
-
-is-plain-obj@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
- integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
-
-is-promise@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
- integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
-
-is-regex@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
- integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
- dependencies:
- has "^1.0.1"
-
-is-retry-allowed@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
- integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=
-
-is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
- integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
-
-is-symbol@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
- integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
- dependencies:
- has-symbols "^1.0.0"
-
-is-typedarray@^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 sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-
-is-yarn-global@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
- integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
-
-isarray@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
- integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
-
-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 sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-
-isstream@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
- integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
-
-istanbul@^0.4.5:
- version "0.4.5"
- resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
- integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=
- dependencies:
- abbrev "1.0.x"
- async "1.x"
- escodegen "1.8.x"
- esprima "2.7.x"
- glob "^5.0.15"
- handlebars "^4.0.1"
- js-yaml "3.x"
- mkdirp "0.5.x"
- nopt "3.x"
- once "1.x"
- resolve "1.1.x"
- supports-color "^3.1.0"
- which "^1.1.1"
- wordwrap "^1.0.0"
-
-isurl@^1.0.0-alpha5:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
- integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
- dependencies:
- has-to-string-tag-x "^1.2.0"
- is-object "^1.0.1"
-
-jju@^1.1.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a"
- integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo=
-
-js-sha3@0.5.7, js-sha3@^0.5.7:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
- integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
-
-js-sha3@^0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.6.1.tgz#5b89f77a7477679877f58c4a075240934b1f95c0"
- integrity sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=
-
-"js-tokens@^3.0.0 || ^4.0.0", 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-tokens@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
- integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-
-js-yaml@3.13.1, js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1:
- version "3.13.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
- integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
-jsbn@~0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
- integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-
-jsesc@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
- integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
-
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
-
-json-buffer@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
- integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
-
-json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-
-json-parse-helpfulerror@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc"
- integrity sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=
- dependencies:
- jju "^1.1.0"
-
-json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0:
- version "3.8.0"
- resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9"
- integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==
- dependencies:
- async "^2.0.1"
- babel-preset-env "^1.7.0"
- babelify "^7.3.0"
- json-rpc-error "^2.0.0"
- promise-to-callback "^1.0.0"
- safe-event-emitter "^1.0.1"
-
-json-rpc-error@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02"
- integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI=
- dependencies:
- inherits "^2.0.1"
-
-json-rpc-random-id@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
- integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg=
-
-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@0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
- integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
-
-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 sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
-
-json-stable-stringify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
- integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
- dependencies:
- jsonify "~0.0.0"
-
-json-stringify-safe@~5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
- integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
-
-json5@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
- integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
-
-json5@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6"
- integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==
- dependencies:
- minimist "^1.2.0"
-
-jsonfile@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
- integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
- optionalDependencies:
- graceful-fs "^4.1.6"
-
-jsonify@~0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
- integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
-
-jsonparse@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
- integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
-
-jsprim@^1.2.2:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
- integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
- dependencies:
- assert-plus "1.0.0"
- extsprintf "1.3.0"
- json-schema "0.2.3"
- verror "1.10.0"
-
-jsx-ast-utils@^2.1.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb"
- integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==
- dependencies:
- array-includes "^3.0.3"
- object.assign "^4.1.0"
-
-jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f"
- integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==
- dependencies:
- array-includes "^3.0.3"
- object.assign "^4.1.0"
-
-keccak@^1.0.2:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80"
- integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==
- dependencies:
- bindings "^1.2.1"
- inherits "^2.0.3"
- nan "^2.2.1"
- safe-buffer "^5.1.0"
-
-keccakjs@^0.2.0, keccakjs@^0.2.1:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.3.tgz#5e4e969ce39689a3861f445d7752ee3477f9fe72"
- integrity sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==
- dependencies:
- browserify-sha3 "^0.0.4"
- sha3 "^1.2.2"
-
-keyv@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
- integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
- dependencies:
- json-buffer "3.0.0"
-
-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==
-
-latest-version@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
- integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
- dependencies:
- package-json "^6.3.0"
-
-lcid@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
- integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
- dependencies:
- invert-kv "^2.0.0"
-
-lcov-parse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0"
- integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A=
-
-level-codec@^9.0.0:
- version "9.0.1"
- resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.1.tgz#042f4aa85e56d4328ace368c950811ba802b7247"
- integrity sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q==
-
-level-codec@~7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
- integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
-
-level-errors@^1.0.3:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
- integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==
- dependencies:
- errno "~0.1.1"
-
-level-errors@^2.0.0, level-errors@~2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
- integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
- dependencies:
- errno "~0.1.1"
-
-level-errors@~1.0.3:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859"
- integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
- dependencies:
- errno "~0.1.1"
-
-level-iterator-stream@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4"
- integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==
- dependencies:
- inherits "^2.0.1"
- readable-stream "^2.0.5"
- xtend "^4.0.0"
-
-level-iterator-stream@~1.3.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
- integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=
- dependencies:
- inherits "^2.0.1"
- level-errors "^1.0.3"
- readable-stream "^1.0.33"
- xtend "^4.0.0"
-
-level-iterator-stream@~3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730"
- integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==
- dependencies:
- inherits "^2.0.1"
- readable-stream "^2.3.6"
- xtend "^4.0.0"
-
-level-mem@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5"
- integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==
- dependencies:
- level-packager "~4.0.0"
- memdown "~3.0.0"
-
-level-packager@~4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6"
- integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==
- dependencies:
- encoding-down "~5.0.0"
- levelup "^3.0.0"
-
-level-post@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0"
- integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==
- dependencies:
- ltgt "^2.1.2"
-
-level-sublevel@6.6.4:
- version "6.6.4"
- resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba"
- integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==
- dependencies:
- bytewise "~1.1.0"
- level-codec "^9.0.0"
- level-errors "^2.0.0"
- level-iterator-stream "^2.0.3"
- ltgt "~2.1.1"
- pull-defer "^0.2.2"
- pull-level "^2.0.3"
- pull-stream "^3.6.8"
- typewiselite "~1.0.0"
- xtend "~4.0.0"
-
-level-ws@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
- integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=
- dependencies:
- readable-stream "~1.0.15"
- xtend "~2.1.1"
-
-levelup@3.1.1, levelup@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189"
- integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==
- dependencies:
- deferred-leveldown "~4.0.0"
- level-errors "~2.0.0"
- level-iterator-stream "~3.0.0"
- xtend "~4.0.0"
-
-levelup@^1.2.1:
- version "1.3.9"
- resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab"
- integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
- dependencies:
- deferred-leveldown "~1.2.1"
- level-codec "~7.0.0"
- level-errors "~1.0.3"
- level-iterator-stream "~1.3.0"
- prr "~1.0.1"
- semver "~5.4.1"
- xtend "~4.0.0"
-
-levn@^0.3.0, levn@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
- integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
- dependencies:
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
-
-libnpmconfig@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0"
- integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==
- dependencies:
- figgy-pudding "^3.5.1"
- find-up "^3.0.0"
- ini "^1.3.5"
-
-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 sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- strip-bom "^3.0.0"
-
-load-json-file@^5.2.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3"
- integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==
- dependencies:
- graceful-fs "^4.1.15"
- parse-json "^4.0.0"
- pify "^4.0.1"
- strip-bom "^3.0.0"
- type-fest "^0.3.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 sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
- dependencies:
- p-locate "^2.0.0"
- path-exists "^3.0.0"
-
-locate-path@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
- integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
- dependencies:
- p-locate "^3.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.isequal@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
- integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
-
-lodash@4.17.14:
- version "4.17.14"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba"
- integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==
-
-lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.2.0:
- version "4.17.15"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
- integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
-
-log-driver@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8"
- integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==
-
-log-symbols@2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
- integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
- dependencies:
- chalk "^2.0.1"
-
-looper@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
- integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=
-
-looper@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749"
- integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=
-
-loose-envify@^1.0.0, loose-envify@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
- integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
- dependencies:
- js-tokens "^3.0.0 || ^4.0.0"
-
-lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
- integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
-
-lowercase-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
- integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
-
-lru-cache@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
- integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=
- dependencies:
- pseudomap "^1.0.1"
-
-lru-cache@^4.0.1:
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
- integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
- dependencies:
- pseudomap "^1.0.2"
- yallist "^2.1.2"
-
-lru-cache@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
- integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
- dependencies:
- yallist "^3.0.2"
-
-ltgt@^2.1.2, ltgt@~2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
- integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
-
-ltgt@~2.1.1:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34"
- integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=
-
-make-dir@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
- integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
- dependencies:
- pify "^3.0.0"
-
-make-fetch-happen@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.1.tgz#fac65400ab5f7a9c001862a3e9b0f417f0840175"
- integrity sha512-b4dfaMvUDR67zxUq1+GN7Ke9rH5WvGRmoHuMH7l+gmUCR2tCXFP6mpeJ9Dp+jB6z8mShRopSf1vLRBhRs8Cu5w==
- dependencies:
- agentkeepalive "^3.4.1"
- cacache "^12.0.0"
- http-cache-semantics "^3.8.1"
- http-proxy-agent "^2.1.0"
- https-proxy-agent "^2.2.3"
- lru-cache "^5.1.1"
- mississippi "^3.0.0"
- node-fetch-npm "^2.0.2"
- promise-retry "^1.1.1"
- socks-proxy-agent "^4.0.0"
- ssri "^6.0.0"
-
-map-age-cleaner@^0.1.1:
- 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"
-
-md5.js@^1.3.4:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
- integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
- safe-buffer "^5.1.2"
-
-media-typer@0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
- integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
-
-mem@^4.0.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
- integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
- dependencies:
- map-age-cleaner "^0.1.1"
- mimic-fn "^2.0.0"
- p-is-promise "^2.0.0"
-
-memdown@^1.0.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215"
- integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=
- dependencies:
- abstract-leveldown "~2.7.1"
- functional-red-black-tree "^1.0.1"
- immediate "^3.2.3"
- inherits "~2.0.1"
- ltgt "~2.2.0"
- safe-buffer "~5.1.1"
-
-memdown@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309"
- integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==
- dependencies:
- abstract-leveldown "~5.0.0"
- functional-red-black-tree "~1.0.1"
- immediate "~3.2.3"
- inherits "~2.0.1"
- ltgt "~2.2.0"
- safe-buffer "~5.1.1"
-
-merge-descriptors@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
- integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
-
-merkle-patricia-tree@2.3.2, merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a"
- integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==
- dependencies:
- async "^1.4.2"
- ethereumjs-util "^5.0.0"
- level-ws "0.0.0"
- levelup "^1.2.1"
- memdown "^1.0.0"
- readable-stream "^2.0.0"
- rlp "^2.0.0"
- semaphore ">=1.0.1"
-
-methods@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
- integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
-
-miller-rabin@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
- integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
- dependencies:
- bn.js "^4.0.0"
- brorand "^1.0.1"
-
-mime-db@1.40.0:
- version "1.40.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
- integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
-
-mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
- version "2.1.24"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
- integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
- dependencies:
- mime-db "1.40.0"
-
-mime@1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
-mimic-fn@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
- integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
-
-mimic-fn@^2.0.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==
-
-mimic-response@^1.0.0, mimic-response@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
- integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
-
-min-document@^2.19.0:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
- integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
- dependencies:
- dom-walk "^0.1.0"
-
-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.0, 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 sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-
-"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
- integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimist@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
- integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
-
-minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.0:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-
-minipass@^2.2.1, minipass@^2.3.5:
- version "2.3.5"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
- integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
- dependencies:
- safe-buffer "^5.1.2"
- yallist "^3.0.0"
-
-minipass@^2.8.6:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
- integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
- dependencies:
- safe-buffer "^5.1.2"
- yallist "^3.0.0"
-
-minizlib@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
- integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==
- dependencies:
- minipass "^2.2.1"
-
-mississippi@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
- integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
- dependencies:
- concat-stream "^1.5.0"
- duplexify "^3.4.2"
- end-of-stream "^1.1.0"
- flush-write-stream "^1.0.0"
- from2 "^2.1.0"
- parallel-transform "^1.1.0"
- pump "^3.0.0"
- pumpify "^1.3.3"
- stream-each "^1.1.0"
- through2 "^2.0.0"
-
-mkdirp-promise@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
- integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
- dependencies:
- mkdirp "*"
-
-mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
- integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
- dependencies:
- minimist "0.0.8"
-
-mocha@5.0.5:
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.5.tgz#e228e3386b9387a4710007a641f127b00be44b52"
- integrity sha512-3MM3UjZ5p8EJrYpG7s+29HAI9G7sTzKEe4+w37Dg0QP7qL4XGsV+Q2xet2cE37AqdgN1OtYQB6Vl98YiPV3PgA==
- dependencies:
- browser-stdout "1.3.1"
- commander "2.11.0"
- debug "3.1.0"
- diff "3.5.0"
- escape-string-regexp "1.0.5"
- glob "7.1.2"
- growl "1.10.3"
- he "1.1.1"
- mkdirp "0.5.1"
- supports-color "4.4.0"
-
-mocha@5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
- integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==
- dependencies:
- browser-stdout "1.3.1"
- commander "2.15.1"
- debug "3.1.0"
- diff "3.5.0"
- escape-string-regexp "1.0.5"
- glob "7.1.2"
- growl "1.10.5"
- he "1.1.1"
- minimatch "3.0.4"
- mkdirp "0.5.1"
- supports-color "5.4.0"
-
-mocha@^6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56"
- integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==
- dependencies:
- ansi-colors "3.2.3"
- browser-stdout "1.3.1"
- debug "3.2.6"
- diff "3.5.0"
- escape-string-regexp "1.0.5"
- find-up "3.0.0"
- glob "7.1.3"
- growl "1.10.5"
- he "1.2.0"
- js-yaml "3.13.1"
- log-symbols "2.2.0"
- minimatch "3.0.4"
- mkdirp "0.5.1"
- ms "2.1.1"
- node-environment-flags "1.0.5"
- object.assign "4.1.0"
- strip-json-comments "2.0.1"
- supports-color "6.0.0"
- which "1.3.1"
- wide-align "1.1.3"
- yargs "13.2.2"
- yargs-parser "13.0.0"
- yargs-unparser "1.5.0"
-
-mock-fs@^4.1.0:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.10.1.tgz#50a07a20114a6cdb119f35762f61f46266a1e323"
- integrity sha512-w22rOL5ZYu6HbUehB5deurghGM0hS/xBVyHMGKOuQctkk93J9z9VEOhDsiWrXOprVNQpP9uzGKdl8v9mFspKuw==
-
-move-concurrently@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
- integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
- dependencies:
- aproba "^1.1.1"
- copy-concurrently "^1.0.0"
- fs-write-stream-atomic "^1.0.8"
- mkdirp "^0.5.1"
- rimraf "^2.5.4"
- run-queue "^1.0.3"
-
-ms@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
- integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-
-ms@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
- integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-
-ms@^2.0.0, ms@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-mute-stream@0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
- integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
-
-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==
-
-nan@2.13.2:
- version "2.13.2"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
- integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
-
-nan@^2.0.8, nan@^2.14.0, nan@^2.2.1:
- version "2.14.0"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
- integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
-
-nano-json-stream-parser@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
- integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
-
-natural-compare@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-
-negotiator@0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
- integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
-
-neo-async@^2.6.0:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
- integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
-
-nested-error-stacks@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz#d2cc9fc5235ddb371fc44d506234339c8e4b0a4b"
- integrity sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==
-
-next-tick@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
- integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
-
-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-alias@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/node-alias/-/node-alias-1.0.4.tgz#1f1b916b56b9ea241c0135f97ced6940f556f292"
- integrity sha1-HxuRa1a56iQcATX5fO1pQPVW8pI=
- dependencies:
- chalk "^1.1.1"
- lodash "^4.2.0"
-
-node-environment-flags@1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a"
- integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==
- dependencies:
- object.getownpropertydescriptors "^2.0.3"
- semver "^5.7.0"
-
-node-fetch-npm@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7"
- integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==
- dependencies:
- encoding "^0.1.11"
- json-parse-better-errors "^1.0.0"
- safe-buffer "^5.1.1"
-
-node-fetch@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
- integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
-
-node-fetch@~1.7.1:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
- integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
- dependencies:
- encoding "^0.1.11"
- is-stream "^1.0.1"
-
-nopt@3.x:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
- integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
- dependencies:
- abbrev "1"
-
-normalize-package-data@^2.3.2, normalize-package-data@^2.4.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-url@^4.1.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee"
- integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==
-
-npm-bundled@^1.0.1:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
- integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
-
-npm-check-updates@^3.1.11:
- version "3.1.26"
- resolved "https://registry.yarnpkg.com/npm-check-updates/-/npm-check-updates-3.1.26.tgz#506d6d9e06b3d433bbc0ade37dd8a4686cb28ba9"
- integrity sha512-TQSMJgS7AdbdPsK5TsCNMa+7vdL7HLQrXKrwLMxPLiJtrnye9HEqJZK+U8VdbSq+qrjdt5lgm0g5vRmSSSOcvw==
- dependencies:
- chalk "^2.4.2"
- cint "^8.2.1"
- cli-table "^0.3.1"
- commander "^3.0.2"
- fast-diff "^1.2.0"
- find-up "4.1.0"
- get-stdin "^7.0.0"
- json-parse-helpfulerror "^1.0.3"
- libnpmconfig "^1.2.1"
- lodash "^4.17.15"
- node-alias "^1.0.4"
- pacote "^9.5.8"
- progress "^2.0.3"
- prompts "^2.2.1"
- rc-config-loader "^2.0.4"
- requireg "^0.2.2"
- semver "^6.3.0"
- semver-utils "^1.1.4"
- spawn-please "^0.3.0"
- update-notifier "^3.0.1"
-
-npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7"
- integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==
- dependencies:
- hosted-git-info "^2.7.1"
- osenv "^0.1.5"
- semver "^5.6.0"
- validate-npm-package-name "^3.0.0"
-
-npm-packlist@^1.1.12:
- version "1.4.6"
- resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4"
- integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==
- dependencies:
- ignore-walk "^3.0.1"
- npm-bundled "^1.0.1"
-
-npm-pick-manifest@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7"
- integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==
- dependencies:
- figgy-pudding "^3.5.1"
- npm-package-arg "^6.0.0"
- semver "^5.4.1"
-
-npm-registry-fetch@^4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.2.tgz#2b1434f93ccbe6b6385f8e45f45db93e16921d7a"
- integrity sha512-Z0IFtPEozNdeZRPh3aHHxdG+ZRpzcbQaJLthsm3VhNf6DScicTFRHZzK82u8RsJUsUHkX+QH/zcB/5pmd20H4A==
- dependencies:
- JSONStream "^1.3.4"
- bluebird "^3.5.1"
- figgy-pudding "^3.4.1"
- lru-cache "^5.1.1"
- make-fetch-happen "^5.0.0"
- npm-package-arg "^6.1.0"
- safe-buffer "^5.2.0"
-
-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 sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
- dependencies:
- path-key "^2.0.0"
-
-number-is-nan@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
- integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-
-number-to-bn@1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
- integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=
- dependencies:
- bn.js "4.11.6"
- strip-hex-prefix "1.0.0"
-
-oauth-sign@~0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
- integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
-
-object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
- integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-
-object-inspect@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
- integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
-
-object-inspect@~1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
- integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==
-
-object-keys@^1.0.11, object-keys@^1.0.12, 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-keys@~0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
- integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
-
-object.assign@4.1.0, object.assign@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
- integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
- dependencies:
- define-properties "^1.1.2"
- function-bind "^1.1.1"
- has-symbols "^1.0.0"
- object-keys "^1.0.11"
-
-object.entries@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519"
- integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.12.0"
- function-bind "^1.1.1"
- has "^1.0.3"
-
-object.fromentries@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab"
- integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==
- dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.11.0"
- function-bind "^1.1.1"
- has "^1.0.1"
-
-object.fromentries@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.1.tgz#050f077855c7af8ae6649f45c80b16ee2d31e704"
- integrity sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.15.0"
- function-bind "^1.1.1"
- has "^1.0.3"
-
-object.getownpropertydescriptors@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
- integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=
- dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.5.1"
-
-object.values@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9"
- integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.12.0"
- function-bind "^1.1.1"
- has "^1.0.3"
-
-oboe@2.1.4:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6"
- integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=
- dependencies:
- http-https "^1.0.0"
-
-on-finished@~2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
- integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
- dependencies:
- ee-first "1.1.1"
-
-once@1.x, 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 sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
- dependencies:
- wrappy "1"
-
-onetime@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
- integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
- dependencies:
- mimic-fn "^1.0.0"
-
-onetime@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
- integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
- dependencies:
- mimic-fn "^2.1.0"
-
-optionator@^0.8.1, optionator@^0.8.2:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
- integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
- dependencies:
- deep-is "~0.1.3"
- fast-levenshtein "~2.0.4"
- levn "~0.3.0"
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
- wordwrap "~1.0.0"
-
-optionator@^0.8.3:
- 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"
-
-original-require@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/original-require/-/original-require-1.0.1.tgz#0f130471584cd33511c5ec38c8d59213f9ac5e20"
- integrity sha1-DxMEcVhM0zURxew4yNWSE/msXiA=
-
-os-homedir@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
- integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
-
-os-locale@^3.0.0, os-locale@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
- integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
- dependencies:
- execa "^1.0.0"
- lcid "^2.0.0"
- mem "^4.0.0"
-
-os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
- integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-
-osenv@^0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
- integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
- dependencies:
- os-homedir "^1.0.0"
- os-tmpdir "^1.0.0"
-
-p-cancelable@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
- integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
-
-p-cancelable@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
- integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
-
-p-defer@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
- integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
-
-p-finally@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
- integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
-
-p-is-promise@^2.0.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.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2"
- integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==
- dependencies:
- p-try "^2.0.0"
-
-p-limit@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537"
- integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==
- 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 sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
- dependencies:
- p-limit "^1.1.0"
-
-p-locate@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
- integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
- dependencies:
- p-limit "^2.0.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-timeout@^1.1.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
- integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
- dependencies:
- p-finally "^1.0.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 sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
-
-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==
-
-package-json@^6.3.0:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
- integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
- dependencies:
- got "^9.6.0"
- registry-auth-token "^4.0.0"
- registry-url "^5.0.0"
- semver "^6.2.0"
-
-pacote@^9.5.8:
- version "9.5.9"
- resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.9.tgz#fa3a08629c9390b2b99769c55b2cc137e1a24df3"
- integrity sha512-S1nYW9ly+3btn3VmwRAk2LG3TEh8mkrFdY+psbnHSk8oPODbZ28uG0Z0d3yI0EpqcpLR6BukoVRf3H4IbGCkPQ==
- dependencies:
- bluebird "^3.5.3"
- cacache "^12.0.2"
- chownr "^1.1.2"
- figgy-pudding "^3.5.1"
- get-stream "^4.1.0"
- glob "^7.1.3"
- infer-owner "^1.0.4"
- lru-cache "^5.1.1"
- make-fetch-happen "^5.0.0"
- minimatch "^3.0.4"
- minipass "^2.3.5"
- mississippi "^3.0.0"
- mkdirp "^0.5.1"
- normalize-package-data "^2.4.0"
- npm-package-arg "^6.1.0"
- npm-packlist "^1.1.12"
- npm-pick-manifest "^3.0.0"
- npm-registry-fetch "^4.0.0"
- osenv "^0.1.5"
- promise-inflight "^1.0.1"
- promise-retry "^1.1.1"
- protoduck "^5.0.1"
- rimraf "^2.6.2"
- safe-buffer "^5.1.2"
- semver "^5.6.0"
- ssri "^6.0.1"
- tar "^4.4.10"
- unique-filename "^1.1.1"
- which "^1.3.1"
-
-parallel-transform@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
- integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
- dependencies:
- cyclist "^1.0.1"
- inherits "^2.0.3"
- readable-stream "^2.1.5"
-
-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-asn1@^5.0.0:
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc"
- integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==
- dependencies:
- asn1.js "^4.0.0"
- browserify-aes "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.0"
- pbkdf2 "^3.0.3"
- safe-buffer "^5.1.1"
-
-parse-headers@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
- integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==
- dependencies:
- for-each "^0.3.3"
- string.prototype.trim "^1.1.2"
-
-parse-json@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
- integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
- dependencies:
- error-ex "^1.2.0"
-
-parse-json@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
- integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
- dependencies:
- error-ex "^1.3.1"
- json-parse-better-errors "^1.0.1"
-
-parseurl@~1.3.3:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
- integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
-
-path-exists@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
- integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
-
-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, path-is-absolute@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-
-path-is-inside@^1.0.1, path-is-inside@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
- integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
-
-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 sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
-
-path-parse@^1.0.5, path-parse@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
- integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
-
-path-to-regexp@0.1.7:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
- integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
-
-path-type@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
- integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
- dependencies:
- pify "^2.0.0"
-
-pathval@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
- integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
-
-pbkdf2@^3.0.3, pbkdf2@^3.0.9:
- version "3.0.17"
- resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
- integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
- dependencies:
- create-hash "^1.1.2"
- create-hmac "^1.1.4"
- ripemd160 "^2.0.1"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
-
-performance-now@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
- integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-
-pify@^2.0.0, pify@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
- integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
-
-pify@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
- integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
-
-pify@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
- integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
-
-pinkie-promise@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
- integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
- dependencies:
- pinkie "^2.0.0"
-
-pinkie@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
- integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
-
-pkg-conf@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae"
- integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==
- dependencies:
- find-up "^3.0.0"
- load-json-file "^5.2.0"
-
-pkg-config@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4"
- integrity sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=
- dependencies:
- debug-log "^1.0.0"
- find-root "^1.0.0"
- xtend "^4.0.1"
-
-pkg-dir@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
- integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
- dependencies:
- find-up "^2.1.0"
-
-precond@0.2:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
- integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
-
-prelude-ls@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
- integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
-
-prepend-http@^1.0.1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
- integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
-
-prepend-http@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
- integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-
-prettier@^1.14.3:
- version "1.19.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
- integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
-
-private@^0.1.6, private@^0.1.8:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
- integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
-
-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.11.10:
- version "0.11.10"
- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
- integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
-
-process@~0.5.1:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
- integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
-
-progress@^2.0.0, progress@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
-promise-inflight@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
- integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-
-promise-retry@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
- integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=
- dependencies:
- err-code "^1.0.0"
- retry "^0.10.0"
-
-promise-to-callback@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
- integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=
- dependencies:
- is-fn "^1.0.0"
- set-immediate-shim "^1.0.1"
-
-prompts@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35"
- integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==
- dependencies:
- kleur "^3.0.3"
- sisteransi "^1.0.3"
-
-prop-types@^15.7.2:
- version "15.7.2"
- resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
- integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
- dependencies:
- loose-envify "^1.4.0"
- object-assign "^4.1.1"
- react-is "^16.8.1"
-
-protoduck@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f"
- integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==
- dependencies:
- genfun "^5.0.0"
-
-proxy-addr@~2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
- integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
- dependencies:
- forwarded "~0.1.2"
- ipaddr.js "1.9.0"
-
-prr@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
- integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-
-pseudomap@^1.0.1, pseudomap@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
- integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
-
-psl@^1.1.24:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd"
- integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==
-
-public-encrypt@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
- integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
- dependencies:
- bn.js "^4.1.0"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- parse-asn1 "^5.0.0"
- randombytes "^2.0.1"
- safe-buffer "^5.1.2"
-
-pull-cat@^1.1.9:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b"
- integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs=
-
-pull-defer@^0.2.2:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113"
- integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==
-
-pull-level@^2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac"
- integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==
- dependencies:
- level-post "^1.0.7"
- pull-cat "^1.1.9"
- pull-live "^1.0.1"
- pull-pushable "^2.0.0"
- pull-stream "^3.4.0"
- pull-window "^2.1.4"
- stream-to-pull-stream "^1.7.1"
-
-pull-live@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5"
- integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=
- dependencies:
- pull-cat "^1.1.9"
- pull-stream "^3.4.0"
-
-pull-pushable@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581"
- integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
-
-pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
- version "3.6.14"
- resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee"
- integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==
-
-pull-window@^2.1.4:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0"
- integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=
- dependencies:
- looper "^2.0.0"
-
-pump@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
- integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-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"
-
-pumpify@^1.3.3:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
- integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
- dependencies:
- duplexify "^3.6.0"
- inherits "^2.0.3"
- pump "^2.0.0"
-
-punycode@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
- integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
-
-punycode@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
- integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-
-punycode@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
-qs@6.7.0:
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
- integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
-
-qs@~6.5.2:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
- integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
-
-query-string@^5.0.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
- integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
- dependencies:
- decode-uri-component "^0.2.0"
- object-assign "^4.1.0"
- strict-uri-encode "^1.0.0"
-
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
- integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
- dependencies:
- safe-buffer "^5.1.0"
-
-randomfill@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
- integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
- dependencies:
- randombytes "^2.0.5"
- safe-buffer "^5.1.0"
-
-randomhex@0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585"
- integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=
-
-range-parser@~1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
- integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-
-raw-body@2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
- integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
- dependencies:
- bytes "3.1.0"
- http-errors "1.7.2"
- iconv-lite "0.4.24"
- unpipe "1.0.0"
-
-rc-config-loader@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-2.0.4.tgz#fe23e26a87e2ec07541b29e7f37bfd75807a4c36"
- integrity sha512-k06UzRbYDWgF4Mc/YrsZsmzSpDLuHoThJxep+vq5H09hiX8rbA5Ue/Ra0dwWm5MQvWYW4YBXgA186inNxuxidQ==
- dependencies:
- debug "^4.1.1"
- js-yaml "^3.12.0"
- json5 "^2.1.0"
- object-assign "^4.1.0"
- object-keys "^1.0.12"
- path-exists "^3.0.0"
- require-from-string "^2.0.2"
-
-rc@^1.2.8, rc@~1.2.7:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
- integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
- dependencies:
- deep-extend "^0.6.0"
- ini "~1.3.0"
- minimist "^1.2.0"
- strip-json-comments "~2.0.1"
-
-react-is@^16.8.1:
- version "16.9.0"
- resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb"
- integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==
-
-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 sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^2.0.0"
-
-read-pkg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
- integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
- dependencies:
- load-json-file "^2.0.0"
- normalize-package-data "^2.3.2"
- path-type "^2.0.0"
-
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
- integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
- 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"
-
-readable-stream@^1.0.33:
- version "1.1.14"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
- integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-readable-stream@~1.0.15:
- version "1.0.34"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
- integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-rechoir@^0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
- integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
- dependencies:
- resolve "^1.1.6"
-
-regenerate@^1.2.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
- integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
-
-regenerator-runtime@^0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
- integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
-
-regenerator-runtime@^0.13.2:
- version "0.13.3"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
- integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
-
-regenerator-transform@^0.10.0:
- version "0.10.1"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
- integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
- dependencies:
- babel-runtime "^6.18.0"
- babel-types "^6.19.0"
- private "^0.1.6"
-
-regexpp@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
- integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
-
-regexpu-core@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
- integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
- dependencies:
- regenerate "^1.2.1"
- regjsgen "^0.2.0"
- regjsparser "^0.1.4"
-
-registry-auth-token@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.0.0.tgz#30e55961eec77379da551ea5c4cf43cbf03522be"
- integrity sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==
- dependencies:
- rc "^1.2.8"
- safe-buffer "^5.0.1"
-
-registry-url@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
- integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
- dependencies:
- rc "^1.2.8"
-
-regjsgen@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
- integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
-
-regjsparser@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
- integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
- dependencies:
- jsesc "~0.5.0"
-
-repeating@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
- integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
- dependencies:
- is-finite "^1.0.0"
-
-req-cwd@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-1.0.1.tgz#0d73aeae9266e697a78f7976019677e76acf0fff"
- integrity sha1-DXOurpJm5penj3l2AZZ352rPD/8=
- dependencies:
- req-from "^1.0.1"
-
-req-from@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/req-from/-/req-from-1.0.1.tgz#bf81da5147947d32d13b947dc12a58ad4587350e"
- integrity sha1-v4HaUUeUfTLRO5R9wSpYrUWHNQ4=
- dependencies:
- resolve-from "^2.0.0"
-
-request@^2.79.0, request@^2.85.0, request@^2.88.0:
- version "2.88.0"
- resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
- integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
- dependencies:
- aws-sign2 "~0.7.0"
- aws4 "^1.8.0"
- caseless "~0.12.0"
- combined-stream "~1.0.6"
- extend "~3.0.2"
- forever-agent "~0.6.1"
- form-data "~2.3.2"
- har-validator "~5.1.0"
- http-signature "~1.2.0"
- is-typedarray "~1.0.0"
- isstream "~0.1.2"
- json-stringify-safe "~5.0.1"
- mime-types "~2.1.19"
- oauth-sign "~0.9.0"
- performance-now "^2.1.0"
- qs "~6.5.2"
- safe-buffer "^5.1.2"
- tough-cookie "~2.4.3"
- tunnel-agent "^0.6.0"
- uuid "^3.3.2"
-
-require-directory@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
- integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-
-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@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
- integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
-
-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==
-
-requireg@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/requireg/-/requireg-0.2.2.tgz#437e77a5316a54c9bcdbbf5d1f755fe093089830"
- integrity sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==
- dependencies:
- nested-error-stacks "~2.0.1"
- rc "~1.2.7"
- resolve "~1.7.1"
-
-resolve-from@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
- integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=
-
-resolve-from@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
- integrity sha1-six699nWiBvItuZTM17rywoYh0g=
-
-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@1.1.x:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
- integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-
-resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.5.0:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
- integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
- dependencies:
- path-parse "^1.0.6"
-
-resolve@^1.13.1:
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16"
- integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==
- dependencies:
- path-parse "^1.0.6"
-
-resolve@~1.11.1:
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e"
- integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==
- dependencies:
- path-parse "^1.0.6"
-
-resolve@~1.7.1:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
- integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==
- dependencies:
- path-parse "^1.0.5"
-
-responselike@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
- integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
- dependencies:
- lowercase-keys "^1.0.0"
-
-restore-cursor@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
- integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
- dependencies:
- onetime "^2.0.0"
- signal-exit "^3.0.2"
-
-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"
-
-resumer@~0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
- integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
- dependencies:
- through "~2.3.4"
-
-retry@^0.10.0:
- version "0.10.1"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
- integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
-
-rimraf@2.6.3:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
- dependencies:
- glob "^7.1.3"
-
-rimraf@^2.5.4, rimraf@^2.6.2, 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"
-
-ripemd160@^2.0.0, ripemd160@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
- integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
-
-rlp@^2.0.0, rlp@^2.2.1:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.3.tgz#7f94aef86cec412df87d5ea1d8cb116a47d45f0e"
- integrity sha512-l6YVrI7+d2vpW6D6rS05x2Xrmq8oW7v3pieZOJKBEdjuTF4Kz/iwk55Zyh1Zaz+KOB2kC8+2jZlp2u9L4tTzCQ==
- dependencies:
- bn.js "^4.11.1"
- safe-buffer "^5.1.1"
-
-run-async@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
- integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
- dependencies:
- is-promise "^2.1.0"
-
-run-parallel@^1.1.2:
- version "1.1.9"
- resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
- integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
-
-run-queue@^1.0.0, run-queue@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
- integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
- dependencies:
- aproba "^1.1.1"
-
-rustbn.js@~0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
- integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
-
-rxjs@^6.4.0:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7"
- integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==
- dependencies:
- tslib "^1.9.0"
-
-safe-buffer@5.1.2, 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-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
- integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
-
-safe-event-emitter@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af"
- integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
- dependencies:
- events "^3.0.0"
-
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-
-sax@>=0.6.0:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
- integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-
-scrypt-js@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4"
- integrity sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=
-
-scrypt-js@2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16"
- integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==
-
-scrypt.js@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.3.0.tgz#6c62d61728ad533c8c376a2e5e3e86d41a95c4c0"
- integrity sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A==
- dependencies:
- scryptsy "^1.2.1"
- optionalDependencies:
- scrypt "^6.0.2"
-
-scrypt@^6.0.2:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/scrypt/-/scrypt-6.0.3.tgz#04e014a5682b53fa50c2d5cce167d719c06d870d"
- integrity sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=
- dependencies:
- nan "^2.0.8"
-
-scryptsy@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790"
- integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==
-
-scryptsy@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
- integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM=
- dependencies:
- pbkdf2 "^3.0.3"
-
-secp256k1@^3.0.1:
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.7.1.tgz#12e473e0e9a7c2f2d4d4818e722ad0e14cc1e2f1"
- integrity sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==
- dependencies:
- bindings "^1.5.0"
- bip66 "^1.1.5"
- bn.js "^4.11.8"
- create-hash "^1.2.0"
- drbg.js "^1.0.1"
- elliptic "^6.4.1"
- nan "^2.14.0"
- safe-buffer "^5.1.2"
-
-seedrandom@3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083"
- integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
-
-seek-bzip@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
- integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
- dependencies:
- commander "~2.8.1"
-
-semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
- integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
-
-semver-diff@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
- integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
- dependencies:
- semver "^5.0.3"
-
-semver-utils@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/semver-utils/-/semver-utils-1.1.4.tgz#cf0405e669a57488913909fc1c3f29bf2a4871e2"
- integrity sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==
-
-"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db"
- integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==
-
-semver@^6.1.0, semver@^6.1.2, semver@^6.2.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==
-
-semver@~5.4.1:
- version "5.4.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
- integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
-
-send@0.17.1:
- version "0.17.1"
- resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
- integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
- dependencies:
- debug "2.6.9"
- depd "~1.1.2"
- destroy "~1.0.4"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- etag "~1.8.1"
- fresh "0.5.2"
- http-errors "~1.7.2"
- mime "1.6.0"
- ms "2.1.1"
- on-finished "~2.3.0"
- range-parser "~1.2.1"
- statuses "~1.5.0"
-
-serve-static@1.14.1:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
- integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
- dependencies:
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- parseurl "~1.3.3"
- send "0.17.1"
-
-servify@^0.1.12:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
- integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
- dependencies:
- body-parser "^1.16.0"
- cors "^2.8.1"
- express "^4.14.0"
- request "^2.79.0"
- xhr "^2.3.3"
-
-set-blocking@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
- integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
-
-set-immediate-shim@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
- integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
-
-setimmediate@1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f"
- integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=
-
-setimmediate@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
- integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
-
-setprototypeof@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
- integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
-
-sha.js@^2.4.0, sha.js@^2.4.8:
- version "2.4.11"
- resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
- integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-sha3@^1.2.2:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.3.tgz#ed5958fa8331df1b1b8529ca9fdf225a340c5418"
- integrity sha512-sOWDZi8cDBRkLfWOw18wvJyNblXDHzwMGnRWut8zNNeIeLnmMRO17bjpLc7OzMuj1ASUgx2IyohzUCAl+Kx5vA==
- dependencies:
- nan "2.13.2"
-
-shebang-command@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
- dependencies:
- shebang-regex "^1.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 sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
-
-shelljs@^0.8.3:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097"
- integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==
- dependencies:
- glob "^7.0.0"
- interpret "^1.0.0"
- rechoir "^0.6.2"
-
-signal-exit@^3.0.0, signal-exit@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
- integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
-
-simple-concat@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
- integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
-
-simple-get@^2.7.0:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
- integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
- dependencies:
- decompress-response "^3.3.0"
- once "^1.3.1"
- simple-concat "^1.0.0"
-
-sisteransi@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb"
- integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==
-
-slash@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
- integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
-
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
- dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
-
-smart-buffer@4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d"
- integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==
-
-socks-proxy-agent@^4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386"
- integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==
- dependencies:
- agent-base "~4.2.1"
- socks "~2.3.2"
-
-socks@~2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e"
- integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==
- dependencies:
- ip "^1.1.5"
- smart-buffer "4.0.2"
-
-sol-explore@^1.6.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/sol-explore/-/sol-explore-1.6.2.tgz#43ae8c419fd3ac056a05f8a9d1fb1022cd41ecc2"
- integrity sha1-Q66MQZ/TrAVqBfip0fsQIs1B7MI=
-
-solhint@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/solhint/-/solhint-2.3.0.tgz#810ef6427c7a6bd2ef1c31f6024ac79c1954d346"
- integrity sha512-2yiELLp+MsDtuOTrjc14lgsYmlMchp++SicvqCBu01VXsi9Mk2uynhyN3nBfbGzYq1YfmOEBpUqJfFYXVAR/Ig==
- dependencies:
- ajv "^6.6.1"
- antlr4 "4.7.1"
- chalk "^2.4.2"
- commander "2.18.0"
- cosmiconfig "^5.0.7"
- eslint "^5.6.0"
- fast-diff "^1.1.2"
- glob "^7.1.3"
- ignore "^4.0.6"
- js-yaml "^3.12.0"
- lodash "^4.17.11"
- semver "^6.3.0"
- optionalDependencies:
- prettier "^1.14.3"
-
-solidity-coverage@^0.6.7:
- version "0.6.7"
- resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.6.7.tgz#8ccd5e6d4d4ecc8cc59baf3656a869762d73c079"
- integrity sha512-Ga0Er5b25sFhy1uaYrQ+jQisP9819nj3zP1pfyAfE8Skg+/OBQ+Ev3sOmYQy9qZMjDuFJ7PCjuFVXdqdBO3cZw==
- dependencies:
- death "^1.1.0"
- ethereumjs-testrpc-sc "6.5.1-sc.1"
- istanbul "^0.4.5"
- keccakjs "^0.2.1"
- req-cwd "^1.0.1"
- shelljs "^0.8.3"
- sol-explore "^1.6.2"
- solidity-parser-antlr "0.4.7"
- tree-kill "^1.2.0"
- web3 "1.2.1"
- web3-eth-abi "1.0.0-beta.55"
-
-solidity-parser-antlr@0.4.7:
- version "0.4.7"
- resolved "https://registry.yarnpkg.com/solidity-parser-antlr/-/solidity-parser-antlr-0.4.7.tgz#8e18867c95a956958ed008371e43f9e571dee6af"
- integrity sha512-iVjNhgqkXw+o+0E+xoLcji+3KuXLe8Rm8omUuVGhsV14+ZsTwQ70nhBRXg8O3t9xwdS0iST1q9NJ5IqHnqpWkA==
- dependencies:
- npm-check-updates "^3.1.11"
-
-source-map-support@0.5.12:
- version "0.5.12"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
- integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
-source-map-support@^0.4.15:
- version "0.4.18"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
- integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
- dependencies:
- source-map "^0.5.6"
-
-source-map@^0.5.6, source-map@^0.5.7:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
- integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
-
-source-map@^0.6.0, 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.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
- integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50=
- dependencies:
- amdefine ">=0.0.4"
-
-spawn-please@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/spawn-please/-/spawn-please-0.3.0.tgz#db338ec4cff63abc69f1d0e08cee9eb8bebd9d11"
- integrity sha1-2zOOxM/2Orxp8dDgjO6euL69nRE=
-
-spdx-correct@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
- integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
- dependencies:
- spdx-expression-parse "^3.0.0"
- spdx-license-ids "^3.0.0"
-
-spdx-exceptions@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
- integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
-
-spdx-expression-parse@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
- integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
- dependencies:
- spdx-exceptions "^2.1.0"
- spdx-license-ids "^3.0.0"
-
-spdx-license-ids@^3.0.0:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
- integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-
-sshpk@^1.7.0:
- version "1.16.1"
- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
- integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
- dependencies:
- asn1 "~0.2.3"
- assert-plus "^1.0.0"
- bcrypt-pbkdf "^1.0.0"
- dashdash "^1.12.0"
- ecc-jsbn "~0.1.1"
- getpass "^0.1.1"
- jsbn "~0.1.0"
- safer-buffer "^2.0.2"
- tweetnacl "~0.14.0"
-
-ssri@^6.0.0, ssri@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
- integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
- dependencies:
- figgy-pudding "^3.5.1"
-
-standard-engine@^12.0.0:
- version "12.0.0"
- resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-12.0.0.tgz#1643dceba96ca9c04c535a1fb28d79bfb21b3572"
- integrity sha512-gJIIRb0LpL7AHyGbN9+hJ4UJns37lxmNTnMGRLC8CFrzQ+oB/K60IQjKNgPBCB2VP60Ypm6f8DFXvhVWdBOO+g==
- dependencies:
- deglob "^4.0.0"
- get-stdin "^7.0.0"
- minimist "^1.1.0"
- pkg-conf "^3.1.0"
-
-standard@^14.0.2:
- version "14.0.2"
- resolved "https://registry.yarnpkg.com/standard/-/standard-14.0.2.tgz#840d70f3f202981fd1719066b4ec75e21e167144"
- integrity sha512-2Rjsc+B1zaXiQVfUlH7n+ZIrCpxxAaVEItps2lBQUQLuyCH/Vc788w6q16PMK4ezPA61jm8A1vzBnBwcokGOgQ==
- dependencies:
- eslint "~6.1.0"
- eslint-config-standard "14.0.1"
- eslint-config-standard-jsx "8.0.1"
- eslint-plugin-import "~2.18.0"
- eslint-plugin-node "~9.1.0"
- eslint-plugin-promise "~4.2.1"
- eslint-plugin-react "~7.14.2"
- eslint-plugin-standard "~4.0.0"
- funding "^1.0.0"
- standard-engine "^12.0.0"
-
-"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
- integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
-
-stream-each@^1.1.0:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
- integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
- dependencies:
- end-of-stream "^1.1.0"
- stream-shift "^1.0.0"
-
-stream-shift@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
- integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
-
-stream-to-pull-stream@^1.7.1:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece"
- integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==
- dependencies:
- looper "^3.0.0"
- pull-stream "^3.2.3"
-
-strict-uri-encode@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
- integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
-
-string-width@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
- integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
- dependencies:
- code-point-at "^1.0.0"
- is-fullwidth-code-point "^1.0.0"
- strip-ansi "^3.0.0"
-
-"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, 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@^3.0.0, string-width@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
- integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
- dependencies:
- emoji-regex "^7.0.1"
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^5.1.0"
-
-string-width@^4.1.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
- integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.0"
-
-string.prototype.trim@^1.1.2:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d"
- integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==
- dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.13.0"
- function-bind "^1.1.1"
-
-string.prototype.trim@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"
- integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=
- dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.5.0"
- function-bind "^1.0.2"
-
-string.prototype.trimleft@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634"
- integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==
- dependencies:
- define-properties "^1.1.3"
- function-bind "^1.1.1"
-
-string.prototype.trimright@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58"
- integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==
- dependencies:
- define-properties "^1.1.3"
- function-bind "^1.1.1"
-
-string_decoder@~0.10.x:
- version "0.10.31"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
- integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-
-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@^3.0.0, strip-ansi@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
- integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
- dependencies:
- ansi-regex "^2.0.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 sha1-qEeQIusaw2iocTibY1JixQXuNo8=
- dependencies:
- ansi-regex "^3.0.0"
-
-strip-ansi@^5.0.0, strip-ansi@^5.1.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:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
- dependencies:
- ansi-regex "^5.0.0"
-
-strip-bom@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
- integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
-
-strip-dirs@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
- integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
- dependencies:
- is-natural-number "^4.0.1"
-
-strip-eof@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
- integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
-
-strip-hex-prefix@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
- integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
- dependencies:
- is-hex-prefixed "1.0.0"
-
-strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
- integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
-
-strip-json-comments@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
- integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
-
-supports-color@4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e"
- integrity sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==
- dependencies:
- has-flag "^2.0.0"
-
-supports-color@5.4.0:
- version "5.4.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
- integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a"
- integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
- integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-
-supports-color@^3.1.0:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
- integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
- dependencies:
- has-flag "^1.0.0"
-
-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"
-
-swarm-js@0.1.39:
- version "0.1.39"
- resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.39.tgz#79becb07f291d4b2a178c50fee7aa6e10342c0e8"
- integrity sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==
- dependencies:
- bluebird "^3.5.0"
- buffer "^5.0.5"
- decompress "^4.0.0"
- eth-lib "^0.1.26"
- fs-extra "^4.0.2"
- got "^7.1.0"
- mime-types "^2.1.16"
- mkdirp-promise "^5.0.1"
- mock-fs "^4.1.0"
- setimmediate "^1.0.5"
- tar "^4.0.2"
- xhr-request-promise "^0.1.2"
-
-table@^5.2.3:
- version "5.4.6"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
- integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
- dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
-
-tape@^4.6.3, tape@^4.8.0:
- version "4.11.0"
- resolved "https://registry.yarnpkg.com/tape/-/tape-4.11.0.tgz#63d41accd95e45a23a874473051c57fdbc58edc1"
- integrity sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==
- dependencies:
- deep-equal "~1.0.1"
- defined "~1.0.0"
- for-each "~0.3.3"
- function-bind "~1.1.1"
- glob "~7.1.4"
- has "~1.0.3"
- inherits "~2.0.4"
- minimist "~1.2.0"
- object-inspect "~1.6.0"
- resolve "~1.11.1"
- resumer "~0.0.0"
- string.prototype.trim "~1.1.2"
- through "~2.3.8"
-
-tar-stream@^1.5.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
- integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
- dependencies:
- bl "^1.0.0"
- buffer-alloc "^1.2.0"
- end-of-stream "^1.0.0"
- fs-constants "^1.0.0"
- readable-stream "^2.3.0"
- to-buffer "^1.1.1"
- xtend "^4.0.0"
-
-tar@^4.0.2:
- version "4.4.10"
- resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1"
- integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==
- dependencies:
- chownr "^1.1.1"
- fs-minipass "^1.2.5"
- minipass "^2.3.5"
- minizlib "^1.2.1"
- mkdirp "^0.5.0"
- safe-buffer "^5.1.2"
- yallist "^3.0.3"
-
-tar@^4.4.10:
- version "4.4.13"
- resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
- integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
- dependencies:
- chownr "^1.1.1"
- fs-minipass "^1.2.5"
- minipass "^2.8.6"
- minizlib "^1.2.1"
- mkdirp "^0.5.0"
- safe-buffer "^5.1.2"
- yallist "^3.0.3"
-
-term-size@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
- integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
- dependencies:
- execa "^0.7.0"
-
-term-size@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.1.0.tgz#3aec444c07a7cf936e157c1dc224b590c3c7eef2"
- integrity sha512-I42EWhJ+2aeNQawGx1VtpO0DFI9YcfuvAMNIdKyf/6sRbHJ4P+ZQ/zIT87tE+ln1ymAGcCJds4dolfSAS0AcNg==
-
-text-table@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
- integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
-
-through2@^2.0.0, through2@^2.0.3:
- 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"
-
-"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
- integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-
-timed-out@^4.0.0, timed-out@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
- integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
-
-tmp@0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
- integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
+ integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
dependencies:
- rimraf "^2.6.3"
+ mimic-fn "^2.1.0"
-tmp@^0.0.33:
- version "0.0.33"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
- integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+onetime@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
+ integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
dependencies:
- os-tmpdir "~1.0.2"
-
-to-buffer@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
- integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+ mimic-fn "^4.0.0"
-to-fast-properties@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
- integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
-
-to-readable-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
- integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
-
-toidentifier@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
- integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-tough-cookie@~2.4.3:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
- integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
+p-limit@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644"
+ integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==
dependencies:
- psl "^1.1.24"
- punycode "^1.4.1"
+ yocto-queue "^1.0.0"
-tree-kill@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a"
- integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==
+p-locate@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f"
+ integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==
+ dependencies:
+ p-limit "^4.0.0"
-trim-right@^1.0.1:
+parent-module@^1.0.0:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
- integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
-
-truffle-assertions@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/truffle-assertions/-/truffle-assertions-0.9.1.tgz#74379a208f1175d6de9f33fba9a8cbb3aec27aa5"
- integrity sha512-MtcyXMTzRfg8WfE3TfrbVJm9HWMTPFksWg0K/8ZhajaxzFyPJ56/9AzNjQCROQluI0X1vs6XDsegwMlT1UFUNw==
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
dependencies:
- assertion-error "^1.1.0"
- lodash.isequal "^4.5.0"
+ callsites "^3.0.0"
-truffle@^5.0.41:
- version "5.0.41"
- resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.0.41.tgz#a7ef0b6e97d3a22aaf5da2cc4ef6a13f39596ffb"
- integrity sha512-vQm7OHRN8qh4Te3QZ9A74JsDoZfcYoJLuI1FrcLpJoicdTrzCZU4UXGIYFUIZ+UmOTlMS07lUufxDSraSHxpdg==
+parse-json@^5.2.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:
- app-module-path "^2.2.0"
- mocha "5.2.0"
- original-require "1.0.1"
+ "@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"
+
+parse-passwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+ integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==
-tslib@^1.9.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
- integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+path-exists@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7"
+ integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==
-tunnel-agent@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
- integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
- dependencies:
- safe-buffer "^5.0.1"
+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==
-tweetnacl-util@^0.15.0:
- version "0.15.0"
- resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.0.tgz#4576c1cee5e2d63d207fee52f1ba02819480bc75"
- integrity sha1-RXbBzuXi1j0gf+5S8boCgZSAvHU=
+path-key@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
+ integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
-tweetnacl@^0.14.3, tweetnacl@~0.14.0:
- version "0.14.5"
- resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
- integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+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==
-tweetnacl@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.1.tgz#2594d42da73cd036bd0d2a54683dd35a6b55ca17"
- integrity sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-type-check@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
- integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
- dependencies:
- prelude-ls "~1.1.2"
+pidtree@0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c"
+ integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==
-type-detect@^4.0.0, type-detect@^4.0.5:
- 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==
+pluralize@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
-type-fest@^0.3.0:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
- integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==
+possible-typed-array-names@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
+ integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
-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==
+prettier@^2.8.3:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+ integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
-type-is@~1.6.17, type-is@~1.6.18:
- version "1.6.18"
- resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
- integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
- dependencies:
- media-typer "0.3.0"
- mime-types "~2.1.24"
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
-type@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/type/-/type-1.0.3.tgz#16f5d39f27a2d28d86e48f8981859e9d3296c179"
- integrity sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-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"
+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==
-typedarray@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
- integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-typewise-core@^1.2, typewise-core@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195"
- integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=
+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==
-typewise@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651"
- integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=
+resolve-dir@^1.0.0, resolve-dir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+ integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==
dependencies:
- typewise-core "^1.2.0"
+ expand-tilde "^2.0.0"
+ global-modules "^1.0.0"
-typewiselite@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e"
- integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4=
+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==
-uglify-js@^3.1.4:
- version "3.9.3"
- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.3.tgz#4a285d1658b8a2ebaef9e51366b3a0f7acd79ec2"
- integrity sha512-r5ImcL6QyzQGVimQoov3aL2ZScywrOgBXGndbWrdehKoSvGe/RmiE5Jpw/v+GvxODt6l2tpBXwA7n+qZVlHBMA==
+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==
+
+restore-cursor@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9"
+ integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==
dependencies:
- commander "~2.20.3"
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
-ultron@~1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
- integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+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==
-unbzip2-stream@^1.0.9:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a"
- integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==
+rfdc@^1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
+ integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
+
+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:
- buffer "^5.2.1"
- through "^2.3.8"
+ queue-microtask "^1.2.2"
-underscore@1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
- integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+semver@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-uniq@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
- integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+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==
-unique-filename@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
- integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+semver@^7.6.0:
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
+ integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
dependencies:
- unique-slug "^2.0.0"
+ lru-cache "^6.0.0"
-unique-slug@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
- integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
dependencies:
- imurmurhash "^0.1.4"
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
-unique-string@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
- integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
+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:
- crypto-random-string "^1.0.0"
+ shebang-regex "^3.0.0"
-universalify@^0.1.0:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
- integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
-
-unorm@^1.3.3:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
- integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+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==
-unpipe@1.0.0, unpipe@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
- integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+signal-exit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+ integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
-update-notifier@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.1.tgz#78ecb68b915e2fd1be9f767f6e298ce87b736250"
- integrity sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==
- dependencies:
- boxen "^3.0.0"
- chalk "^2.0.1"
- configstore "^4.0.0"
- has-yarn "^2.1.0"
- import-lazy "^2.1.0"
- is-ci "^2.0.0"
- is-installed-globally "^0.1.0"
- is-npm "^3.0.0"
- is-yarn-global "^0.3.0"
- latest-version "^5.0.0"
- semver-diff "^2.0.0"
- xdg-basedir "^3.0.0"
+signal-exit@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
-uri-js@^4.2.2:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
- integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
- dependencies:
- punycode "^2.1.0"
+slash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
+ integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
-url-parse-lax@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
- integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+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:
- prepend-http "^1.0.1"
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
-url-parse-lax@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
- integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+slice-ansi@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a"
+ integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
dependencies:
- prepend-http "^2.0.0"
-
-url-set-query@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
- integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
-
-url-to-options@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
- integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+ ansi-styles "^6.0.0"
+ is-fullwidth-code-point "^4.0.0"
-utf8@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.1.tgz#2e01db02f7d8d0944f77104f1609eb0c304cf768"
- integrity sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=
+slice-ansi@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9"
+ integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==
+ dependencies:
+ ansi-styles "^6.2.1"
+ is-fullwidth-code-point "^5.0.0"
+
+solc-typed-ast@18.1.2:
+ version "18.1.2"
+ resolved "https://registry.yarnpkg.com/solc-typed-ast/-/solc-typed-ast-18.1.2.tgz#bc958fe3aead765cf6c2e06ce3d53c61fd06e70c"
+ integrity sha512-57IKzvXHcyjqdjHEdX7NQuWkPALlH8V4eJ6UUehWrzgHDVzKVOCFplwgLDRnOZ8kDMO8+Ms8sQhfrivFK+v5FA==
+ dependencies:
+ axios "^1.6.7"
+ commander "^12.0.0"
+ decimal.js "^10.4.3"
+ findup-sync "^5.0.0"
+ fs-extra "^11.2.0"
+ jsel "^1.1.6"
+ semver "^7.6.0"
+ solc "0.8.24"
+ src-location "^1.1.0"
+ web3-eth-abi "^4.2.0"
+
+solc-typed-ast@18.1.3:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/solc-typed-ast/-/solc-typed-ast-18.1.3.tgz#243cc0c5a4f701445ac10341224bf8c18a6ed252"
+ integrity sha512-11iBtavJJtkzrmQdlAiZ7sz3C3WOQ8MaN7+r4b9C6B/3ORqg4oTUW5/ANyGyus5ppXDXzPyT90BYCfP73df3HA==
+ dependencies:
+ axios "^1.6.8"
+ commander "^12.0.0"
+ decimal.js "^10.4.3"
+ findup-sync "^5.0.0"
+ fs-extra "^11.2.0"
+ jsel "^1.1.6"
+ semver "^7.6.0"
+ solc "0.8.25"
+ src-location "^1.1.0"
+ web3-eth-abi "^4.2.0"
+
+solc@0.8.24:
+ version "0.8.24"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.24.tgz#6e5693d28208d00a20ff2bdabc1dec85a5329bbb"
+ integrity sha512-G5yUqjTUPc8Np74sCFwfsevhBPlUifUOfhYrgyu6CmYlC6feSw0YS6eZW47XDT23k3JYdKx5nJ+Q7whCEmNcoA==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "^8.1.0"
+ follow-redirects "^1.12.1"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solc@0.8.25:
+ version "0.8.25"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.25.tgz#393f3101617388fb4ba2a58c5b03ab02678e375c"
+ integrity sha512-7P0TF8gPeudl1Ko3RGkyY6XVCxe2SdD/qQhtns1vl3yAbK/PDifKDLHGtx1t7mX3LgR7ojV7Fg/Kc6Q9D2T8UQ==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "^8.1.0"
+ follow-redirects "^1.12.1"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+"solhint@github:solhint-community/solhint-community#v4.0.0-rc01":
+ version "4.0.0-rc01"
+ resolved "https://codeload.github.com/solhint-community/solhint-community/tar.gz/b04088d3d2bb6ceb8c9bf77783e71195d19fb653"
+ dependencies:
+ "@solidity-parser/parser" "^0.16.0"
+ ajv "^6.12.6"
+ antlr4 "^4.11.0"
+ ast-parents "^0.0.1"
+ chalk "^4.1.2"
+ commander "^11.1.0"
+ cosmiconfig "^8.0.0"
+ fast-diff "^1.2.0"
+ glob "^8.0.3"
+ ignore "^5.2.4"
+ js-yaml "^4.1.0"
+ lodash "^4.17.21"
+ pluralize "^8.0.0"
+ semver "^6.3.0"
+ strip-ansi "^6.0.1"
+ table "^6.8.1"
+ text-table "^0.2.0"
+ optionalDependencies:
+ prettier "^2.8.3"
-utf8@3.0.0, utf8@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
- integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+"solmate@github:transmissions11/solmate#c892309":
+ version "6.2.0"
+ resolved "https://codeload.github.com/transmissions11/solmate/tar.gz/c892309933b25c03d32b1b0d674df7ae292ba925"
-util-deprecate@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+sort-object-keys@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45"
+ integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==
-utils-merge@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
- integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+sort-package-json@2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.10.0.tgz#6be07424bf3b7db9fbb1bdd69e7945f301026d8a"
+ integrity sha512-MYecfvObMwJjjJskhxYfuOADkXp1ZMMnCFC8yhp+9HDsk7HhR336hd7eiBs96lTXfiqmUNI+WQCeCMRBhl251g==
+ dependencies:
+ detect-indent "^7.0.1"
+ detect-newline "^4.0.0"
+ get-stdin "^9.0.0"
+ git-hooks-list "^3.0.0"
+ globby "^13.1.2"
+ is-plain-obj "^4.1.0"
+ semver "^7.6.0"
+ sort-object-keys "^1.1.3"
+
+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==
-uuid@2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac"
- integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=
+split2@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
+ integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==
-uuid@3.3.2, uuid@^3.3.2:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
- integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+src-location@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/src-location/-/src-location-1.1.0.tgz#3f50eeb0c7169432e55b426be6e3a68ebba16218"
+ integrity sha512-idBVZgLZGzB3B2Et317AFDQto7yRgp1tOuFd+VKIH2dw1jO1b6p07zNjtQoVhkW+CY6oGTp9Y5UIfbJoZRsoFQ==
-v8-compile-cache@^2.0.3:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
- integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
+string-argv@0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6"
+ integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==
-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==
+string-width@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
dependencies:
- spdx-correct "^3.0.0"
- spdx-expression-parse "^3.0.0"
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
-validate-npm-package-name@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
- integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
+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:
- builtins "^1.0.3"
-
-vary@^1, vary@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
- integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
-
-verror@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
- integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
- dependencies:
- assert-plus "^1.0.0"
- core-util-is "1.0.2"
- extsprintf "^1.2.0"
-
-web3-bzz@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.1.tgz#c3bd1e8f0c02a13cd6d4e3c3e9e1713f144f6f0d"
- integrity sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw==
- dependencies:
- got "9.6.0"
- swarm-js "0.1.39"
- underscore "1.9.1"
-
-web3-core-helpers@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d"
- integrity sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw==
- dependencies:
- underscore "1.9.1"
- web3-eth-iban "1.2.1"
- web3-utils "1.2.1"
-
-web3-core-method@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a"
- integrity sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ==
- dependencies:
- underscore "1.9.1"
- web3-core-helpers "1.2.1"
- web3-core-promievent "1.2.1"
- web3-core-subscriptions "1.2.1"
- web3-utils "1.2.1"
-
-web3-core-promievent@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838"
- integrity sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw==
- dependencies:
- any-promise "1.3.0"
- eventemitter3 "3.1.2"
-
-web3-core-requestmanager@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d"
- integrity sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg==
- dependencies:
- underscore "1.9.1"
- web3-core-helpers "1.2.1"
- web3-providers-http "1.2.1"
- web3-providers-ipc "1.2.1"
- web3-providers-ws "1.2.1"
-
-web3-core-subscriptions@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099"
- integrity sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g==
- dependencies:
- eventemitter3 "3.1.2"
- underscore "1.9.1"
- web3-core-helpers "1.2.1"
-
-web3-core@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9"
- integrity sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg==
- dependencies:
- web3-core-helpers "1.2.1"
- web3-core-method "1.2.1"
- web3-core-requestmanager "1.2.1"
- web3-utils "1.2.1"
-
-web3-eth-abi@1.0.0-beta.55:
- version "1.0.0-beta.55"
- resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.55.tgz#69250420039346105a3d0f899c0a8a53be926f97"
- integrity sha512-3h1xnm/vYmKUXTOYAOP0OsB5uijQV76pNNRGKOB6Dq6GR1pbcbD3WrB/4I643YA8l91t5FRzFzUiA3S77R2iqw==
- dependencies:
- "@babel/runtime" "^7.3.1"
- ethers "^4.0.27"
- lodash "^4.17.11"
- web3-utils "1.0.0-beta.55"
-
-web3-eth-abi@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689"
- integrity sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g==
- dependencies:
- ethers "4.0.0-beta.3"
- underscore "1.9.1"
- web3-utils "1.2.1"
-
-web3-eth-accounts@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf"
- integrity sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ==
- dependencies:
- any-promise "1.3.0"
- crypto-browserify "3.12.0"
- eth-lib "0.2.7"
- scryptsy "2.1.0"
- semver "6.2.0"
- underscore "1.9.1"
- uuid "3.3.2"
- web3-core "1.2.1"
- web3-core-helpers "1.2.1"
- web3-core-method "1.2.1"
- web3-utils "1.2.1"
-
-web3-eth-contract@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4"
- integrity sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g==
- dependencies:
- underscore "1.9.1"
- web3-core "1.2.1"
- web3-core-helpers "1.2.1"
- web3-core-method "1.2.1"
- web3-core-promievent "1.2.1"
- web3-core-subscriptions "1.2.1"
- web3-eth-abi "1.2.1"
- web3-utils "1.2.1"
-
-web3-eth-ens@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5"
- integrity sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q==
- dependencies:
- eth-ens-namehash "2.0.8"
- underscore "1.9.1"
- web3-core "1.2.1"
- web3-core-helpers "1.2.1"
- web3-core-promievent "1.2.1"
- web3-eth-abi "1.2.1"
- web3-eth-contract "1.2.1"
- web3-utils "1.2.1"
-
-web3-eth-iban@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880"
- integrity sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ==
- dependencies:
- bn.js "4.11.8"
- web3-utils "1.2.1"
-
-web3-eth-personal@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf"
- integrity sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg==
- dependencies:
- web3-core "1.2.1"
- web3-core-helpers "1.2.1"
- web3-core-method "1.2.1"
- web3-net "1.2.1"
- web3-utils "1.2.1"
-
-web3-eth@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0"
- integrity sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA==
- dependencies:
- underscore "1.9.1"
- web3-core "1.2.1"
- web3-core-helpers "1.2.1"
- web3-core-method "1.2.1"
- web3-core-subscriptions "1.2.1"
- web3-eth-abi "1.2.1"
- web3-eth-accounts "1.2.1"
- web3-eth-contract "1.2.1"
- web3-eth-ens "1.2.1"
- web3-eth-iban "1.2.1"
- web3-eth-personal "1.2.1"
- web3-net "1.2.1"
- web3-utils "1.2.1"
-
-web3-net@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10"
- integrity sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw==
- dependencies:
- web3-core "1.2.1"
- web3-core-method "1.2.1"
- web3-utils "1.2.1"
-
-web3-provider-engine@14.2.0:
- version "14.2.0"
- resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.0.tgz#2efec157b2c429c5c674c079aea96b0a06de8b3d"
- integrity sha512-sfLH5VhGjJrJJT5WcF8aGehcIKRUQ553q9tjQkkLaKU2AaLsRcwffnnWvrgeTkmKSf0y9dwkDTa48RVp+GUCSg==
- dependencies:
- async "^2.5.0"
- backoff "^2.5.0"
- clone "^2.0.0"
- cross-fetch "^2.1.0"
- eth-block-tracker "^3.0.0"
- eth-json-rpc-infura "^3.1.0"
- eth-sig-util "^1.4.2"
- ethereumjs-block "^1.2.2"
- ethereumjs-tx "^1.2.0"
- ethereumjs-util "^5.1.5"
- ethereumjs-vm "^2.3.4"
- json-rpc-error "^2.0.0"
- json-stable-stringify "^1.0.1"
- promise-to-callback "^1.0.0"
- readable-stream "^2.2.9"
- request "^2.85.0"
- semaphore "^1.0.3"
- ws "^5.1.1"
- xhr "^2.2.0"
- xtend "^4.0.1"
-
-web3-providers-http@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.1.tgz#c93ea003a42e7b894556f7e19dd3540f947f5013"
- integrity sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ==
- dependencies:
- web3-core-helpers "1.2.1"
- xhr2-cookies "1.1.0"
-
-web3-providers-ipc@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c"
- integrity sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA==
- dependencies:
- oboe "2.1.4"
- underscore "1.9.1"
- web3-core-helpers "1.2.1"
-
-web3-providers-ws@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb"
- integrity sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA==
- dependencies:
- underscore "1.9.1"
- web3-core-helpers "1.2.1"
- websocket "github:web3-js/WebSocket-Node#polyfill/globalThis"
-
-web3-shh@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c"
- integrity sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA==
- dependencies:
- web3-core "1.2.1"
- web3-core-method "1.2.1"
- web3-core-subscriptions "1.2.1"
- web3-net "1.2.1"
-
-web3-utils@1.0.0-beta.55:
- version "1.0.0-beta.55"
- resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.55.tgz#beb40926b7c04208b752d36a9bc959d27a04b308"
- integrity sha512-ASWqUi8gtWK02Tp8ZtcoAbHenMpQXNvHrakgzvqTNNZn26wgpv+Q4mdPi0KOR6ZgHFL8R/9b5BBoUTglS1WPpg==
- dependencies:
- "@babel/runtime" "^7.3.1"
- "@types/bn.js" "^4.11.4"
- "@types/node" "^10.12.18"
- bn.js "4.11.8"
- eth-lib "0.2.8"
- ethjs-unit "^0.1.6"
- lodash "^4.17.11"
- number-to-bn "1.7.0"
- randombytes "^2.1.0"
- utf8 "2.1.1"
-
-web3-utils@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534"
- integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA==
- dependencies:
- bn.js "4.11.8"
- eth-lib "0.2.7"
- ethjs-unit "0.1.6"
- number-to-bn "1.7.0"
- randomhex "0.1.5"
- underscore "1.9.1"
- utf8 "3.0.0"
-
-web3@1.2.1, web3@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b"
- integrity sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==
- dependencies:
- web3-bzz "1.2.1"
- web3-core "1.2.1"
- web3-eth "1.2.1"
- web3-eth-personal "1.2.1"
- web3-net "1.2.1"
- web3-shh "1.2.1"
- web3-utils "1.2.1"
-
-websocket@1.0.29, "websocket@github:web3-js/WebSocket-Node#polyfill/globalThis":
- version "1.0.29"
- resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/b134a75541b5db59668df81c03e926cd5f325077"
- dependencies:
- debug "^2.2.0"
- es5-ext "^0.10.50"
- nan "^2.14.0"
- typedarray-to-buffer "^3.1.5"
- yaeti "^0.0.6"
-
-whatwg-fetch@2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
- integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
-which-module@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
- integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+string-width@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a"
+ integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==
+ dependencies:
+ emoji-regex "^10.3.0"
+ get-east-asian-width "^1.0.0"
+ strip-ansi "^7.1.0"
-which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
dependencies:
- isexe "^2.0.0"
+ ansi-regex "^5.0.0"
-wide-align@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
- integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+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:
- string-width "^1.0.2 || 2"
+ ansi-regex "^5.0.1"
-widest-line@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
- integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
+strip-ansi@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
dependencies:
- string-width "^2.1.1"
+ ansi-regex "^6.0.1"
-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==
+strip-final-newline@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
+ integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
-wordwrap@^1.0.0, wordwrap@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
- integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+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"
-wrap-ansi@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
- integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+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:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
+ has-flag "^4.0.0"
-wrap-ansi@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
- integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+table@^6.8.1:
+ version "6.8.2"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58"
+ integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==
dependencies:
- ansi-styles "^3.2.0"
- string-width "^3.0.0"
- strip-ansi "^5.0.0"
+ ajv "^8.0.1"
+ lodash.truncate "^4.4.2"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+text-extensions@^2.0.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34"
+ integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==
-write-file-atomic@^2.0.0:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
- integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
- dependencies:
- graceful-fs "^4.1.11"
- imurmurhash "^0.1.4"
- signal-exit "^3.0.2"
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
- dependencies:
- mkdirp "^0.5.1"
+"through@>=2.2.7 <3":
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-ws@^3.0.0:
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
- integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+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:
- async-limiter "~1.0.0"
- safe-buffer "~5.1.0"
- ultron "~1.1.0"
+ os-tmpdir "~1.0.2"
-ws@^5.1.1:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
- integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==
+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:
- async-limiter "~1.0.0"
+ is-number "^7.0.0"
-xdg-basedir@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
- integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
+uglify-js@^3.1.4:
+ version "3.17.4"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c"
+ integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==
-xhr-request-promise@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz#343c44d1ee7726b8648069682d0f840c83b4261d"
- integrity sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=
- dependencies:
- xhr-request "^1.0.1"
+unicorn-magic@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4"
+ integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==
-xhr-request@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
- integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
- dependencies:
- buffer-to-arraybuffer "^0.0.5"
- object-assign "^4.1.1"
- query-string "^5.0.1"
- simple-get "^2.7.0"
- timed-out "^4.0.1"
- url-set-query "^1.0.0"
- xhr "^2.0.4"
-
-xhr2-cookies@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48"
- integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=
- dependencies:
- cookiejar "^2.1.1"
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
-xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd"
- integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==
+uri-js@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
dependencies:
- global "~4.3.0"
- is-function "^1.0.1"
- parse-headers "^2.0.0"
- xtend "^4.0.0"
+ punycode "^2.1.0"
-xml2js@0.4.19:
- version "0.4.19"
- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
- integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
+util@^0.12.5:
+ version "0.12.5"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc"
+ integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==
dependencies:
- sax ">=0.6.0"
- xmlbuilder "~9.0.1"
+ inherits "^2.0.3"
+ is-arguments "^1.0.4"
+ is-generator-function "^1.0.7"
+ is-typed-array "^1.1.3"
+ which-typed-array "^1.1.2"
-xmlbuilder@~9.0.1:
- version "9.0.7"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
- integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
+web3-errors@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/web3-errors/-/web3-errors-1.1.4.tgz#5667a0a5f66fc936e101ef32032ccc1e8ca4d5a1"
+ integrity sha512-WahtszSqILez+83AxGecVroyZsMuuRT+KmQp4Si5P4Rnqbczno1k748PCrZTS1J4UCPmXMG2/Vt+0Bz2zwXkwQ==
+ dependencies:
+ web3-types "^1.3.1"
-xmlhttprequest@1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"
- integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=
+web3-eth-abi@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-4.2.1.tgz#b1260dace8380221f12f4274af240c1dfed1045c"
+ integrity sha512-IE91WUhhiDpBtbkl/DHUoZz7z7T5FXvl3zPLkrxT+dNlOT+wni+US/67jQCLvJRbqf9ApQ26lVYry0bovFgyqA==
+ dependencies:
+ abitype "0.7.1"
+ web3-errors "^1.1.4"
+ web3-types "^1.6.0"
+ web3-utils "^4.2.3"
+ web3-validator "^2.0.5"
-xtend@^4.0.0, xtend@^4.0.1, 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==
+web3-types@^1.3.1, web3-types@^1.5.0, web3-types@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/web3-types/-/web3-types-1.6.0.tgz#ebe7f140c31f7cc0ad15f238ad7e7ac72797ff3b"
+ integrity sha512-qgOtADqlD5hw+KPKBUGaXAcdNLL0oh6qTeVgXwewCfbL/lG9R+/GrgMQB1gbTJ3cit8hMwtH8KX2Em6OwO0HRw==
-xtend@~2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
- integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+web3-utils@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-4.2.3.tgz#e1d30c4b087cd95f4307baeb80e3160f174e1cfd"
+ integrity sha512-m5plKTC2YtQntHITQRyIePw52UVP1IrShhmA2FACtn4zmc5ADmrXOlQWiPzxFP/18eRJsAaUAw2+CQn1u4WPxQ==
dependencies:
- object-keys "~0.4.0"
+ ethereum-cryptography "^2.0.0"
+ eventemitter3 "^5.0.1"
+ web3-errors "^1.1.4"
+ web3-types "^1.6.0"
+ web3-validator "^2.0.5"
-"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
- integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+web3-validator@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/web3-validator/-/web3-validator-2.0.5.tgz#de1984bdb34f292251b86400dba7169700db0849"
+ integrity sha512-2gLOSW8XqEN5pw5jVUm20EB7A8SbQiekpAtiI0JBmCIV0a2rp97v8FgWY5E3UEqnw5WFfEqvcDVW92EyynDTyQ==
+ dependencies:
+ ethereum-cryptography "^2.0.0"
+ util "^0.12.5"
+ web3-errors "^1.1.4"
+ web3-types "^1.5.0"
+ zod "^3.21.4"
+
+which-typed-array@^1.1.14, which-typed-array@^1.1.2:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
+ integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.2"
-yaeti@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
- integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+which@^1.2.14:
+ 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"
-yallist@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
- integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+which@^2.0.1:
+ 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"
-yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
- integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
+wordwrap@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
-yargs-parser@13.0.0:
- version "13.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b"
- integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==
+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:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
-yargs-parser@^11.1.1:
- version "11.1.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
- integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
+wrap-ansi@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e"
+ integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==
dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
+ ansi-styles "^6.2.1"
+ string-width "^7.0.0"
+ strip-ansi "^7.1.0"
-yargs-parser@^13.0.0, yargs-parser@^13.1.0:
- version "13.1.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
- integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-yargs-unparser@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d"
- integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==
- dependencies:
- flat "^4.1.0"
- lodash "^4.17.11"
- yargs "^12.0.5"
+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==
-yargs@13.2.2:
- version "13.2.2"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993"
- integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==
- dependencies:
- cliui "^4.0.0"
- find-up "^3.0.0"
- get-caller-file "^2.0.1"
- os-locale "^3.1.0"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^3.0.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^13.0.0"
-
-yargs@13.2.4:
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83"
- integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==
- dependencies:
- cliui "^5.0.0"
- find-up "^3.0.0"
- get-caller-file "^2.0.1"
- os-locale "^3.1.0"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^3.0.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^13.1.0"
-
-yargs@^12.0.5:
- version "12.0.5"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
- integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
- dependencies:
- cliui "^4.0.0"
- decamelize "^1.2.0"
- find-up "^3.0.0"
- get-caller-file "^1.0.1"
- os-locale "^3.0.0"
+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.3.4:
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2"
+ integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@17.7.2, yargs@^17.0.0:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^2.0.0"
- which-module "^2.0.0"
- y18n "^3.2.1 || ^4.0.0"
- yargs-parser "^11.1.1"
-
-yauzl@^2.4.2:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
- integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
- dependencies:
- buffer-crc32 "~0.2.3"
- fd-slicer "~1.1.0"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yocto-queue@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"
+ integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
+
+zod@^3.21.4:
+ version "3.23.4"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.4.tgz#c63805b2f39e10d4ab3d55eb3c8cdb472c79dfb1"
+ integrity sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw==