diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100755
index 3a4c7781..00000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,22 +0,0 @@
-module.exports = {
- env: {
- browser: true,
- es6: true,
- },
- extends: [
- 'airbnb-base',
- ],
- globals: {
- Atomics: 'readonly',
- SharedArrayBuffer: 'readonly',
- },
- parserOptions: {
- ecmaVersion: 2018,
- sourceType: 'module',
- },
- rules: {
- "indent": ["error", 2],
- "no-undef": "off",
- "prefer-const": "off",
- },
-};
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 00000000..fdf66fb0
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,22 @@
+{
+ "env": {
+ "browser": true,
+ "es6": true
+ },
+ "extends": [
+ "airbnb-base"
+ ],
+ "globals": {
+ "Atomics": "readonly",
+ "SharedArrayBuffer": "readonly"
+ },
+ "parserOptions": {
+ "ecmaVersion": 2018,
+ "sourceType": "module"
+ },
+ "rules": {
+ "indent": ["error", 2],
+ "no-undef": "off",
+ "prefer-const": "off"
+ }
+}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7687ec60..d9d5e9b4 100755
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -8,11 +8,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: checkout
- uses: actions/checkout@v1
+ uses: actions/checkout@v2
- name: setup-node
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
- node-version: '10.x'
+ node-version: '14'
- name: install
run: npm install
- name: build
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 27f904c0..859136f0 100755
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -8,11 +8,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: checkout
- uses: actions/checkout@v1
+ uses: actions/checkout@v2
- name: setup-node
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
- node-version: '10.x'
+ node-version: '14'
- name: install
run: npm install
- name: test+coverage
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index e89005bc..2b6d5f7a 100755
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -8,11 +8,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: checkout
- uses: actions/checkout@v1
+ uses: actions/checkout@v2
- name: setup-node
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
- node-version: '10.x'
+ node-version: '14'
- name: install
run: npm install
- name: lint
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 1cf6f633..cfb52fc7 100755
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -8,11 +8,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: checkout
- uses: actions/checkout@v1
+ uses: actions/checkout@v2
- name: setup-node
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v2
with:
- node-version: '10.x'
+ node-version: '14'
- name: install
run: npm install
- name: test
diff --git a/.gitignore b/.gitignore
index 410e4437..8b69311f 100755
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ coverage.json
.log
.env
ganache.log
+.DS_Store
diff --git a/.solhint.json b/.solhint.json
index fb9add9d..019d0258 100755
--- a/.solhint.json
+++ b/.solhint.json
@@ -9,7 +9,8 @@
{ "maxLength" : 50 }
],
"function-max-lines": [
- "error", 60
+ "error",
+ 149
],
"compiler-version": [
"error",
@@ -20,6 +21,9 @@
],
"const-name-snakecase": [
"off"
+ ],
+ "comprehensive-interface": [
+ "off"
]
}
}
diff --git a/.solhintignore b/.solhintignore
index ba804234..88a2b59a 100755
--- a/.solhintignore
+++ b/.solhintignore
@@ -9,3 +9,4 @@ node_modules
./contracts/ProtocolManager.sol
./contracts/TokenAdapterManager.sol
./contracts/adapters/dydx
+./contracts/adapters/berezka/lib
diff --git a/README.md b/README.md
index 5cbeb41b..da66b07c 100755
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-![](https://i.ibb.co/7QCQKPD/MEDIUM-FINAL.png)
+![](https://i.ibb.co/JFgRB6H/cover.png)
[![Build status](https://github.com/zeriontech/protocol-wrappers/workflows/build/badge.svg)](https://github.com/zeriontech/defi-sdk/actions?query=workflow:build)
[![Test status](https://github.com/zeriontech/protocol-wrappers/workflows/test/badge.svg)](https://github.com/zeriontech/defi-sdk/actions?query=workflow:test)
[![Coverage status](https://github.com/zeriontech/protocol-wrappers/workflows/coverage/badge.svg)](https://github.com/zeriontech/defi-sdk/actions?query=workflow:coverage)
@@ -11,15 +11,18 @@
If you have any questions about DeFi SDK, feel free to reach out to us on our [Discord server](https://go.zerion.io/discord).
-![](https://i.ibb.co/RC54SjL/defisdk.png)
-
## Features
-#### 💥Query user assets and debt deposited in DeFi protocols like *Maker, Aave, dYdX*, etc.
+#### 💥Query user assets and debt deposited in DeFi protocols like *Maker, Aave, dYdX*, etc.
+
> How much debt does `0xdead..beef` have on Compound?
-#### 📊Get the underlying components of complex derivative ERC20 tokens
+
+#### 📊Get the underlying components of complex derivative ERC20 tokens
+
> How much `cUSDC` vs `ETH` does `ETHMACOAPY` have?
+
#### ✨Interact with multiple DeFi protocols in a unified way (coming soon)
+
> See [What’s next for DeFi SDK](#whats-next-for-defi-sdk-)
## Table of Contents
@@ -34,6 +37,8 @@ If you have any questions about DeFi SDK, feel free to reach out to us on our [D
## Examples
+Find more examples of defi-sdk usage [here](https://github.com/zeriontech/defi-sdk-examples) (`web3js`, `ethers.js`).
+
### Fetch Compound debt and collateral
As of now, to get all cTokens along with a user's debt on Compound you need to perform over 10 calls to the Ethereum node to different contracts or rely on a centralized API. With DeFi SDK, you can call
@@ -110,7 +115,7 @@ Sometimes, a DeFi token contains several other tokens, and to calculate their pr
```solidity
// Uniswap V1 cDAI pool
-getFinalFullTokenBalance('0x34E89740adF97C3A9D3f63Cc2cE4a914382c230b', "Uniswap V1 pool token")
+getFinalFullTokenBalance("Uniswap V1 pool token", 0x34E89740adF97C3A9D3f63Cc2cE4a914382c230b)
```
and fetch the decomposition of UNI-token into ERC20 tokens, like `ETH` and `DAI`
@@ -126,7 +131,7 @@ In case you want to get account balances across all supported DeFi protocols, yo
```solidity
// bankless.zerion.eth portfolio
-getBalances('0x0ef51b7dac3933b8109482e7d910c21848e45da0f')
+getBalances(0x0ef51b7dac3933b8109482e7d910c21848e45da0f)
```
and obtain all balances for a given account. The response from the smart-contract will contain information about each of the protocols
@@ -139,8 +144,33 @@ and obtain all balances for a given account. The response from the smart-contrac
...
```
+### Get account balances across DeFi protocols that uses liquidity pools
+
+For the protocols that uses a lot of liquidity pools (Bancor, Balancer, Uniswap) balances are not available by default in `getBalances()` function.
+Balances for such protocols must be fetched by `getAdapterBalance()` function with a list of pools passed as a function parameter. If you call
+
+```solidity
+getBalances(
+ 0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990, // account address
+ 0x581Ae5AF7afa6f8171Bbf40d1981779F168A9523, // balancer adapter address
+ [0x53b89CE35928dda346c574D9105A5479CB87231c,
+ 0x987D7Cc04652710b74Fff380403f5c02f82e290a] // balancer pools addresses
+)
+```
+
+you will obtain Balancer balances for given pools. The response from the smart-contract will contain information about each of the pools
+
+```javascript
+1.3 ETH + 552.4 DAI // 30% WETH + 70% DAI pool
+4.2 MKR + 2.5 WETH // 75% MKR + 25% WETH pool
+```
+
## DeFi SDK Architecture
+
+
+
+
- **ProtocolAdapter** is a special contract for every protocol. Its main purpose is to wrap all the protocol interactions.
There are different types of protocol adapters: "Asset" adapter returns the amount of the account's tokens held on the protocol and the "Debt" adapter returns the amount of the account's debt to the protocol. Some protocols do not use "simple" ERC20 tokens but instead have complex derivatives, for example the Compound protocol has CTokens. The **ProtocolAdapter** contract also provides information about the type of tokens used within it.
- **TokenAdapter** is a contract for every derivative token type (e.g cTokens, aTokens, yTokens, etc.)
@@ -151,7 +181,8 @@ More detailed documentation about contracts can be found in [adapters](../../wik
## Addresses
-**AdapterRegistry** contract is deployed to the mainnet and its source code is verified on [etherscan](https://etherscan.io/address/0x06fe76b2f432fdfecaef1a7d4f6c3d41b5861672#code).
+**AdapterRegistry** contract's mainnet address is **0x06FE76B2f432fdfEcAEf1a7d4f6C3d41B5861672**.
+Its source code is verified on [etherscan](https://etherscan.io/address/0x06fe76b2f432fdfecaef1a7d4f6c3d41b5861672#code).
All the deployed contracts' addresses are available [here](../../wiki/Addresses).
@@ -159,22 +190,46 @@ All the deployed contracts' addresses are available [here](../../wiki/Addresses)
| Protocol Name | Description | Protocol Adapters | Token Adapters |
| :-----------: | :---------: | :---------------: | :------------: |
-| [Aave](./contracts/adapters/aave) | Decentralized lending & borrowing protocol. | [Asset adapter](./contracts/adapters/aave/AaveAssetAdapter.sol)
[Debt adapter](contracts/adapters/aave/AaveDebtAdapter.sol) | ["AToken"](./contracts/adapters/aave/AaveTokenAdapter.sol) |
-| [Balancer](./contracts/adapters/balancer) | Non-custodial portfolio manager, liquidity provider, and price sensor. | [Asset adapter](./contracts/adapters/balancer/BalancerAdapter.sol) supports all Balancer pools | ["Balancer pool token"](./contracts/adapters/aave/BalancerTokenAdapter.sol) |
-| [Bancor](./contracts/adapters/bancor) | Automated liquidity protocol. | [Asset adapter](./contracts/adapters/bancor/BancorAdapter.sol) supports Bancor pools starting from version 11 | ["SmartToken"](./contracts/adapters/aave/BancorTokenAdapter.sol) |
-| [Compound](./contracts/adapters/compound) | Decentralized lending & borrowing protocol. | [Asset adapter](./contracts/adapters/compound/CompoundAssetAdapter.sol)
[Debt adapter](./contracts/adapters/compound/CompoundDebtAdapter.sol) | ["CToken"](./contracts/adapters/compound/CompoundTokenAdapter.sol) |
-| [Curve](./contracts/adapters/curve) | Exchange liquidity pool for stablecoin trading. Supports Compound, Y, and BUSD pools. | [Asset adapter](./contracts/adapters/curve/CurveAdapter.sol) | ["Curve pool token"](contracts/adapters/curve/CurveTokenAdapter.sol) |
+| [Aave](./contracts/adapters/aave) | Decentralized lending & borrowing protocol. Aave market.| [Asset adapter](./contracts/adapters/aave/AaveAssetAdapter.sol)
[Debt adapter](contracts/adapters/aave/AaveDebtAdapter.sol) | ["AToken"](./contracts/adapters/aave/AaveTokenAdapter.sol) |
+| [Aave • Uniswap Market](./contracts/adapters/aaveUniswap) | Decentralized lending & borrowing protocol. Uniswap market. | [Asset adapter](./contracts/adapters/aaveUniswap/AaveUniswapAssetAdapter.sol)
[Debt adapter](contracts/adapters/aaveUniswap/AaveUniswapDebtAdapter.sol) | ["AToken Uniswap Market"](./contracts/adapters/aave/AaveTokenAdapter.sol) |
+| [Ampleforth](./contracts/adapters/ampleforth) | An adaptive money built on sound economics. | [Asset adapter](./contracts/adapters/ampleforth/AmpleforthAdapter.sol) | — |
+| [Aragon](./contracts/adapters/aragon) | ANT staking rewards. | [Staking adapter](./contracts/adapters/aragon/AragonStakingAdapter.sol) | — |
+| [Balancer](./contracts/adapters/balancer) | Non-custodial portfolio manager, liquidity provider, and price sensor. | [Asset adapter](./contracts/adapters/balancer/BalancerAdapter.sol) supports all Balancer pools | ["Balancer pool token"](./contracts/adapters/balancer/BalancerTokenAdapter.sol) |
+| [Bancor](./contracts/adapters/bancor) | Automated liquidity protocol. | [Asset adapter](./contracts/adapters/bancor/BancorAdapter.sol) supports Bancor pools starting from version 11 | ["SmartToken"](./contracts/adapters/bancor/BancorTokenAdapter.sol) |
+| [Compound](./contracts/adapters/compound) | Decentralized lending & borrowing protocol. | [Asset adapter](./contracts/adapters/compound/CompoundAssetAdapter.sol)
[Debt adapter](./contracts/adapters/compound/CompoundDebtAdapter.sol)
[Governance adapter](./contracts/adapters/compound/CompoundGovernanceAdapter.sol) | ["CToken"](./contracts/adapters/compound/CompoundTokenAdapter.sol) |
+| [C.R.E.A.M.](./contracts/adapters/cream) | A lending platform based on Compound Finance and exchange platform based on Balancer Labs. | [Asset adapter](./contracts/adapters/cream/CreamAssetAdapter.sol)
[Debt adapter](./contracts/adapters/cream/CreamDebtAdapter.sol)
[Staking adapter](./contracts/adapters/cream/CreamStakingAdapter.sol) | — |
+| [Curve](./contracts/adapters/curve) | Exchange liquidity pool for stablecoin trading. | [Asset adapter](./contracts/adapters/curve/CurveAdapter.sol)
[Staking adapter](./contracts/adapters/curve/CurveStakingAdapter.sol)
[Vesting adapter](./contracts/adapters/curve/CurveVestingAdapter.sol) | ["Curve pool token"](contracts/adapters/curve/CurveTokenAdapter.sol) |
+| [DDEX • Lending](./contracts/adapters/ddexLending) | Decentralized lending and borrowing | [Asset adapter](./contracts/adapters/ddexLending/DdexLendingAssetAdapter.sol) | — |
+| [DDEX • Margin](./contracts/adapters/ddexMargin) | Decentralized margin trading | [Asset adapter](./contracts/adapters/ddexMargin/DdexMarginAssetAdapter.sol)
[Debt adapter](./contracts/adapters/ddexMargin/DdexMarginDebtAdapter.sol) | — |
+| [DDEX • Spot](./contracts/adapters/ddexSpot) | Decentralized trading | [Asset adapter](./contracts/adapters/ddexSpot/DdexSpotAssetAdapter.sol) | — |
| [DeFi Money Market](./contracts/adapters/dmm) | Crypto through revenue-producing real world assets. | [Asset adapter](./contracts/adapters/dmm/DmmAssetAdapter.sol) | ["MToken"](contracts/adapters/dmm/DmmTokenAdapter.sol) |
+| [DODO](./contracts/adapters/dodo) | Your on-chain liquidity provider. | [Asset adapter](./contracts/adapters/dodo/DodoAdapter.sol)
[Staking adapter](./contracts/adapters/dodo/DodoStakingAdapter.sol) | ["DODO pool token"](contracts/adapters/dodo/DodoTokenAdapter.sol) |
| [dYdX](./contracts/adapters/dydx) | Decentralized trading platform. All 4 markets (WETH, SAI, USDC, DAI) are supported. | [Asset adapter](./contracts/adapters/dydx/DyDxAssetAdapter.sol)
[Debt adapter](./contracts/adapters/dydx/DyDxDebtAdapter.sol) | — |
| [Idle](./contracts/adapters/idle) | Yield aggregator for lending platforms. | [Asset adapter](./contracts/adapters/idle/IdleAdapter.sol) | ["IdleToken"](./contracts/adapters/idle/IdleTokenAdapter.sol) |
| [iearn.finance (v2/v3)](./contracts/adapters/iearn) | Yield aggregator for lending platforms. Protocol adapter is duplicated for v2 and v3 versions of protocol. | [Asset adapter](./contracts/adapters/iearn/IearnAdapter.sol) | ["YToken"](./contracts/adapters/iearn/IearnTokenAdapter.sol) |
+| [Harvest](./contracts/adapters/harvest) | Your hard work is about to become easier with Harvest. | [Staking adapter](./contracts/adapters/harvest/HarvestStakingAdapter.sol) | — |
+| [KeeperDAO](./contracts/adapters/keeperDao) | An on-chain liquidity underwriter for DeFi. | [Asset adapter](./contracts/adapters/keeperDao/KeeperDaoAssetAdapter.sol) | ["KToken"](contracts/adapters/keeperDao/KeeperDaoTokenAdapter.sol) |
+| [KIMCHI](contracts/adapters/kimchi) | Farm KIMCHI by staking LP tokens. | [Staking adapter](contracts/adapters/kimchi/KimchiStakingAdapter.sol) | — |
+| [KyberDAO](./contracts/adapters/kyber) | Platform that allows KNC token holders to participate in governance. | [Asset adapter](./contracts/adapters/kyber/KyberAssetAdapter.sol) | — |
+| [Livepeer](./contracts/adapters/livepeer) | Delegated stake based protocol for decentralized video streaming. | [Staking adapter](./contracts/adapters/livepeer/LivepeerStakingAdapter.sol) | — |
| [Chai](./contracts/adapters/maker) | A simple ERC20 wrapper over the Dai Savings Protocol. | [Asset adapter](./contracts/adapters/maker/ChaiAdapter.sol) | ["Chai token"](./contracts/adapters/maker/ChaiTokenAdapter.sol) |
| [Dai Savings Protocol](./contracts/adapters/maker) | Decentralized lending protocol. | [Asset adapter](./contracts/adapters/maker/DSRAdapter.sol) | — |
+| [Maker Governance](./contracts/adapters/maker) | MKR tokens locked on the MakerDAO governance contracts. | [Asset adapter](./contracts/adapters/maker/MakerGovernanceAdapter.sol) | — |
| [Multi-Collateral Dai](./contracts/adapters/maker) | Collateralized loans on Maker. | [Asset adapter](./contracts/adapters/maker/MCDAssetAdapter.sol)
[Debt adapter](./contracts/adapters/maker/MCDDebtAdapter.sol) | — |
+| [Matic](contracts/adapters/matic) | A scaling solution for public blockchains. | [Staking adapter](contracts/adapters/matic/MaticStakingAdapter.sol) | — |
+| [Melon](contracts/adapters/melon) | A protocol for decentralized on-chain asset management. | [Asset adapter](contracts/adapters/melon/MelonAssetAdapter.sol) | ["MelonToken"](./contracts/adapters/melon/MelonTokenAdapter.sol) |
+| [mStable](./contracts/adapters/mstable) | mStable unifies stablecoins, lending and swapping into one standard. | [Asset adapter](./contracts/adapters/mstable/MstableAssetAdapter.sol)
[Staking adapter](./contracts/adapters/mstable/MstableStakingAdapter.sol) | ["Masset"](./contracts/adapters/mstable/MstableTokenAdapter.sol) |
+| [Nexus Mutual](./contracts/adapters/nexus) | A people-powered alternative to insurance. | [Staking adapter](./contracts/adapters/nexus/NexusStakingAdapter.sol) | — |
+| [Pickle Finance](./contracts/adapters/pickle) | Off peg bad, on peg good. | [Asset adapter](./contracts/adapters/pickle/PickleAssetAdapter.sol)
[Staking adapter V1](./contracts/adapters/pickle/PickleStakingV1Adapter.sol)
[Staking adapter V2](./contracts/adapters/pickle/PickleStakingV2Adapter.sol) | ["PickleJar"](./contracts/adapters/pickle/PickleTokenAdapter.sol) |
+| [PieDAO](./contracts/adapters/pieDAO) | The Asset Allocation DAO. | [Asset adapter](./contracts/adapters/pieDAO/PieDAOPieAdapter.sol)
[Staking adapter](./contracts/adapters/pieDAO/PieDAOStakingAdapter.sol) | ["PieDAO Pie Token"](./contracts/adapters/pieDAO/PieDAOPieTokenAdapter.sol) |
| [PoolTogether](./contracts/adapters/poolTogether) | Decentralized no-loss lottery. Supports SAI, DAI, and USDC pools. | [Asset adapter](./contracts/adapters/poolTogether/PoolTogetherAdapter.sol) | ["PoolTogether pool"](./contracts/adapters/poolTogether/PoolTogetherTokenAdapter.sol) |
+| [SashimiSwap](contracts/adapters/sashimi) | Earn SASHIMI tokens by staking Uniswap V2 LP Tokens. | [Staking adapter](contracts/adapters/sashimi/SashimiStakingAdapter.sol) | — |
+| [SushiSwap](contracts/adapters/sushi) | Stake Uniswap LP tokens to claim your very own yummy SUSHI! | [Staking adapter](contracts/adapters/sushi/SushiStakingAdapter.sol) | — |
+| [Swerve](contracts/adapters/swerve) | A fork that's 100% community owned and governed. | [Asset adapter](./contracts/adapters/swerve/SwerveAdapter.sol)
[Staking adapter](contracts/adapters/swerve/SwerveStakingAdapter.sol) | ["Swerve pool token"](contracts/adapters/swerve/SwerveTokenAdapter.sol) |
| [Synthetix](./contracts/adapters/synthetix) | Synthetic assets protocol. Asset adapter returns amount of SNX locked as collateral. | [Asset adapter](./contracts/adapters/synthetix/SynthetixAssetAdapter.sol)
[Debt adapter](./contracts/adapters/synthetix/SynthetixDebtAdapter.sol) | — |
-| [TokenSets](./contracts/adapters/tokenSets) | TokenSets. Automated asset management strategies. | [Asset adapter](./contracts/adapters/tokenSets/TokenSetsAdapter.sol) | ["SetToken"](./contracts/adapters/tokenSets/TokenSetsTokenAdapter.sol) |
-| [Uniswap V1](./contracts/adapters/uniswap) | Automated liquidity protocol. | [Asset adapter](./contracts/adapters/uniswap/UniswapV1Adapter.sol) supports all Uniswap pools | ["Uniswap V1 pool token"](./contracts/adapters/uniswap/UniswapV1TokenAdapter.sol) |
+| [TokenSets](./contracts/adapters/tokenSets) | Automated asset management strategies. | [Asset adapter](./contracts/adapters/tokenSets/TokenSetsAdapter.sol)
[Asset adapter V2](./contracts/adapters/tokenSets/TokenSetsV2Adapter.sol) | ["SetToken"](./contracts/adapters/tokenSets/TokenSetsTokenAdapter.sol)
["SetToken V2"](./contracts/adapters/tokenSets/TokenSetsV2TokenAdapter.sol) |
+| [Uniswap V1](./contracts/adapters/uniswap) | Automated liquidity protocol. | [Asset adapter](./contracts/adapters/uniswap/UniswapV1Adapter.sol) supports all Uniswap V1 pools | ["Uniswap V1 pool token"](./contracts/adapters/uniswap/UniswapV1TokenAdapter.sol) |
+| [Uniswap V2](./contracts/adapters/uniswap) | Automated liquidity protocol. | [Asset adapter](./contracts/adapters/uniswap/UniswapV2Adapter.sol) supports all Uniswap V2 pools | ["Uniswap V2 pool token"](./contracts/adapters/uniswap/UniswapV2TokenAdapter.sol) |
| [0x Staking](./contracts/adapters/zrx) | Liquidity rewards for staking ZRX. | [Asset adapter](./contracts/adapters/zrx/ZrxAdapter.sol) | — |
## How to Add Your Adapter
diff --git a/audits/Zerion DeFi SDK PeckShield Audit Report.pdf b/audits/Zerion DeFi SDK PeckShield Audit Report.pdf
new file mode 100644
index 00000000..9ea86d51
Binary files /dev/null and b/audits/Zerion DeFi SDK PeckShield Audit Report.pdf differ
diff --git a/audits/Zerion DeFi SDK Trail of Bits Audit Report.pdf b/audits/Zerion DeFi SDK Trail of Bits Audit Report.pdf
new file mode 100644
index 00000000..c0121026
Binary files /dev/null and b/audits/Zerion DeFi SDK Trail of Bits Audit Report.pdf differ
diff --git a/compiler.json b/compiler.json
new file mode 100644
index 00000000..88c998f5
--- /dev/null
+++ b/compiler.json
@@ -0,0 +1,14 @@
+{
+ "contractsDir": "contracts",
+ "artifactsDir": "artifacts",
+ "contracts": [],
+ "shouldSaveStandardInput": true,
+ "compilerSettings": {
+ "optimizer": { "enabled": true, "runs": 1000000 },
+ "outputSelection": {
+ "*": {
+ "*": ["abi", "evm.bytecode.object"]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/contracts/ProtocolManager.sol b/contracts/ProtocolManager.sol
index 5f38fcb7..71aa627c 100755
--- a/contracts/ProtocolManager.sol
+++ b/contracts/ProtocolManager.sol
@@ -33,13 +33,13 @@ abstract contract ProtocolManager is Ownable {
string internal constant INITIAL_PROTOCOL_NAME = "Initial protocol name";
// protocol name => next protocol name (linked list)
- mapping (string => string) internal nextProtocolName;
+ mapping(string => string) internal nextProtocolName;
// protocol name => protocol struct with info and adapters
- mapping (string => ProtocolMetadata) internal protocolMetadata;
+ mapping(string => ProtocolMetadata) internal protocolMetadata;
// protocol name => array of protocol adapters
- mapping (string => address[]) internal protocolAdapters;
+ mapping(string => address[]) internal protocolAdapters;
// protocol adapter => array of supported tokens
- mapping (address => address[]) internal supportedTokens;
+ mapping(address => address[]) internal supportedTokens;
/**
* @notice Initializes contract storage.
diff --git a/contracts/TokenAdapterManager.sol b/contracts/TokenAdapterManager.sol
index 3357c96d..e9be6578 100755
--- a/contracts/TokenAdapterManager.sol
+++ b/contracts/TokenAdapterManager.sol
@@ -32,9 +32,9 @@ abstract contract TokenAdapterManager is Ownable {
string internal constant INITIAL_NAME = "Initial token name";
// adapter name => next adapter name (linked list)
- mapping (string => string) internal nextTokenAdapterName;
+ mapping(string => string) internal nextTokenAdapterName;
// adapter name => adapter info
- mapping (string => address) internal tokenAdapter;
+ mapping(string => address) internal tokenAdapter;
/**
* @notice Initializes contract storage.
diff --git a/contracts/adapters/ERC20TokenAdapter.sol b/contracts/adapters/ERC20TokenAdapter.sol
index 62ac2cce..d786617b 100755
--- a/contracts/adapters/ERC20TokenAdapter.sol
+++ b/contracts/adapters/ERC20TokenAdapter.sol
@@ -116,7 +116,7 @@ contract ERC20TokenAdapter is TokenAdapter {
bytes memory result;
for (uint256 i = 0; i < 32; i++) {
- if (data[i] != byte(0)) {
+ if (data[i] != bytes1(0)) {
length++;
}
}
diff --git a/contracts/adapters/TokenAdapter.sol b/contracts/adapters/TokenAdapter.sol
index 7f1813de..294a9ca8 100755
--- a/contracts/adapters/TokenAdapter.sol
+++ b/contracts/adapters/TokenAdapter.sol
@@ -38,12 +38,12 @@ interface TokenAdapter {
function getMetadata(address token) external view returns (TokenMetadata memory);
/**
- * @dev MUST return array of Component structs with underlying tokens rates for the given token.
- * struct Component {
- * address token; // Address of token contract
- * string tokenType; // Token type ("ERC20" by default)
- * uint256 rate; // Price per share (1e18)
- * }
- */
+ * @dev MUST return array of Component structs with underlying tokens rates for the given token.
+ * struct Component {
+ * address token; // Address of token contract
+ * string tokenType; // Token type ("ERC20" by default)
+ * uint256 rate; // Price per share (1e18)
+ * }
+ */
function getComponents(address token) external view returns (Component[] memory);
}
diff --git a/contracts/adapters/aave/AaveStakingAdapter.sol b/contracts/adapters/aave/AaveStakingAdapter.sol
new file mode 100644
index 00000000..c82fe62d
--- /dev/null
+++ b/contracts/adapters/aave/AaveStakingAdapter.sol
@@ -0,0 +1,53 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+interface StakedAave {
+ function getTotalRewardsBalance(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Aave protocol (staking).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract AaveStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant STAKED_AAVE = 0x4da27a545c0c5B758a6BA100e3a049001de870f5;
+
+ /**
+ * @return Amount of staked AAVE tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ uint256 totalBalance = 0;
+
+ totalBalance += ERC20(STAKED_AAVE).balanceOf(account);
+ totalBalance += StakedAave(STAKED_AAVE).getTotalRewardsBalance(account);
+
+ return totalBalance;
+ }
+}
diff --git a/contracts/adapters/aaveUniswap/AaveUniswapAssetAdapter.sol b/contracts/adapters/aaveUniswap/AaveUniswapAssetAdapter.sol
new file mode 100644
index 00000000..b51f5a39
--- /dev/null
+++ b/contracts/adapters/aaveUniswap/AaveUniswapAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Asset adapter for Aave protocol (Uniswap market).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract AaveUniswapAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "AToken Uniswap Market";
+
+ /**
+ * @return Amount of ATokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/aaveUniswap/AaveUniswapDebtAdapter.sol b/contracts/adapters/aaveUniswap/AaveUniswapDebtAdapter.sol
new file mode 100644
index 00000000..ed28f52b
--- /dev/null
+++ b/contracts/adapters/aaveUniswap/AaveUniswapDebtAdapter.sol
@@ -0,0 +1,68 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev LendingPoolAddressesProvider contract interface.
+ * Only the functions required for AaveUniswapDebtAdapter contract are added.
+ * The LendingPoolAddressesProvider contract is available here
+ * github.com/aave/aave-protocol/blob/master/contracts/configuration/LendingPoolAddressesProvider.sol.
+ */
+interface LendingPoolAddressesProvider {
+ function getLendingPool() external view returns (LendingPool);
+}
+
+
+/**
+ * @dev LendingPool contract interface.
+ * Only the functions required for AaveUniswapDebtAdapter contract are added.
+ * The LendingPool contract is available here
+ * github.com/aave/aave-protocol/blob/master/contracts/lendingpool/LendingPool.sol.
+ */
+interface LendingPool {
+ function getUserReserveData(address, address) external view returns (uint256, uint256);
+}
+
+
+/**
+ * @title Debt adapter for Aave protocol (Uniswap market).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract AaveUniswapDebtAdapter is ProtocolAdapter {
+
+ address internal constant PROVIDER = 0x7fd53085B9A29D236235D6FC593b47C9C33429F1;
+
+ string public constant override adapterType = "Debt";
+
+ string public constant override tokenType = "ERC20";
+
+ /**
+ * @return Amount of debt of the given account for the protocol.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ LendingPool pool = LendingPoolAddressesProvider(PROVIDER).getLendingPool();
+
+ (, uint256 debtAmount) = pool.getUserReserveData(token, account);
+
+ return debtAmount;
+ }
+}
diff --git a/contracts/adapters/aaveUniswap/AaveUniswapTokenAdapter.sol b/contracts/adapters/aaveUniswap/AaveUniswapTokenAdapter.sol
new file mode 100644
index 00000000..e353c107
--- /dev/null
+++ b/contracts/adapters/aaveUniswap/AaveUniswapTokenAdapter.sol
@@ -0,0 +1,88 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev AToken contract interface.
+ * Only the functions required for AaveTokenAdapter contract are added.
+ * The AToken contract is available here
+ * github.com/aave/aave-protocol/blob/master/contracts/tokenization/AToken.sol.
+ */
+interface AToken {
+ function underlyingAssetAddress() external view returns (address);
+}
+
+
+/**
+ * @title Token adapter for ATokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract AaveUniswapTokenAdapter is TokenAdapter {
+
+
+ address internal constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
+ address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address underlying = AToken(token).underlyingAssetAddress();
+
+ Component[] memory underlyingTokens = new Component[](1);
+ string memory underlyingType;
+
+ if (underlying == DAI ||
+ underlying == USDC ||
+ underlying == USDT ||
+ underlying == ETH ) {
+ underlyingType = "ERC20";
+ } else {
+ underlyingType = "Uniswap V1 pool token";
+ }
+
+ underlyingTokens[0] = Component({
+ token: underlying,
+ tokenType: underlyingType,
+ rate: uint256(1e18)
+ });
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/akropolis/AdelStakingAdapter.sol b/contracts/adapters/akropolis/AdelStakingAdapter.sol
new file mode 100644
index 00000000..2d4c4687
--- /dev/null
+++ b/contracts/adapters/akropolis/AdelStakingAdapter.sol
@@ -0,0 +1,52 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev Staking contract interface.
+ * Only the functions required for AkroStakingAdapter contract are added.
+ */
+interface Staking {
+ function totalStakedFor(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Akropolis Staking protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Alexander Mazaletskiy
+ */
+contract AdelStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant STAKING = 0x1A547c3dd03c39Fb2b5aEaFC524033879bD28F13;
+
+ /**
+ * @return Amount of ADEL locked on the protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ return Staking(STAKING).totalStakedFor(account);
+ }
+}
diff --git a/contracts/adapters/akropolis/AkroStakingAdapter.sol b/contracts/adapters/akropolis/AkroStakingAdapter.sol
new file mode 100644
index 00000000..0de6cdb6
--- /dev/null
+++ b/contracts/adapters/akropolis/AkroStakingAdapter.sol
@@ -0,0 +1,52 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev Staking contract interface.
+ * Only the functions required for AkroStakingAdapter contract are added.
+ */
+interface Staking {
+ function totalStakedFor(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Akropolis Staking protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Alexander Mazaletskiy
+ */
+contract AkroStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant STAKING = 0x3501Ec11d205fa249f2C42f5470e137b529b35D0;
+
+ /**
+ * @return Amount of AKRO locked on the protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ return Staking(STAKING).totalStakedFor(account);
+ }
+}
diff --git a/contracts/adapters/alphaHomora/AlphaHomoraAssetAdapter.sol b/contracts/adapters/alphaHomora/AlphaHomoraAssetAdapter.sol
new file mode 100755
index 00000000..4286e2ec
--- /dev/null
+++ b/contracts/adapters/alphaHomora/AlphaHomoraAssetAdapter.sol
@@ -0,0 +1,48 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Alpha Homora protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract AlphaHomoraAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "Interest Bearing ETH";
+
+ address internal constant IBETH = 0x67B66C99D3Eb37Fa76Aa3Ed1ff33E8e39F0b9c7A;
+
+ /**
+ * @return Amount of ibETH tokens held by the given account.
+ * @param token Address of the ibETH token.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == IBETH) {
+ return ERC20(IBETH).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/alphaHomora/AlphaHomoraTokenAdapter.sol b/contracts/adapters/alphaHomora/AlphaHomoraTokenAdapter.sol
new file mode 100755
index 00000000..9817f998
--- /dev/null
+++ b/contracts/adapters/alphaHomora/AlphaHomoraTokenAdapter.sol
@@ -0,0 +1,74 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev Bank contract interface.
+ * Only the functions required for AlphaHomoraTokenAdapter contract are added.
+ * The Bank contract is available here
+ * github.com/AlphaFinanceLab/alphahomora/blob/master/contracts/5/Bank.sol.
+ */
+interface Bank {
+ function totalETH() external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for Alpha Homora Interest Bearing ETH.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract AlphaHomoraTokenAdapter is TokenAdapter {
+
+ address internal constant IBETH = 0x67B66C99D3Eb37Fa76Aa3Ed1ff33E8e39F0b9c7A;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ uint256 totalSupply = ERC20(token).totalSupply();
+ Component[] memory underlyingComponents = new Component[](1);
+
+ underlyingComponents[0] = Component({
+ token: ETH,
+ tokenType: "ERC20",
+ rate: totalSupply == 0 ? 0 : Bank(token).totalETH() * 1e18 / totalSupply
+ });
+
+ return underlyingComponents;
+ }
+}
diff --git a/contracts/adapters/ampleforth/AmpleforthAdapter.sol b/contracts/adapters/ampleforth/AmpleforthAdapter.sol
new file mode 100644
index 00000000..be5c9cb9
--- /dev/null
+++ b/contracts/adapters/ampleforth/AmpleforthAdapter.sol
@@ -0,0 +1,70 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev TokenGeyser contract interface.
+ * Only the functions required for AmpleforthAdapter contract are added.
+ * The TokenGeyser contract is available here
+ * github.com/ampleforth/token-geyser/blob/master/contracts/TokenGeyser.sol.
+ */
+interface TokenGeyser {
+ function totalStakedFor(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Asset adapter for Ampleforth.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract AmpleforthAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant UNI_AMPL_WETH = 0xc5be99A02C6857f9Eac67BbCE58DF5572498F40c;
+
+ address internal constant GEYSER_PILOT = 0xD36132E0c1141B26E62733e018f12Eb38A7b7678;
+ address internal constant GEYSER_BEEHIVE_V1 = 0x0eEf70ab0638A763acb5178Dd3C62E49767fd940;
+ address internal constant GEYSER_BEEHIVE_V2 = 0x23796Bc856ed786dCC505984fd538f91dAD3194A;
+ address internal constant GEYSER_BEEHIVE_V3 = 0x075Bb66A472AB2BBB8c215629C77E8ee128CC2Fc;
+
+ /**
+ * @return AMPL balance or amount of UNI-tokens locked on the protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == UNI_AMPL_WETH) {
+ uint totalStaked = 0;
+
+ totalStaked += TokenGeyser(GEYSER_PILOT).totalStakedFor(account);
+ totalStaked += TokenGeyser(GEYSER_BEEHIVE_V1).totalStakedFor(account);
+ totalStaked += TokenGeyser(GEYSER_BEEHIVE_V2).totalStakedFor(account);
+ totalStaked += TokenGeyser(GEYSER_BEEHIVE_V3).totalStakedFor(account);
+
+ return totalStaked;
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/aragon/AragonStakingAdapter.sol b/contracts/adapters/aragon/AragonStakingAdapter.sol
new file mode 100644
index 00000000..551d0abc
--- /dev/null
+++ b/contracts/adapters/aragon/AragonStakingAdapter.sol
@@ -0,0 +1,62 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for AragonStakingAdapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Aragon protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract AragonStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant ANT = 0x960b236A07cf122663c4303350609A66A7B288C0;
+ address internal constant UNI_ANT_WETH = 0xfa19de406e8F5b9100E4dD5CaD8a503a6d686Efe;
+ address internal constant LIQUIDITY = 0xEA4D68CF86BcE59Bf2bFA039B97794ce2c43dEBC;
+
+ /**
+ * @return Amount of staked tokens / rewards by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == UNI_ANT_WETH) {
+ return ERC20(LIQUIDITY).balanceOf(account);
+ } else if (token == ANT) {
+ return StakingRewards(LIQUIDITY).earned(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/balancer/BalancerTokenAdapter.sol b/contracts/adapters/balancer/BalancerTokenAdapter.sol
index 29bf7923..251c3c06 100755
--- a/contracts/adapters/balancer/BalancerTokenAdapter.sol
+++ b/contracts/adapters/balancer/BalancerTokenAdapter.sol
@@ -39,7 +39,7 @@ interface CToken {
* github.com/balancer-labs/balancer-core/blob/master/contracts/BPool.sol.
*/
interface BPool {
- function getFinalTokens() external view returns (address[] memory);
+ function getCurrentTokens() external view returns (address[] memory);
function getBalance(address) external view returns (uint256);
function getNormalizedWeight(address) external view returns (uint256);
}
@@ -52,7 +52,6 @@ interface BPool {
*/
contract BalancerTokenAdapter is TokenAdapter {
-
/**
* @return TokenMetadata struct with ERC20-style token info.
* @dev Implementation of TokenAdapter interface function.
@@ -71,32 +70,18 @@ contract BalancerTokenAdapter is TokenAdapter {
* @dev Implementation of TokenAdapter interface function.
*/
function getComponents(address token) external view override returns (Component[] memory) {
- address[] memory underlyingTokensAddresses;
- try BPool(token).getFinalTokens() returns (address[] memory result) {
- underlyingTokensAddresses = result;
- } catch {
- underlyingTokensAddresses = new address[](0);
- }
+ address[] memory tokens;
+ tokens = BPool(token).getCurrentTokens();
uint256 totalSupply = ERC20(token).totalSupply();
- Component[] memory underlyingTokens = new Component[](underlyingTokensAddresses.length);
+ Component[] memory underlyingTokens = new Component[](tokens.length);
- address underlyingToken;
- string memory underlyingTokenType;
for (uint256 i = 0; i < underlyingTokens.length; i++) {
- underlyingToken = underlyingTokensAddresses[i];
-
- try CToken(underlyingToken).isCToken{gas: 2000}() returns (bool) {
- underlyingTokenType = "CToken";
- } catch {
- underlyingTokenType = "ERC20";
- }
-
underlyingTokens[i] = Component({
- token: underlyingToken,
- tokenType: underlyingTokenType,
- rate: BPool(token).getBalance(underlyingToken) * 1e18 / totalSupply
+ token: tokens[i],
+ tokenType: getTokenType(tokens[i]),
+ rate: totalSupply == 0 ? 0 : BPool(token).getBalance(tokens[i]) * 1e18 / totalSupply
});
}
@@ -105,7 +90,7 @@ contract BalancerTokenAdapter is TokenAdapter {
function getPoolName(address token) internal view returns (string memory) {
address[] memory underlyingTokensAddresses;
- try BPool(token).getFinalTokens() returns (address[] memory result) {
+ try BPool(token).getCurrentTokens() returns (address[] memory result) {
underlyingTokensAddresses = result;
} catch {
return "Unknown pool";
@@ -120,6 +105,7 @@ contract BalancerTokenAdapter is TokenAdapter {
i == lastIndex ? " pool" : " + "
));
}
+
return poolName;
}
@@ -143,6 +129,22 @@ contract BalancerTokenAdapter is TokenAdapter {
}
}
+ function getTokenType(address token) internal view returns (string memory) {
+ (bool success, bytes memory returnData) = token.staticcall{gas: 2000}(
+ abi.encodeWithSelector(CToken(token).isCToken.selector)
+ );
+
+ if (success) {
+ if (returnData.length == 32) {
+ return abi.decode(returnData, (bool)) ? "CToken" : "ERC20";
+ } else {
+ return "ERC20";
+ }
+ } else {
+ return "ERC20";
+ }
+ }
+
/**
* @dev Internal function to convert bytes32 to string and trim zeroes.
*/
diff --git a/contracts/adapters/bancor/BancorLiquidityProtectionAdapter.sol b/contracts/adapters/bancor/BancorLiquidityProtectionAdapter.sol
new file mode 100755
index 00000000..c042fd41
--- /dev/null
+++ b/contracts/adapters/bancor/BancorLiquidityProtectionAdapter.sol
@@ -0,0 +1,103 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {ProtocolAdapter} from "../ProtocolAdapter.sol";
+
+
+interface LiquidityProtectionStore {
+ function protectedLiquidity(
+ uint256
+ )
+ external
+ view
+ returns (address, address, address, uint256, uint256, uint256, uint256, uint256);
+
+ function protectedLiquidityIds(address) external view returns (uint256[] memory);
+
+ function owner() external view returns (address);
+}
+
+
+interface LiquidityProtection {
+ function removeLiquidityReturn(
+ uint256,
+ uint32,
+ uint256
+ )
+ external
+ view
+ returns (uint256, uint256, uint256);
+}
+
+
+/**
+ * @title Adapter for Bancor protocol (liquidity protection).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract BancorLiquidityProtectionAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+address internal constant override LPS = 0xf5FAB5DBD2f3bf675dE4cB76517d4767013cfB55;
+address internal constant override BNT = 0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C;
+
+/**
+ * @return Amount of SmartTokens locked in LiquidityProtection.
+ * @param token Address of the smart token.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+function getBalance(address token, address account) external view override returns (uint256) {
+LiquidityProtectionStore liquidityProtectionStore = LiquidityProtectionStore(LPS);
+LiquidityProtection liquidityProtection = LiquidityProtection(
+liquidityProtectionStore.owner()
+);
+uint256[] memory ids = liquidityProtectionStore.protectedLiquidityIds(account);
+
+address reserveToken;
+uint256 actualAmount;
+uint256 bntAmount;
+uint256 totalAmount = 0;
+uint256 length = ids.length;
+for (uint256 i = 0; i < length; i++) {
+(,, reserveToken,,,,,) = liquidityProtectionStore.protectedLiquidity(
+ids[i]
+);
+
+(, actualAmount, bntAmount) = liquidityProtection.removeLiquidityReturn(
+ids[i],
+1000000,
+// solhint-disable-next-line not-rely-on-time
+now
+);
+
+if (token == reserveToken) {
+totalAmount += actualAmount;
+}
+
+if (token == BNT) {
+totalAmount += bntAmount;
+}
+}
+
+return totalAmount;
+ }
+}
diff --git a/contracts/adapters/bancor/BancorLockedTokensAdapter.sol b/contracts/adapters/bancor/BancorLockedTokensAdapter.sol
new file mode 100755
index 00000000..c59bdf4e
--- /dev/null
+++ b/contracts/adapters/bancor/BancorLockedTokensAdapter.sol
@@ -0,0 +1,76 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {ProtocolAdapter} from "../ProtocolAdapter.sol";
+
+
+interface LiquidityProtectionStore {
+ function lockedBalanceRange(
+ address,
+ uint256,
+ uint256
+ )
+ external
+ view
+ returns (uint256[] memory, uint256[] memory);
+
+ function lockedBalanceCount(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Bancor protocol (locked tokens).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract BancorLockedTokensAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant override LPS = 0xf5FAB5DBD2f3bf675dE4cB76517d4767013cfB55;
+ address internal constant override BNT = 0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C;
+
+ /**
+ * @return Amount of SmartTokens locked in LiquidityProtection.
+ * @param token Address of the smart token.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token != BNT) {
+ return 0;
+ } else {
+ LiquidityProtectionStore liquidityProtectionStore = LiquidityProtectionStore(LPS);
+ (uint256[] memory lockedBalances,) = liquidityProtectionStore.lockedBalanceRange(
+ account,
+ 0,
+ liquidityProtectionStore.lockedBalanceCount(account)
+ );
+
+ uint256 totalAmount = 0;
+ uint256 length = lockedBalances.length;
+ for (uint256 i = 0; i < length; i++) {
+ totalAmount += lockedBalances[i];
+ }
+
+ return totalAmount;
+ }
+ }
+}
diff --git a/contracts/adapters/bancor/BancorTokenAdapter.sol b/contracts/adapters/bancor/BancorTokenAdapter.sol
index 75767e5d..ecf81e19 100755
--- a/contracts/adapters/bancor/BancorTokenAdapter.sol
+++ b/contracts/adapters/bancor/BancorTokenAdapter.sol
@@ -83,7 +83,7 @@ interface BancorFormula {
contract BancorTokenAdapter is TokenAdapter {
address internal constant REGISTRY = 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4;
-
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
/**
* @return TokenMetadata struct with ERC20-style token info.
* @dev Implementation of TokenAdapter interface function.
@@ -105,20 +105,27 @@ contract BancorTokenAdapter is TokenAdapter {
address formula = ContractRegistry(REGISTRY).addressOf("BancorFormula");
uint256 totalSupply = SmartToken(token).totalSupply();
address converter = SmartToken(token).owner();
- uint256 length = BancorConverter(converter).connectorTokenCount();
+ uint256 connectorTokenCount = BancorConverter(converter).connectorTokenCount();
- Component[] memory underlyingTokens = new Component[](length);
+ Component[] memory underlyingTokens = new Component[](connectorTokenCount);
address underlyingToken;
- for (uint256 i = 0; i < length; i++) {
+ uint256 balance;
+ for (uint256 i = 0; i < connectorTokenCount; i++) {
underlyingToken = BancorConverter(converter).connectorTokens(i);
+ if (underlyingToken == ETH) {
+ balance = converter.balance;
+ } else {
+ balance = ERC20(underlyingToken).balanceOf(converter);
+ }
+
underlyingTokens[i] = Component({
token: underlyingToken,
tokenType: "ERC20",
rate: BancorFormula(formula).calculateLiquidateReturn(
totalSupply,
- ERC20(underlyingToken).balanceOf(converter),
+ balance,
uint32(1000000),
uint256(1e18)
)
diff --git a/contracts/adapters/bancor/BancorV2.1Adapter.sol b/contracts/adapters/bancor/BancorV2.1Adapter.sol
new file mode 100755
index 00000000..4ba65d86
--- /dev/null
+++ b/contracts/adapters/bancor/BancorV2.1Adapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {ProtocolAdapter} from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Bancor protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract BancorAdapter is ProtocolAdapter {
+
+string public constant override adapterType = "Asset";
+
+string public constant override tokenType = "SmartToken";
+
+/**
+ * @return Amount of SmartTokens held by the given account.
+ * @param token Address of the pool!
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+function getBalance(address token, address account) external view override returns (uint256) {
+return ERC20(token).balanceOf(account);
+}
+}
diff --git a/contracts/adapters/bancor/BancorV2.1TokenAdapter.sol b/contracts/adapters/bancor/BancorV2.1TokenAdapter.sol
new file mode 100755
index 00000000..4af2b635
--- /dev/null
+++ b/contracts/adapters/bancor/BancorV2.1TokenAdapter.sol
@@ -0,0 +1,103 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {TokenMetadata, Component} from "../../Structs.sol";
+import {TokenAdapter} from "../TokenAdapter.sol";
+
+
+/**
+ * @dev SmartToken contract interface.
+ * Only the functions required for BancorTokenAdapter contract are added.
+ * The SmartToken contract is available here
+ * github.com/bancorprotocol/contracts/blob/master/solidity/contracts/token/SmartToken.sol.
+ */
+interface SmartToken {
+ function owner() external view returns (address);
+
+ function totalSupply() external view returns (uint256);
+}
+
+
+/**
+ * @dev BancorConverter contract interface.
+ * Only the functions required for BancorTokenAdapter contract are added.
+ * The BancorConverter contract is available here
+ * github.com/bancorprotocol/contracts/blob/master/solidity/contracts/converter/BancorConverter.sol.
+ */
+interface BancorConverter {
+ function reserveTokens() external view returns (address[] memory);
+
+ function removeLiquidityReturn(
+ uint256,
+ address[] calldata
+ )
+ external
+ view
+ returns (uint256[] memory);
+}
+
+
+/**
+ * @title Token adapter for SmartTokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract BancorTokenAdapter is TokenAdapter {
+
+ address internal constant REGISTRY = 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token : token,
+ name : ERC20(token).name(),
+ symbol : ERC20(token).symbol(),
+ decimals : ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address converter = SmartToken(token).owner();
+ address[] memory reserveTokens = BancorConverter(converter).reserveTokens();
+ uint256[] memory rates = BancorConverter(converter).removeLiquidityReturn(
+ 1e18,
+ reserveTokens
+ );
+
+ uint256 length = reserveTokens.length;
+ Component[] memory underlyingTokens = new Component[](length);
+
+ for (uint256 i = 0; i < length; i++) {
+ underlyingTokens[i] = Component({
+ token : reserveTokens[i],
+ tokenType : "ERC20",
+ rate : rates[i]
+ });
+ }
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/bancor/BancorV2Adapter.sol b/contracts/adapters/bancor/BancorV2Adapter.sol
new file mode 100755
index 00000000..cc800efa
--- /dev/null
+++ b/contracts/adapters/bancor/BancorV2Adapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Bancor V2 protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract BancorV2Adapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "SmartToken V2";
+
+ /**
+ * @return Amount of SmartTokens V2 held by the given account.
+ * @param token Address of the pool SmartToken V2.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/bancor/BancorV2TokenAdapter.sol b/contracts/adapters/bancor/BancorV2TokenAdapter.sol
new file mode 100755
index 00000000..3b24ed7f
--- /dev/null
+++ b/contracts/adapters/bancor/BancorV2TokenAdapter.sol
@@ -0,0 +1,92 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+interface Ownable {
+ function owner() external view returns (address);
+}
+
+
+/**
+ * @dev LiquidityPoolV2Converter contract interface.
+ * Only the functions required for BancorV2TokenAdapter contract are added.
+ * The LiquidityPoolV2Converter interface is available here
+ * github.com/bancorprotocol/contracts-solidity/blob/master/solidity/contracts/converter/interfaces/IConverter.sol.
+ */
+interface LiquidityPoolV2Converter {
+ function connectorTokenCount() external view returns (uint256);
+ function connectorTokens(uint256) external view returns (address);
+ function poolToken(address) external view returns (address);
+ function removeLiquidityReturnAndFee(address, uint256) external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for SmartTokens V2.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract BancorV2TokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address poolTokensContainer = Ownable(token).owner();
+ address converter = Ownable(poolTokensContainer).owner();
+ uint256 connectorTokenCount = LiquidityPoolV2Converter(converter).connectorTokenCount();
+
+ Component[] memory underlyingTokens = new Component[](1);
+
+ address underlyingToken;
+ for (uint256 i = 0; i < connectorTokenCount; i++) {
+ underlyingToken = LiquidityPoolV2Converter(converter).connectorTokens(i);
+
+ if (LiquidityPoolV2Converter(converter).poolToken(underlyingToken) == token) {
+ underlyingTokens[0] = Component({
+ token: underlyingToken,
+ tokenType: "ERC20",
+ rate: LiquidityPoolV2Converter(converter).removeLiquidityReturnAndFee(
+ token,
+ 1e18
+ )
+ });
+ }
+ }
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/berezka/BerezkaProtocolAdapter.sol b/contracts/adapters/berezka/BerezkaProtocolAdapter.sol
new file mode 100644
index 00000000..98a998bc
--- /dev/null
+++ b/contracts/adapters/berezka/BerezkaProtocolAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Easy Chain.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+/**
+ * @dev BerezkaProtocolAdapterContract contract.
+ * This adapter provides adapter for multiple BerezkaDAO contracts.
+ * @author Vasin Denis
+ */
+contract BerezkaProtocolAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Berezka DAO";
+
+ string public constant override tokenType = "ERC20";
+
+ /**
+ * @return Amount of BerezkaDAO tokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/berezka/BerezkaTokenAdapter.sol b/contracts/adapters/berezka/BerezkaTokenAdapter.sol
new file mode 100644
index 00000000..edfbf7d8
--- /dev/null
+++ b/contracts/adapters/berezka/BerezkaTokenAdapter.sol
@@ -0,0 +1,234 @@
+// Copyright (C) 2020 Easy Chain.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+import { TypedToken } from "./BerezkaTokenAdapterGovernance.sol";
+
+
+interface IBerezkaTokenAdapterGovernance {
+
+ function listTokens() external view returns (TypedToken[] memory);
+
+ function listProtocols() external view returns (address[] memory);
+
+ function listEthProtocols() external view returns (address[] memory);
+
+ function listProducts() external view returns (address[] memory);
+
+ function getVaults(address _token) external view returns (address[] memory);
+}
+
+interface IBerezkaTokenAdapterStakingGovernance {
+
+ function listStakings() external view returns (address[] memory);
+
+}
+
+
+/**
+ * @title Token adapter for Berezka DAO.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Vasin Denis
+ */
+contract BerezkaTokenAdapter is TokenAdapter {
+
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ string internal constant ERC20_TOKEN = "ERC20";
+
+ IBerezkaTokenAdapterGovernance immutable private governance;
+ IBerezkaTokenAdapterStakingGovernance immutable private stakingGovernance;
+
+ constructor(address _governance, address _stakingGovernance) public {
+ governance = IBerezkaTokenAdapterGovernance(_governance);
+ stakingGovernance = IBerezkaTokenAdapterStakingGovernance(_stakingGovernance);
+ }
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token)
+ external
+ view
+ override
+ returns (TokenMetadata memory)
+ {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token)
+ external
+ view
+ override
+ returns (Component[] memory)
+ {
+ address[] memory vaults = governance.getVaults(token);
+ TypedToken[] memory assets = governance.listTokens();
+ address[] memory debtAdapters = governance.listProtocols();
+ address[] memory stakingAdapters = stakingGovernance.listStakings();
+ uint256 length = assets.length;
+ uint256 totalSupply = ERC20(token).totalSupply();
+
+ Component[] memory underlyingTokens = new Component[](1 + length);
+
+ // Handle ERC20 assets + debt
+ for (uint256 i = 0; i < length; i++) {
+ Component memory tokenComponent =
+ _getTokenComponents(
+ assets[i].token,
+ assets[i].tokenType,
+ vaults,
+ debtAdapters,
+ stakingAdapters,
+ totalSupply
+ );
+ underlyingTokens[i] = tokenComponent;
+ }
+
+ // Handle ETH
+ {
+ Component memory ethComponent = _getEthComponents(vaults, totalSupply);
+ underlyingTokens[length] = ethComponent;
+ }
+
+ return underlyingTokens;
+ }
+
+ // Internal functions
+
+ function _getEthComponents(
+ address[] memory _vaults,
+ uint256 _totalSupply
+ )
+ internal
+ view
+ returns (Component memory)
+ {
+ address[] memory debtsInEth = governance.listEthProtocols();
+
+ uint256 ethBalance = 0;
+ uint256 ethDebt = 0;
+
+ // Compute negative amount for a given asset using all debt adapters
+ for (uint256 j = 0; j < _vaults.length; j++) {
+ address vault = _vaults[j];
+ ethBalance += vault.balance;
+ ethDebt += _computeDebt(debtsInEth, ETH, vault);
+ }
+
+ return Component({
+ token: ETH,
+ tokenType: ERC20_TOKEN,
+ rate: (ethBalance * 1e18 / _totalSupply) - (ethDebt * 1e18 / _totalSupply)
+ });
+ }
+
+ function _getTokenComponents(
+ address _asset,
+ string memory _type,
+ address[] memory _vaults,
+ address[] memory _debtAdapters,
+ address[] memory _stakingAdapters,
+ uint256 _totalSupply
+ )
+ internal
+ view
+ returns (Component memory)
+ {
+ uint256 componentBalance = 0;
+ uint256 componentStakingBalance = 0;
+ uint256 componentDebt = 0;
+
+ // Compute positive amount for a given asset
+ uint256 vaultsLength = _vaults.length;
+ for (uint256 j = 0; j < vaultsLength; j++) {
+ address vault = _vaults[j];
+ componentBalance += ERC20(_asset).balanceOf(vault);
+ componentStakingBalance += _computeStakingBalance(_stakingAdapters, _asset, vault);
+ componentDebt += _computeDebt(_debtAdapters, _asset, vault);
+ }
+
+ // Asset amount
+ return(Component({
+ token: _asset,
+ tokenType: _type,
+ rate: (
+ componentBalance * 1e18 / _totalSupply
+ ) + (
+ componentStakingBalance * 1e18 / _totalSupply
+ ) - (
+ componentDebt * 1e18 / _totalSupply
+ )
+ }));
+ }
+
+ function _computeDebt(
+ address[] memory _debtAdapters,
+ address _asset,
+ address _vault
+ )
+ internal
+ view
+ returns (uint256)
+ {
+ // Compute negative amount for a given asset using all debt adapters
+ uint256 componentDebt = 0;
+ uint256 debtsLength = _debtAdapters.length;
+ for (uint256 k = 0; k < debtsLength; k++) {
+ ProtocolAdapter debtAdapter = ProtocolAdapter(_debtAdapters[k]);
+ try debtAdapter.getBalance(_asset, _vault) returns (uint256 _amount) {
+ componentDebt += _amount;
+ } catch {} // solhint-disable-line no-empty-blocks
+ }
+ return componentDebt;
+ }
+
+ function _computeStakingBalance(
+ address[] memory _stakingAdapters,
+ address _asset,
+ address _vault
+ )
+ internal
+ view
+ returns (uint256)
+ {
+ // Compute positive staking amount for a given asset using all staking adapters
+ uint256 componentStakingBalance = 0;
+ uint256 stakingsLength = _stakingAdapters.length;
+ for (uint256 k = 0; k < stakingsLength; k++) {
+ ProtocolAdapter stakingAdapter = ProtocolAdapter(_stakingAdapters[k]);
+ try stakingAdapter.getBalance(_asset, _vault) returns (uint256 _amount) {
+ componentStakingBalance += _amount;
+ } catch {} // solhint-disable-line no-empty-blocks
+ }
+ return componentStakingBalance;
+ }
+}
diff --git a/contracts/adapters/berezka/BerezkaTokenAdapterGovernance.sol b/contracts/adapters/berezka/BerezkaTokenAdapterGovernance.sol
new file mode 100644
index 00000000..a4c8b2e4
--- /dev/null
+++ b/contracts/adapters/berezka/BerezkaTokenAdapterGovernance.sol
@@ -0,0 +1,190 @@
+// Copyright (C) 2020 Easy Chain.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { EnumerableSet } from "./lib/EnumerableSet.sol";
+import { Ownable } from "../../Ownable.sol";
+
+struct TypedToken {
+ string tokenType;
+ address token;
+}
+
+interface AdapterRegistry {
+
+ function isValidTokenAdapter(
+ string calldata tokenAdapterName
+ )
+ external
+ returns (bool);
+}
+
+/**
+ * @dev BerezkaTokenAdapterGovernance contract.
+ * Main function of this contract is to maintains a Structure of BerezkaDAO
+ * @author Vasin Denis
+ */
+contract BerezkaTokenAdapterGovernance is Ownable {
+
+ AdapterRegistry internal constant ADAPTER_REGISTRY =
+ AdapterRegistry(0x06FE76B2f432fdfEcAEf1a7d4f6C3d41B5861672);
+
+ using EnumerableSet for EnumerableSet.AddressSet;
+
+ /// @dev This is a set of plain assets (ERC20) used by DAO.
+ /// This list also include addresses of Uniswap/Balancer tokenized pools.
+ mapping (string => EnumerableSet.AddressSet) private tokens;
+
+ /// @dev This is a list of all token types that are managed by contract
+ /// New token type is added to this list upon first adding a token with given type
+ string[] public tokenTypes;
+
+ /// @dev This is a set of debt protocol adapters that return debt in ETH
+ EnumerableSet.AddressSet private ethProtocols;
+
+ /// @dev This is a set of debt protocol adapters that return debt for ERC20 tokens
+ EnumerableSet.AddressSet private protocols;
+
+ /// @dev This is a mapping from Berezka DAO product to corresponding Vault addresses
+ mapping(address => address[]) private productVaults;
+
+ constructor(address[] memory _protocols, address[] memory _ethProtocols) public {
+ _add(protocols, _protocols);
+ _add(ethProtocols, _ethProtocols);
+ }
+
+ // View functions
+
+ function listTokens() external view returns (TypedToken[] memory) {
+ uint256 tokenLength = tokenTypes.length;
+ uint256 resultLength = 0;
+ for (uint256 i = 0; i < tokenLength; i++) {
+ resultLength += tokens[tokenTypes[i]].length();
+ }
+ TypedToken[] memory result = new TypedToken[](resultLength);
+ uint256 resultIndex = 0;
+ for (uint256 i = 0; i < tokenLength; i++) {
+ string memory tokenType = tokenTypes[i];
+ address[] memory typedTokens = _list(tokens[tokenType]);
+ uint256 typedTokenLength = typedTokens.length;
+ for (uint256 j = 0; j < typedTokenLength; j++) {
+ result[resultIndex] = TypedToken(tokenType, typedTokens[j]);
+ resultIndex++;
+ }
+ }
+ return result;
+ }
+
+ function listTokens(string calldata _type) external view returns (address[] memory) {
+ return _list(tokens[_type]);
+ }
+
+ function listProtocols() external view returns (address[] memory) {
+ return _list(protocols);
+ }
+
+ function listEthProtocols() external view returns (address[] memory) {
+ return _list(ethProtocols);
+ }
+
+ function getVaults(address _token) external view returns (address[] memory) {
+ return productVaults[_token];
+ }
+
+ // Modification functions (all only by owner)
+
+ function setProductVaults(address _product, address[] memory _vaults) public onlyOwner() {
+ require(_product != address(0), "_product is 0");
+ require(_vaults.length > 0, "_vaults.length should be > 0");
+
+ productVaults[_product] = _vaults;
+ }
+
+ function removeProduct(address _product) public onlyOwner() {
+ require(_product != address(0), "_product is 0");
+
+ delete productVaults[_product];
+ }
+
+ function addTokens(string memory _type, address[] memory _tokens) public onlyOwner() {
+ require(_tokens.length > 0, "Length should be > 0");
+ require(ADAPTER_REGISTRY.isValidTokenAdapter(_type), "Invalid token adapter name");
+
+ if (tokens[_type].length() == 0) {
+ tokenTypes.push(_type);
+ }
+ _add(tokens[_type], _tokens);
+ }
+
+ function addProtocols(address[] memory _protocols) public onlyOwner() {
+ require(_protocols.length > 0, "Length should be > 0");
+
+ _add(protocols, _protocols);
+ }
+
+ function addEthProtocols(address[] memory _ethProtocols) public onlyOwner() {
+ require(_ethProtocols.length > 0, "Length should be > 0");
+
+ _add(ethProtocols, _ethProtocols);
+ }
+
+ function removeTokens(string memory _type, address[] memory _tokens) public onlyOwner() {
+ require(_tokens.length > 0, "Length should be > 0");
+
+ _remove(tokens[_type], _tokens);
+ }
+
+ function removeProtocols(address[] memory _protocols) public onlyOwner() {
+ require(_protocols.length > 0, "Length should be > 0");
+
+ _remove(protocols, _protocols);
+ }
+
+ function removeEthProtocols(address[] memory _ethProtocols) public onlyOwner() {
+ require(_ethProtocols.length > 0, "Length should be > 0");
+
+ _remove(ethProtocols, _ethProtocols);
+ }
+
+ function setTokenTypes(string[] memory _tokenTypes) public onlyOwner() {
+ require(_tokenTypes.length > 0, "Length should be > 0");
+
+ tokenTypes = _tokenTypes;
+ }
+
+ // Internal functions
+
+ function _add(EnumerableSet.AddressSet storage _set, address[] memory _addresses) internal {
+ for (uint i = 0; i < _addresses.length; i++) {
+ _set.add(_addresses[i]);
+ }
+ }
+
+ function _remove(EnumerableSet.AddressSet storage _set, address[] memory _addresses) internal {
+ for (uint i = 0; i < _addresses.length; i++) {
+ _set.remove(_addresses[i]);
+ }
+ }
+
+ function _list(EnumerableSet.AddressSet storage _set) internal view returns(address[] memory) {
+ address[] memory result = new address[](_set.length());
+ for (uint i = 0; i < _set.length(); i++) {
+ result[i] = _set.at(i);
+ }
+ return result;
+ }
+}
diff --git a/contracts/adapters/berezka/BerezkaTokenAdapterStakingGovernance.sol b/contracts/adapters/berezka/BerezkaTokenAdapterStakingGovernance.sol
new file mode 100644
index 00000000..b05937b4
--- /dev/null
+++ b/contracts/adapters/berezka/BerezkaTokenAdapterStakingGovernance.sol
@@ -0,0 +1,84 @@
+// Copyright (C) 2020 Easy Chain.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { EnumerableSet } from "./lib/EnumerableSet.sol";
+import { Ownable } from "../../Ownable.sol";
+
+struct TypedToken {
+ string tokenType;
+ address token;
+}
+
+/**
+ * @dev BerezkaTokenAdapterStakingGovernance contract.
+ * Main function of this contract is to maintains a Set of Staking Adapters of Berezka DAO
+ * @author Vasin Denis
+ */
+contract BerezkaTokenAdapterStakingGovernance is Ownable() {
+
+ using EnumerableSet for EnumerableSet.AddressSet;
+
+ /// @dev This is a set of debt protocol adapters that return staked amount of ERC20 tokens
+ EnumerableSet.AddressSet private stakings;
+
+ constructor(address[] memory _stakings) public {
+ _add(stakings, _stakings);
+ }
+
+ // Modification functions (all only by owner)
+
+ function addStakings(address[] memory _stakings) public onlyOwner() {
+ require(_stakings.length > 0, "Length should be > 0");
+
+ _add(stakings, _stakings);
+ }
+
+ function removeStakings(address[] memory _stakings) public onlyOwner() {
+ require(_stakings.length > 0, "Length should be > 0");
+
+ _remove(stakings, _stakings);
+ }
+
+ // View functions
+
+ function listStakings() external view returns (address[] memory) {
+ return _list(stakings);
+ }
+
+ // Internal functions
+
+ function _add(EnumerableSet.AddressSet storage _set, address[] memory _addresses) internal {
+ for (uint i = 0; i < _addresses.length; i++) {
+ _set.add(_addresses[i]);
+ }
+ }
+
+ function _remove(EnumerableSet.AddressSet storage _set, address[] memory _addresses) internal {
+ for (uint i = 0; i < _addresses.length; i++) {
+ _set.remove(_addresses[i]);
+ }
+ }
+
+ function _list(EnumerableSet.AddressSet storage _set) internal view returns(address[] memory) {
+ address[] memory result = new address[](_set.length());
+ for (uint i = 0; i < _set.length(); i++) {
+ result[i] = _set.at(i);
+ }
+ return result;
+ }
+}
diff --git a/contracts/adapters/berezka/lib/EnumerableSet.sol b/contracts/adapters/berezka/lib/EnumerableSet.sol
new file mode 100644
index 00000000..932a042f
--- /dev/null
+++ b/contracts/adapters/berezka/lib/EnumerableSet.sol
@@ -0,0 +1,243 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.5;
+
+/**
+ * @dev Library for managing
+ * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
+ * types.
+ *
+ * Sets have the following properties:
+ *
+ * - Elements are added, removed, and checked for existence in constant time
+ * (O(1)).
+ * - Elements are enumerated in O(n). No guarantees are made on the ordering.
+ *
+ * ```
+ * contract Example {
+ * // Add the library methods
+ * using EnumerableSet for EnumerableSet.AddressSet;
+ *
+ * // Declare a set state variable
+ * EnumerableSet.AddressSet private mySet;
+ * }
+ * ```
+ *
+ * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
+ * (`UintSet`) are supported.
+ */
+library EnumerableSet {
+ // To implement this library for multiple types with as little code
+ // repetition as possible, we write it in terms of a generic Set type with
+ // bytes32 values.
+ // The Set implementation uses private functions, and user-facing
+ // implementations (such as AddressSet) are just wrappers around the
+ // underlying Set.
+ // This means that we can only create new EnumerableSets for types that fit
+ // in bytes32.
+
+ struct Set {
+ // Storage of set values
+ bytes32[] _values;
+
+ // Position of the value in the `values` array, plus 1 because index 0
+ // means a value is not in the set.
+ mapping (bytes32 => uint256) _indexes;
+ }
+
+ /**
+ * @dev Add a value to a set. O(1).
+ *
+ * Returns true if the value was added to the set, that is if it was not
+ * already present.
+ */
+ function _add(Set storage set, bytes32 value) private returns (bool) {
+ if (!_contains(set, value)) {
+ set._values.push(value);
+ // The value is stored at length-1, but we add 1 to all indexes
+ // and use 0 as a sentinel value
+ set._indexes[value] = set._values.length;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @dev Removes a value from a set. O(1).
+ *
+ * Returns true if the value was removed from the set, that is if it was
+ * present.
+ */
+ function _remove(Set storage set, bytes32 value) private returns (bool) {
+ // We read and store the value's index to prevent multiple reads from the same storage slot
+ uint256 valueIndex = set._indexes[value];
+
+ if (valueIndex != 0) { // Equivalent to contains(set, value)
+ // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
+ // the array, and then remove the last element (sometimes called as 'swap and pop').
+ // This modifies the order of the array, as noted in {at}.
+
+ uint256 toDeleteIndex = valueIndex - 1;
+ uint256 lastIndex = set._values.length - 1;
+
+ // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
+ // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
+
+ bytes32 lastvalue = set._values[lastIndex];
+
+ // Move the last value to the index where the value to delete is
+ set._values[toDeleteIndex] = lastvalue;
+ // Update the index for the moved value
+ set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
+
+ // Delete the slot where the moved value was stored
+ set._values.pop();
+
+ // Delete the index for the deleted slot
+ delete set._indexes[value];
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @dev Returns true if the value is in the set. O(1).
+ */
+ function _contains(Set storage set, bytes32 value) private view returns (bool) {
+ return set._indexes[value] != 0;
+ }
+
+ /**
+ * @dev Returns the number of values on the set. O(1).
+ */
+ function _length(Set storage set) private view returns (uint256) {
+ return set._values.length;
+ }
+
+ /**
+ * @dev Returns the value stored at position `index` in the set. O(1).
+ *
+ * Note that there are no guarantees on the ordering of values inside the
+ * array, and it may change when more values are added or removed.
+ *
+ * Requirements:
+ *
+ * - `index` must be strictly less than {length}.
+ */
+ function _at(Set storage set, uint256 index) private view returns (bytes32) {
+ require(set._values.length > index, "EnumerableSet: index out of bounds");
+ return set._values[index];
+ }
+
+ // AddressSet
+
+ struct AddressSet {
+ Set _inner;
+ }
+
+ /**
+ * @dev Add a value to a set. O(1).
+ *
+ * Returns true if the value was added to the set, that is if it was not
+ * already present.
+ */
+ function add(AddressSet storage set, address value) internal returns (bool) {
+ return _add(set._inner, bytes32(uint256(value)));
+ }
+
+ /**
+ * @dev Removes a value from a set. O(1).
+ *
+ * Returns true if the value was removed from the set, that is if it was
+ * present.
+ */
+ function remove(AddressSet storage set, address value) internal returns (bool) {
+ return _remove(set._inner, bytes32(uint256(value)));
+ }
+
+ /**
+ * @dev Returns true if the value is in the set. O(1).
+ */
+ function contains(AddressSet storage set, address value) internal view returns (bool) {
+ return _contains(set._inner, bytes32(uint256(value)));
+ }
+
+ /**
+ * @dev Returns the number of values in the set. O(1).
+ */
+ function length(AddressSet storage set) internal view returns (uint256) {
+ return _length(set._inner);
+ }
+
+ /**
+ * @dev Returns the value stored at position `index` in the set. O(1).
+ *
+ * Note that there are no guarantees on the ordering of values inside the
+ * array, and it may change when more values are added or removed.
+ *
+ * Requirements:
+ *
+ * - `index` must be strictly less than {length}.
+ */
+ function at(AddressSet storage set, uint256 index) internal view returns (address) {
+ return address(uint256(_at(set._inner, index)));
+ }
+
+
+ // UintSet
+
+ struct UintSet {
+ Set _inner;
+ }
+
+ /**
+ * @dev Add a value to a set. O(1).
+ *
+ * Returns true if the value was added to the set, that is if it was not
+ * already present.
+ */
+ function add(UintSet storage set, uint256 value) internal returns (bool) {
+ return _add(set._inner, bytes32(value));
+ }
+
+ /**
+ * @dev Removes a value from a set. O(1).
+ *
+ * Returns true if the value was removed from the set, that is if it was
+ * present.
+ */
+ function remove(UintSet storage set, uint256 value) internal returns (bool) {
+ return _remove(set._inner, bytes32(value));
+ }
+
+ /**
+ * @dev Returns true if the value is in the set. O(1).
+ */
+ function contains(UintSet storage set, uint256 value) internal view returns (bool) {
+ return _contains(set._inner, bytes32(value));
+ }
+
+ /**
+ * @dev Returns the number of values on the set. O(1).
+ */
+ function length(UintSet storage set) internal view returns (uint256) {
+ return _length(set._inner);
+ }
+
+ /**
+ * @dev Returns the value stored at position `index` in the set. O(1).
+ *
+ * Note that there are no guarantees on the ordering of values inside the
+ * array, and it may change when more values are added or removed.
+ *
+ * Requirements:
+ *
+ * - `index` must be strictly less than {length}.
+ */
+ function at(UintSet storage set, uint256 index) internal view returns (uint256) {
+ return uint256(_at(set._inner, index));
+ }
+}
\ No newline at end of file
diff --git a/contracts/adapters/bzx/BzxAssetAdapter.sol b/contracts/adapters/bzx/BzxAssetAdapter.sol
new file mode 100755
index 00000000..738cdfce
--- /dev/null
+++ b/contracts/adapters/bzx/BzxAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Asset adapter for bZx protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Roman Iftodi
+ */
+contract BzxAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "iToken";
+
+ /**
+ * @return Amount of iTokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/bzx/BzxDebtAdapter.sol b/contracts/adapters/bzx/BzxDebtAdapter.sol
new file mode 100755
index 00000000..93de2f65
--- /dev/null
+++ b/contracts/adapters/bzx/BzxDebtAdapter.sol
@@ -0,0 +1,104 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+enum LoanType {
+ All,
+ Margin,
+ NonMargin
+}
+
+
+struct LoanReturnData {
+ bytes32 loanId;
+ uint96 endTimestamp;
+ address loanToken;
+ address collateralToken;
+ uint256 principal;
+ uint256 collateral;
+ uint256 interestOwedPerDay;
+ uint256 interestDepositRemaining;
+ uint256 startRate;
+ uint256 startMargin;
+ uint256 maintenanceMargin;
+ uint256 currentMargin;
+ uint256 maxLoanTerm;
+ uint256 maxLiquidatable;
+ uint256 maxSeizable;
+}
+
+
+interface TheProtocol {
+ function getUserLoans(
+ address user,
+ uint256 start,
+ uint256 count,
+ LoanType loanType,
+ bool isLender,
+ bool unsafeOnly)
+ external
+ view
+ returns (LoanReturnData[] memory loansData);
+
+ function getActiveLoansCount()
+ external
+ view
+ returns (uint256);
+}
+
+
+/**
+ * @title Debt adapter for bZx protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Roman Iftodi
+ */
+contract BzxDebtAdapter is ProtocolAdapter {
+
+ address internal constant bZxContract = 0xD8Ee69652E4e4838f2531732a46d1f7F584F0b7f;
+
+ string public constant override adapterType = "Debt";
+
+ string public constant override tokenType = "ERC20";
+
+ /**
+ * @return Amount of debt of the given account for the protocol.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ LoanReturnData[] memory loans;
+ loans = TheProtocol(bZxContract).getUserLoans(
+ account,
+ 0,
+ TheProtocol(bZxContract).getActiveLoansCount(),
+ LoanType.All,
+ false,
+ false
+ );
+
+ uint256 principal = 0;
+ uint256 loanLenght = loans.length;
+ for(uint256 i = 0; i < loanLenght; i++) {
+ if (loans[i].loanToken == token) {
+ principal += loans[i].principal;
+ }
+ }
+ return principal;
+ }
+}
diff --git a/contracts/adapters/bzx/BzxTokenAdapter.sol b/contracts/adapters/bzx/BzxTokenAdapter.sol
new file mode 100755
index 00000000..c0ac2937
--- /dev/null
+++ b/contracts/adapters/bzx/BzxTokenAdapter.sol
@@ -0,0 +1,77 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+interface TheProtocol {
+ function loanPoolToUnderlying(address iToken)
+ external
+ view
+ returns(address);
+}
+
+
+interface IToken {
+ function tokenPrice()
+ external
+ view
+ returns(uint256);
+}
+
+
+/**
+ * @title Token adapter for iTokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Roman Iftodi
+ */
+contract BzxTokenAdapter is TokenAdapter {
+
+ address internal constant bZxContract = 0xD8Ee69652E4e4838f2531732a46d1f7F584F0b7f;
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ Component[] memory underlyingTokens = new Component[](1);
+
+ underlyingTokens[0] = Component({
+ token: TheProtocol(bZxContract).loanPoolToUnderlying(token),
+ tokenType: "ERC20",
+ rate: IToken(token).tokenPrice()
+ });
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/compound/CompoundDebtAdapter.sol b/contracts/adapters/compound/CompoundDebtAdapter.sol
index 0a8899c1..2008fbc7 100755
--- a/contracts/adapters/compound/CompoundDebtAdapter.sol
+++ b/contracts/adapters/compound/CompoundDebtAdapter.sol
@@ -48,7 +48,7 @@ interface CompoundRegistry {
*/
contract CompoundDebtAdapter is ProtocolAdapter {
- address internal constant REGISTRY = 0xE6881a7d699d3A350Ce5bba0dbD59a9C36778Cb7;
+ address internal constant REGISTRY = 0x745eC6C92E3Fa2Ac470B3323128c6ad2eAB21d67;
string public constant override adapterType = "Debt";
@@ -59,8 +59,8 @@ contract CompoundDebtAdapter is ProtocolAdapter {
* @dev Implementation of ProtocolAdapter interface function.
*/
function getBalance(address token, address account) external view override returns (uint256) {
- CToken cToken = CToken(CompoundRegistry(REGISTRY).getCToken(token));
+ address cToken = CompoundRegistry(REGISTRY).getCToken(token);
- return cToken.borrowBalanceStored(account);
+ return CToken(cToken).borrowBalanceStored(account);
}
}
diff --git a/contracts/adapters/compound/CompoundGovernanceAdapter.sol b/contracts/adapters/compound/CompoundGovernanceAdapter.sol
new file mode 100644
index 00000000..9657c396
--- /dev/null
+++ b/contracts/adapters/compound/CompoundGovernanceAdapter.sol
@@ -0,0 +1,141 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev CompMarketState contract interface.
+ * Only the functions required for CompoundGovernanceAdapter contract are added.
+ * The CompMarketState struct is available here
+ * github.com/compound-finance/compound-protocol/blob/master/contracts/ComptrollerStorage.sol.
+ */
+struct CompMarketState {
+ uint224 index;
+ uint32 block;
+}
+
+
+/**
+ * @dev Comptroller contract interface.
+ * Only the functions required for CompoundGovernanceAdapter contract are added.
+ * The Comptroller contract is available here
+ * github.com/compound-finance/compound-protocol/blob/master/contracts/Comptroller.sol.
+ */
+interface Comptroller {
+ function getAllMarkets() external view returns (address[] memory);
+ function compBorrowState(address) external view returns (CompMarketState memory);
+ function compSupplyState(address) external view returns (CompMarketState memory);
+ function compBorrowerIndex(address, address) external view returns (uint256);
+ function compSupplierIndex(address, address) external view returns (uint256);
+ function compAccrued(address) external view returns (uint256);
+}
+
+
+/**
+ * @dev CToken contract interface.
+ * Only the functions required for CompoundGovernanceAdapter contract are added.
+ * The CToken contract is available here
+ * github.com/compound-finance/compound-protocol/blob/master/contracts/CToken.sol.
+ */
+interface CToken {
+ function borrowBalanceStored(address) external view returns (uint256);
+ function borrowIndex() external view returns (uint256);
+ function balanceOf(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Asset adapter for Compound Governance.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract CompoundGovernanceAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant COMPTROLLER = 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B;
+
+ address internal constant COMP = 0xc00e94Cb662C3520282E6f5717214004A7f26888;
+
+ /**
+ * @return Amount of unclaimed COMP by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token != COMP) {
+ return 0;
+ } else {
+ uint256 balance = Comptroller(COMPTROLLER).compAccrued(account);
+ address[] memory allMarkets = Comptroller(COMPTROLLER).getAllMarkets();
+
+ for (uint256 i = 0; i < allMarkets.length; i++) {
+ balance += borrowerComp(account, allMarkets[i]);
+ balance += supplierComp(account, allMarkets[i]);
+ }
+
+ return balance;
+ }
+ }
+
+ function borrowerComp(address account, address cToken) internal view returns (uint256) {
+ uint256 borrowerIndex = Comptroller(COMPTROLLER).compBorrowerIndex(cToken, account);
+
+ if (borrowerIndex > 0) {
+ uint256 borrowIndex = uint256(Comptroller(COMPTROLLER).compBorrowState(cToken).index);
+ require(borrowIndex >= borrowerIndex, "CGA: underflow!");
+ uint256 deltaIndex = borrowIndex - borrowerIndex;
+ uint256 borrowerAmount = mul(
+ CToken(cToken).borrowBalanceStored(account),
+ 1e18
+ ) / CToken(cToken).borrowIndex();
+ uint256 borrowerDelta = mul(borrowerAmount, deltaIndex) / 1e36;
+ return borrowerDelta;
+ } else {
+ return 0;
+ }
+ }
+
+ function supplierComp(address account, address cToken) internal view returns (uint256) {
+ uint256 supplierIndex = Comptroller(COMPTROLLER).compSupplierIndex(cToken, account);
+ uint256 supplyIndex = uint256(Comptroller(COMPTROLLER).compSupplyState(cToken).index);
+ if (supplierIndex == 0 && supplyIndex > 0) {
+ supplierIndex = 1e36;
+ }
+ require(supplyIndex >= supplierIndex, "CGA: underflow!");
+ uint256 deltaIndex = supplyIndex - supplierIndex;
+ uint256 supplierAmount = CToken(cToken).balanceOf(account);
+ uint256 supplierDelta = mul(supplierAmount, deltaIndex) / 1e36;
+
+ return supplierDelta;
+ }
+
+ function mul(uint256 a, uint256 b) internal pure returns (uint256) {
+ if (a == 0) {
+ return 0;
+ }
+
+ uint256 c = a * b;
+ require(c / a == b, "CGA: mul overflow");
+
+ return c;
+ }
+}
diff --git a/contracts/adapters/compound/CompoundRegistry.sol b/contracts/adapters/compound/CompoundRegistry.sol
index 93230d45..b998128d 100755
--- a/contracts/adapters/compound/CompoundRegistry.sol
+++ b/contracts/adapters/compound/CompoundRegistry.sol
@@ -15,6 +15,8 @@
pragma solidity 0.6.5;
+import { Ownable } from "../../Ownable.sol";
+
/**
* @title Registry for Compound contracts.
@@ -23,9 +25,9 @@ pragma solidity 0.6.5;
* of CToken contract for the given token address.
* @author Igor Sobolev
*/
-contract CompoundRegistry {
+contract CompoundRegistry is Ownable {
- mapping (address => address) internal cTokens;
+ mapping(address => address) internal cTokens;
constructor() public {
cTokens[0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359] = 0xF5DCe57282A584D2746FaF1593d3121Fcac444dC;
@@ -36,6 +38,12 @@ contract CompoundRegistry {
cTokens[0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599] = 0xC11b1268C1A384e55C48c2391d8d480264A3A7F4;
cTokens[0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48] = 0x39AA39c021dfbaE8faC545936693aC917d5E7563;
cTokens[0xE41d2489571d322189246DaFA5ebDe1F4699F498] = 0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407;
+ cTokens[0xdAC17F958D2ee523a2206206994597C13D831ec7] = 0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9;
+ cTokens[0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984] = 0x35A18000230DA775CAc24873d00Ff85BccdeD550;
+ }
+
+ function setCToken(address token, address cToken) external onlyOwner returns (address) {
+ return cTokens[token] = cToken;
}
function getCToken(address token) external view returns (address) {
diff --git a/contracts/adapters/compound/CompoundTokenAdapter.sol b/contracts/adapters/compound/CompoundTokenAdapter.sol
index 086b56f4..4f34bdc9 100755
--- a/contracts/adapters/compound/CompoundTokenAdapter.sol
+++ b/contracts/adapters/compound/CompoundTokenAdapter.sol
@@ -43,6 +43,7 @@ contract CompoundTokenAdapter is TokenAdapter {
address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
address internal constant CETH = 0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5;
+ address internal constant CRETH = 0xD06527D5e56A3495252A528C4987003b712860eE;
address internal constant CSAI = 0xF5DCe57282A584D2746FaF1593d3121Fcac444dC;
/**
@@ -87,6 +88,10 @@ contract CompoundTokenAdapter is TokenAdapter {
* @dev Internal function to retrieve underlying token.
*/
function getUnderlying(address token) internal view returns (address) {
- return token == CETH ? ETH : CToken(token).underlying();
+ if (token == CETH || token == CRETH) {
+ return ETH;
+ } else {
+ return CToken(token).underlying();
+ }
}
}
diff --git a/contracts/adapters/cream/CreamAssetAdapter.sol b/contracts/adapters/cream/CreamAssetAdapter.sol
new file mode 100755
index 00000000..eea92fa6
--- /dev/null
+++ b/contracts/adapters/cream/CreamAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Asset adapter for C.R.E.A.M. protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract CreamAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "CToken";
+
+ /**
+ * @return Amount of CTokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/cream/CreamDebtAdapter.sol b/contracts/adapters/cream/CreamDebtAdapter.sol
new file mode 100755
index 00000000..3d3571de
--- /dev/null
+++ b/contracts/adapters/cream/CreamDebtAdapter.sol
@@ -0,0 +1,66 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev CToken contract interface.
+ * Only the functions required for CompoundDebtAdapter contract are added.
+ * The CToken contract is available here
+ * github.com/compound-finance/compound-protocol/blob/master/contracts/CToken.sol.
+ */
+interface CToken {
+ function borrowBalanceStored(address) external view returns (uint256);
+}
+
+
+/**
+ * @dev CompoundRegistry contract interface.
+ * Only the functions required for CompoundDebtAdapter contract are added.
+ * The CompoundRegistry contract is available in this repository.
+ */
+interface CreamRegistry {
+ function getCToken(address) external view returns (address);
+}
+
+
+/**
+ * @title Debt adapter for C.R.E.A.M. protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract CreamDebtAdapter is ProtocolAdapter {
+
+ address internal constant REGISTRY = 0xecD78d9b6B6DAa268Ea7524557c361FCc8a323b7;
+
+ string public constant override adapterType = "Debt";
+
+ string public constant override tokenType = "ERC20";
+
+ /**
+ * @return Amount of debt of the given account for the protocol.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ address cToken = CreamRegistry(REGISTRY).getCToken(token);
+
+ return CToken(cToken).borrowBalanceStored(account);
+ }
+}
diff --git a/contracts/adapters/cream/CreamRegistry.sol b/contracts/adapters/cream/CreamRegistry.sol
new file mode 100755
index 00000000..40c1a9b5
--- /dev/null
+++ b/contracts/adapters/cream/CreamRegistry.sol
@@ -0,0 +1,55 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+
+
+/**
+ * @title Registry for Cream contracts.
+ * @dev Implements the only function - getCToken(address).
+ * @notice Call getCToken(token) function and get address
+ * of CToken contract for the given token address.
+ * @author Igor Sobolev
+ */
+contract CreamRegistry {
+
+ mapping(address => address) internal cTokens;
+
+ constructor() public {
+ cTokens[0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE] = 0xD06527D5e56A3495252A528C4987003b712860eE;
+ cTokens[0xdAC17F958D2ee523a2206206994597C13D831ec7] = 0x797AAB1ce7c01eB727ab980762bA88e7133d2157;
+ cTokens[0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48] = 0x44fbeBd2F576670a6C33f6Fc0B00aA8c5753b322;
+ cTokens[0xc00e94Cb662C3520282E6f5717214004A7f26888] = 0x19D1666f543D42ef17F66E376944A22aEa1a8E46;
+ cTokens[0xba100000625a3754423978a60c9317c58a424e3D] = 0xcE4Fe9b4b8Ff61949DCfeB7e03bc9FAca59D2Eb3;
+ cTokens[0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e] = 0xCbaE0A83f4f9926997c8339545fb8eE32eDc6b76;
+ cTokens[0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8] = 0x9baF8a5236d44AC410c0186Fe39178d5AAD0Bb87;
+ cTokens[0x514910771AF9Ca656af840dff83E8264EcF986CA] = 0x697256CAA3cCaFD62BB6d3Aa1C7C5671786A5fD9;
+ cTokens[0x2ba592F78dB6436527729929AAf6c908497cB200] = 0x892B14321a4FCba80669aE30Bd0cd99a7ECF6aC0;
+ cTokens[0x80fB784B7eD66730e8b1DBd9820aFD29931aab03] = 0x8B86e0598616a8d4F1fdAE8b59E55FB5Bc33D0d6;
+ cTokens[0xD533a949740bb3306d119CC777fa900bA034cd52] = 0xc7Fd8Dcee4697ceef5a2fd4608a7BD6A94C77480;
+ cTokens[0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D] = 0x17107f40d70f4470d20CB3f138a052cAE8EbD4bE;
+ cTokens[0x4Fabb145d64652a948d72533023f6E7A623C7C53] = 0x1FF8CDB51219a8838b52E9cAc09b71e591BC998e;
+ cTokens[0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2] = 0x3623387773010d9214B10C551d6e7fc375D31F58;
+ cTokens[0x5dbcF33D8c2E976c6b560249878e6F1491Bca25c] = 0x4EE15f44c6F0d8d1136c83EfD2e8E4AC768954c6;
+ cTokens[0x6B3595068778DD592e39A122f4f5a5cF09C90fE2] = 0x338286C0BC081891A4Bda39C7667ae150bf5D206;
+ cTokens[0x50D1c9771902476076eCFc8B2A83Ad6b9355a4c9] = 0x10FDBD1e48eE2fD9336a482D746138AE19e649Db;
+ cTokens[0xe1237aA7f535b0CC33Fd973D66cBf830354D16c7] = 0x01da76DEa59703578040012357b81ffE62015C2d;
+ cTokens[0x476c5E26a75bd202a9683ffD34359C0CC15be0fF] = 0xef58b2d5A1b8D3cDE67b8aB054dC5C831E9Bc025;
+ }
+
+ function getCToken(address token) external view returns (address) {
+ return cTokens[token];
+ }
+}
diff --git a/contracts/adapters/cream/CreamStakingAdapter.sol b/contracts/adapters/cream/CreamStakingAdapter.sol
new file mode 100644
index 00000000..197a91ae
--- /dev/null
+++ b/contracts/adapters/cream/CreamStakingAdapter.sol
@@ -0,0 +1,152 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for YearnStakingV1Adapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for C.R.E.A.M. protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract CreamStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant BALANCER_CREAM_WETH = 0x5a82503652d05B21780f33178FDF53d31c29B916;
+ address internal constant UNISWAP_CREAM_WETH = 0xddF9b7a31b32EBAF5c064C80900046C9e5b7C65F;
+ address internal constant CREAM_CREAM_USDC = 0x4Fd2d9d6eF05E13Bf0B167509151A4EC3D4d4b93;
+ address internal constant CREAM_CREAM_WETH = 0xa49b3c7C260ce8A7C665e20Af8aA6E099A86cf8A;
+ address internal constant CREAM_CRCREAM_CRYFI = 0xA65405e0dD378C65308deAE51dA9e3BcEBb81261;
+ address internal constant CREAM_CRYETH_CRYYCRV = 0xB3284F2F22563F27cEF2912637b6A00F162317c4;
+ address internal constant CREAM_CRYETH_WETH = 0x6a3B875854f5518E85Ef97620c5e7de75bbc3fA0;
+ address internal constant CREAM_YYCRV_USDC = 0x661b94d96ADb18646e791A06576F7905a8d1BEF6;
+ address internal constant CREAM_YFI_USDC = 0x7350c6D00D63AB5988250aea347f277c19BEA785;
+ address internal constant CREAM_UNI_WETH = 0x02566303A0E860EC66D3B79168459978B1b00C8e;
+ address internal constant CREAM_UNI_CREAM = 0x408e75C26e6182476940ece5b0Ba6491b4F13359;
+ address internal constant CREAM_CYUSD_CREAM = 0xaAF841fd6409c136FA4b960e22A92B45B26c9b41;
+ address internal constant CYUSD = 0x1D09144F3479bb805CB7c92346987420BcbDC10C;
+ address internal constant CRCREAM = 0x892B14321a4FCba80669aE30Bd0cd99a7ECF6aC0;
+ address internal constant CREAM = 0x2ba592F78dB6436527729929AAf6c908497cB200;
+
+ address internal constant BALANCER_CREAM_WETH_POOL = 0xCcD5cb3401704AF8462a4FFE708a180d3C5c4Da0;
+ address internal constant BALANCER_CREAM_WETH_POOL_2 = 0xc29E89845fA794Aa0A0B8823de23B760c3d766F5;
+ address internal constant UNISWAP_CREAM_WETH_POOL = 0x65bC20147E2cA6F3bf0819c38E519F8792043b36;
+ address internal constant CREAM_CREAM_USDC_POOL = 0x1676fc274B65966ED0c6438a26d34c6C92A5981C;
+ address internal constant CREAM_CREAM_WETH_POOL = 0x43a8ecE49718E22D21077000768afF91849BCEfF;
+ address internal constant CREAM_CRCREAM_CRYFI_POOL = 0xCC5f8cA88cAbA27f15746aeb481F0C446991F863;
+ address internal constant CREAM_CRYETH_CRYYCRV_POOL = 0xD032BfeDC68CE5067E3E0b766Dbcf653ceEA541a;
+ address internal constant CREAM_CRYETH_WETH_POOL = 0xCF679b2E16498a866Bd4CBda60d42f208084c6E1;
+ address internal constant CREAM_YYCRV_USDC_POOL = 0xB8c3a282De181889EF20488e73e7A149a8C1bFe1;
+ address internal constant CREAM_YFI_USDC_POOL = 0x2aB765c2B4A4E197fBAE769f86870F2310A04D61;
+ address internal constant CREAM_UNI_WETH_POOL = 0xe539416a21F6D7eF7e143f1435484d333c274480;
+ address internal constant CREAM_UNI_CREAM_POOL = 0x1E5fe7bAd3672D0d0cc041B7154331EE461C3349;
+ address internal constant CREAM_CYUSD_CREAM_POOL = 0xAE76E0D0C4767E94Eb2898f42A96696Ae0061cEA;
+ address internal constant CREAM_1_YEAR_POOL = 0x780F75ad0B02afeb6039672E6a6CEDe7447a8b45;
+ address internal constant CREAM_2_YEAR_POOL = 0xBdc3372161dfd0361161e06083eE5D52a9cE7595;
+ address internal constant CREAM_3_YEAR_POOL = 0xD5586C1804D2e1795f3FBbAfB1FBB9099ee20A6c;
+ address internal constant CREAM_4_YEAR_POOL = 0xE618C25f580684770f2578FAca31fb7aCB2F5945;
+ address internal constant CYUSD_POOL = 0x0b471a71c3f6d4aADc7eb20AaB7D730Ae385e150;
+ address internal constant CRCREAM_POOL = 0x3ba3C0e8a9E5F4a01ce8e086B3d8e8a603a2129E;
+
+ /**
+ * @return Amount of staked tokens / rewards earned after staking for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == CREAM) {
+ uint256 totalRewards = 0;
+
+ totalRewards += ERC20(CREAM_1_YEAR_POOL).balanceOf(account);
+ totalRewards += ERC20(CREAM_2_YEAR_POOL).balanceOf(account);
+ totalRewards += ERC20(CREAM_3_YEAR_POOL).balanceOf(account);
+ totalRewards += ERC20(CREAM_4_YEAR_POOL).balanceOf(account);
+
+ totalRewards += StakingRewards(BALANCER_CREAM_WETH_POOL).earned(account);
+ totalRewards += StakingRewards(BALANCER_CREAM_WETH_POOL_2).earned(account);
+ totalRewards += StakingRewards(UNISWAP_CREAM_WETH_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_CREAM_USDC_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_CREAM_WETH_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_CRCREAM_CRYFI_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_CRYETH_CRYYCRV_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_CRYETH_WETH_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_YYCRV_USDC_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_YFI_USDC_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_UNI_WETH_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_UNI_CREAM_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_CYUSD_CREAM_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_1_YEAR_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_2_YEAR_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_3_YEAR_POOL).earned(account);
+ totalRewards += StakingRewards(CREAM_4_YEAR_POOL).earned(account);
+ totalRewards += StakingRewards(CYUSD_POOL).earned(account);
+ totalRewards += StakingRewards(CRCREAM_POOL).earned(account);
+
+ return totalRewards;
+ } else if (token == BALANCER_CREAM_WETH) {
+ uint256 totalBalance = 0;
+
+ totalBalance += ERC20(BALANCER_CREAM_WETH_POOL).balanceOf(account);
+ totalBalance += ERC20(BALANCER_CREAM_WETH_POOL_2).balanceOf(account);
+
+ return totalBalance;
+ } else if (token == UNISWAP_CREAM_WETH) {
+ return ERC20(UNISWAP_CREAM_WETH_POOL).balanceOf(account);
+ } else if (token == CREAM_CREAM_USDC) {
+ return ERC20(CREAM_CREAM_USDC_POOL).balanceOf(account);
+ } else if (token == CREAM_CREAM_WETH) {
+ return ERC20(CREAM_CREAM_WETH_POOL).balanceOf(account);
+ } else if (token == CREAM_CRCREAM_CRYFI) {
+ return ERC20(CREAM_CRCREAM_CRYFI_POOL).balanceOf(account);
+ } else if (token == CREAM_CRYETH_CRYYCRV) {
+ return ERC20(CREAM_CRYETH_CRYYCRV_POOL).balanceOf(account);
+ } else if (token == CREAM_CRYETH_WETH) {
+ return ERC20(CREAM_CRYETH_WETH_POOL).balanceOf(account);
+ } else if (token == CREAM_YYCRV_USDC) {
+ return ERC20(CREAM_YYCRV_USDC_POOL).balanceOf(account);
+ } else if (token == CREAM_YFI_USDC) {
+ return ERC20(CREAM_YFI_USDC_POOL).balanceOf(account);
+ } else if (token == CRCREAM) {
+ return ERC20(CRCREAM_POOL).balanceOf(account);
+ } else if (token == CREAM_UNI_WETH) {
+ return ERC20(CREAM_UNI_WETH_POOL).balanceOf(account);
+ } else if (token == CREAM_UNI_CREAM) {
+ return ERC20(CREAM_UNI_CREAM_POOL).balanceOf(account);
+ } else if (token == CREAM_CYUSD_CREAM) {
+ return ERC20(CREAM_CYUSD_CREAM_POOL).balanceOf(account);
+ } else if (token == CYUSD) {
+ return ERC20(CYUSD_POOL).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/curve/CurveRegistry.sol b/contracts/adapters/curve/CurveRegistry.sol
new file mode 100644
index 00000000..788367ba
--- /dev/null
+++ b/contracts/adapters/curve/CurveRegistry.sol
@@ -0,0 +1,102 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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 .
+//
+// SPDX-License-Identifier: LGPL-3.0-only
+
+pragma solidity 0.6.5;
+
+import { Ownable } from "../../Ownable.sol";
+
+
+struct PoolInfo {
+ address swap; // stableswap contract address.
+ uint256 totalCoins; // Number of coins used in stableswap contract.
+ string name; // Pool name ("... Pool").
+}
+
+
+/**
+ * @title Registry for Curve contracts.
+ * @dev Implements two getters - getSwapAndTotalCoins(address) and getName(address).
+ * @notice Call getSwapAndTotalCoins(token) and getName(address) function and get address,
+ * coins number, and name of stableswap contract for the given token address.
+ * @author Igor Sobolev
+ */
+contract CurveRegistry is Ownable {
+
+ mapping (address => PoolInfo) internal poolInfo;
+
+ constructor() public {
+ poolInfo[0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2] = PoolInfo({
+ swap: 0xA2B47E3D5c44877cca798226B7B8118F9BFb7A56,
+ totalCoins: 2,
+ name: "Compound Pool"
+ });
+ poolInfo[0x9fC689CCaDa600B6DF723D9E47D84d76664a1F23] = PoolInfo({
+ swap: 0x52EA46506B9CC5Ef470C5bf89f17Dc28bB35D85C,
+ totalCoins: 3,
+ name: "T Pool"
+ });
+ poolInfo[0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8] = PoolInfo({
+ swap: 0x45F783CCE6B7FF23B2ab2D70e416cdb7D6055f51,
+ totalCoins: 4,
+ name: "Y Pool"
+ });
+ poolInfo[0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B] = PoolInfo({
+ swap: 0x79a8C46DeA5aDa233ABaFFD40F3A0A2B1e5A4F27,
+ totalCoins: 4,
+ name: "bUSD Pool"
+ });
+ poolInfo[0xC25a3A3b969415c80451098fa907EC722572917F] = PoolInfo({
+ swap: 0xA5407eAE9Ba41422680e2e00537571bcC53efBfD,
+ totalCoins: 4,
+ name: "sUSD Pool"
+ });
+ poolInfo[0xD905e2eaeBe188fc92179b6350807D8bd91Db0D8] = PoolInfo({
+ swap: 0x06364f10B501e868329afBc005b3492902d6C763,
+ totalCoins: 4,
+ name: "PAX Pool"
+ });
+ poolInfo[0x49849C98ae39Fff122806C06791Fa73784FB3675] = PoolInfo({
+ swap: 0x93054188d876f558f4a66B2EF1d97d16eDf0895B,
+ totalCoins: 2,
+ name: "renBTC Pool"
+ });
+ }
+
+ function setPoolInfo(
+ address token,
+ address swap,
+ uint256 totalCoins,
+ string calldata name
+ )
+ external
+ onlyOwner
+ {
+ poolInfo[token] = PoolInfo({
+ swap: swap,
+ totalCoins: totalCoins,
+ name: name
+ });
+ }
+
+ function getSwapAndTotalCoins(address token) external view returns (address, uint256) {
+ return (poolInfo[token].swap, poolInfo[token].totalCoins);
+ }
+
+ function getName(address token) external view returns (string memory) {
+ return poolInfo[token].name;
+ }
+}
diff --git a/contracts/adapters/curve/CurveStakingAdapter.sol b/contracts/adapters/curve/CurveStakingAdapter.sol
new file mode 100644
index 00000000..34421acf
--- /dev/null
+++ b/contracts/adapters/curve/CurveStakingAdapter.sol
@@ -0,0 +1,74 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+import { Ownable } from "../../Ownable.sol";
+
+
+struct Gauge {
+ address gaugeAddress;
+ address stakingToken;
+}
+
+
+/**
+ * @title Adapter for Curve protocol (liquidity gauges).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract CurveStakingAdapter is ProtocolAdapter, Ownable {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ // Returns the gauge where the given token is a staking token
+ mapping(address => address) internal gauge_;
+
+ event GaugeSet(
+ address indexed gaugeAddress,
+ address indexed stakingToken
+ );
+
+ function setGauges(Gauge[] calldata gauges) external onlyOwner {
+ uint256 length = gauges.length;
+
+ for (uint256 i = 0; i < length; i++) {
+ setGauge(gauges[i]);
+ }
+ }
+
+ /**
+ * @return Amount of staked tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(gauge_[token]).balanceOf(account);
+ }
+
+ function getGaugeAddress(address token) external view returns (address) {
+ return gauge_[token];
+ }
+
+ function setGauge(Gauge memory gauge) internal {
+ gauge_[gauge.stakingToken] = gauge.gaugeAddress;
+
+ emit GaugeSet(gauge.gaugeAddress, gauge.stakingToken);
+ }
+}
diff --git a/contracts/adapters/curve/CurveTokenAdapter.sol b/contracts/adapters/curve/CurveTokenAdapter.sol
index 9e9a9df8..da7416b5 100755
--- a/contracts/adapters/curve/CurveTokenAdapter.sol
+++ b/contracts/adapters/curve/CurveTokenAdapter.sol
@@ -20,17 +20,30 @@ import { ERC20 } from "../../ERC20.sol";
import { TokenMetadata, Component } from "../../Structs.sol";
import { TokenAdapter } from "../TokenAdapter.sol";
+/**
+ * @dev CurveRegistry contract interface.
+ * Only the functions required for CurveTokenAdapter contract are added.
+ * The CurveRegistry contract is available here
+ * github.com/zeriontech/defi-sdk/blob/master/contracts/adapters/curve/CurveRegistry.sol.
+ */
+interface CurveRegistry {
+ function getSwapAndTotalCoins(address) external view returns (address, uint256);
+ function getName(address) external view returns (string memory);
+}
+
/**
* @dev stableswap contract interface.
- * Only the functions required for CurveAdapter contract are added.
+ * Only the functions required for CurveTokenAdapter contract are added.
* The stableswap contract is available here
* github.com/curvefi/curve-contract/blob/compounded/vyper/stableswap.vy.
*/
// solhint-disable-next-line contract-name-camelcase
interface stableswap {
function coins(int128) external view returns (address);
+ function coins(uint256) external view returns (address);
function balances(int128) external view returns (uint256);
+ function balances(uint256) external view returns (uint256);
}
@@ -41,9 +54,30 @@ interface stableswap {
*/
contract CurveTokenAdapter is TokenAdapter {
- address internal constant COMPOUND_POOL_TOKEN = 0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2;
- address internal constant Y_POOL_TOKEN = 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8;
- address internal constant BUSD_POOL_TOKEN = 0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B;
+ address internal constant REGISTRY = 0x86A1755BA805ecc8B0608d56c22716bd1d4B68A8;
+
+ address internal constant CDAI = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643;
+ address internal constant CUSDC = 0x39AA39c021dfbaE8faC545936693aC917d5E7563;
+ address internal constant YDAIV2 = 0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01;
+ address internal constant YUSDCV2 = 0xd6aD7a6750A7593E092a9B218d66C0A814a3436e;
+ address internal constant YUSDTV2 = 0x83f798e925BcD4017Eb265844FDDAbb448f1707D;
+ address internal constant YTUSDV2 = 0x73a052500105205d34Daf004eAb301916DA8190f;
+ address internal constant YDAIV3 = 0xC2cB1040220768554cf699b0d863A3cd4324ce32;
+ address internal constant YUSDCV3 = 0x26EA744E5B887E5205727f55dFBE8685e3b21951;
+ address internal constant YUSDTV3 = 0xE6354ed5bC4b393a5Aad09f21c46E101e692d447;
+ address internal constant YBUSDV3 = 0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE;
+ address internal constant YCDAI = 0x99d1Fa417f94dcD62BfE781a1213c092a47041Bc;
+ address internal constant YCUSDC = 0x9777d7E2b60bB01759D0E2f8be2095df444cb07E;
+ address internal constant YCUSDT = 0x1bE5d71F2dA660BFdee8012dDc58D024448A0A59;
+
+ address internal constant C_CRV = 0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2;
+ address internal constant T_CRV = 0x9fC689CCaDa600B6DF723D9E47D84d76664a1F23;
+ address internal constant Y_CRV = 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8;
+ address internal constant B_CRV = 0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B;
+ address internal constant S_CRV = 0xC25a3A3b969415c80451098fa907EC722572917F;
+ address internal constant P_CRV = 0xD905e2eaeBe188fc92179b6350807D8bd91Db0D8;
+ address internal constant RENBTC_CRV = 0x49849C98ae39Fff122806C06791Fa73784FB3675;
+ address internal constant SBTC_CRV = 0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3;
/**
* @return TokenMetadata struct with ERC20-style token info.
@@ -52,7 +86,7 @@ contract CurveTokenAdapter is TokenAdapter {
function getMetadata(address token) external view override returns (TokenMetadata memory) {
return TokenMetadata({
token: token,
- name: string(abi.encodePacked(ERC20(token).symbol(), " pool")),
+ name: getPoolName(token),
symbol: ERC20(token).symbol(),
decimals: ERC20(token).decimals()
});
@@ -63,32 +97,60 @@ contract CurveTokenAdapter is TokenAdapter {
* @dev Implementation of TokenAdapter interface function.
*/
function getComponents(address token) external view override returns (Component[] memory) {
- (stableswap ss, uint256 length, string memory tokenType) = getPoolInfo(token);
- Component[] memory underlyingTokens = new Component[](length);
-
- for (uint256 i = 0; i < length; i++) {
- underlyingTokens[i] = Component({
- token: ss.coins(int128(i)),
- tokenType: tokenType,
- rate: ss.balances(int128(i)) * 1e18 / ERC20(token).totalSupply()
- });
+ (address swap, uint256 totalCoins) = CurveRegistry(REGISTRY).getSwapAndTotalCoins(token);
+ Component[] memory underlyingComponents= new Component[](totalCoins);
+
+ address underlyingToken;
+ if (token == C_CRV || token == T_CRV || token == Y_CRV || token == B_CRV ||
+ token == S_CRV || token == P_CRV || token == RENBTC_CRV || token == SBTC_CRV) {
+ for (uint256 i = 0; i < totalCoins; i++) {
+ underlyingToken = stableswap(swap).coins(int128(i));
+ underlyingComponents[i] = Component({
+ token: underlyingToken,
+ tokenType: getTokenType(underlyingToken),
+ rate: stableswap(swap).balances(int128(i)) * 1e18 / ERC20(token).totalSupply()
+ });
+ }
+ } else {
+ for (uint256 i = 0; i < totalCoins; i++) {
+ underlyingToken = stableswap(swap).coins(i);
+ underlyingComponents[i] = Component({
+ token: underlyingToken,
+ tokenType: getTokenType(underlyingToken),
+ rate: stableswap(swap).balances(i) * 1e18 / ERC20(token).totalSupply()
+ });
+ }
}
- return underlyingTokens;
+ return underlyingComponents;
}
/**
- * @return Stableswap address, number of coins, type of tokens inside.
+ * @return Pool name.
*/
- function getPoolInfo(address token) internal pure returns (stableswap, uint256, string memory) {
- if (token == COMPOUND_POOL_TOKEN) {
- return (stableswap(0xA2B47E3D5c44877cca798226B7B8118F9BFb7A56), 2, "CToken");
- } else if (token == Y_POOL_TOKEN) {
- return (stableswap(0x45F783CCE6B7FF23B2ab2D70e416cdb7D6055f51), 4, "YToken");
- } else if (token == BUSD_POOL_TOKEN) {
- return (stableswap(0x79a8C46DeA5aDa233ABaFFD40F3A0A2B1e5A4F27), 4, "YToken");
+ function getPoolName(address token) internal view returns (string memory) {
+ return CurveRegistry(REGISTRY).getName(token);
+ }
+
+ function getTokenType(address token) internal pure returns (string memory) {
+ if (token == CDAI || token == CUSDC) {
+ return "CToken";
+ } else if (
+ token == YDAIV2 ||
+ token == YUSDCV2 ||
+ token == YUSDTV2 ||
+ token == YTUSDV2 ||
+ token == YDAIV3 ||
+ token == YUSDCV3 ||
+ token == YUSDTV3 ||
+ token == YBUSDV3 ||
+ token == YCDAI ||
+ token == YCUSDC ||
+ token == YCUSDT
+ ) {
+ return "YToken";
} else {
- return (stableswap(address(0)), 0, "");
+ return "ERC20";
}
}
}
diff --git a/contracts/adapters/curve/CurveVestingAdapter.sol b/contracts/adapters/curve/CurveVestingAdapter.sol
new file mode 100644
index 00000000..5670ccdc
--- /dev/null
+++ b/contracts/adapters/curve/CurveVestingAdapter.sol
@@ -0,0 +1,43 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Curve protocol (vesting).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract CurveVestingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant VESTING = 0x575CCD8e2D300e2377B43478339E364000318E2c;
+
+ /**
+ * @return Amount of withdrawable CRV tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ return ERC20(VESTING).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/curve/CurveVoteEscrowAdapter.sol b/contracts/adapters/curve/CurveVoteEscrowAdapter.sol
new file mode 100644
index 00000000..b485e8d9
--- /dev/null
+++ b/contracts/adapters/curve/CurveVoteEscrowAdapter.sol
@@ -0,0 +1,69 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {ProtocolAdapter} from "../ProtocolAdapter.sol";
+
+/**
+ * @dev veCRV contract interface
+ * Only the functions required for CurveTokenAdapter contract are added.
+ * The veCRV contract is available here
+ * https://etherscan.io/address/0x5f3b5dfeb7b28cdbd7faba78963ee202a494e2a2#code
+ */
+interface Locker {
+ function locked(address)
+ external
+ view
+ returns (
+ int128, /* amount */
+ uint256 /* end */
+ );
+}
+
+/**
+ * @title Adapter for Curve protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ */
+contract CurveVoteEscrowAdapter is ProtocolAdapter {
+ string public constant override adapterType = "Asset";
+ string public constant override tokenType = "ERC20";
+
+ // Curve DAO token
+ address internal constant CRV = 0xD533a949740bb3306d119CC777fa900bA034cd52;
+ // Vote-Escrow (locked) CRV
+ address internal constant VE_CRV =
+ 0x5f3b5DfEb7B28CDbD7FAba78963EE202a494e2A2;
+
+ /**
+ * @return Amount of Curve pool tokens locked as veCRV by the given account.
+ * @param token Address of the pool token
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account)
+ external
+ view
+ override
+ returns (uint256)
+ {
+ if (token == CRV) {
+ (int128 balance, ) = Locker(VE_CRV).locked(account);
+ return uint256(balance);
+ }
+ return 0;
+ }
+}
diff --git a/contracts/adapters/ddexLending/DdexLendingAssetAdapter.sol b/contracts/adapters/ddexLending/DdexLendingAssetAdapter.sol
new file mode 100644
index 00000000..08e0af5a
--- /dev/null
+++ b/contracts/adapters/ddexLending/DdexLendingAssetAdapter.sol
@@ -0,0 +1,55 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev Hydro contract interface.
+ * Only the functions required for DdexLendingAssetAdapter contract are added.
+ * The Hydro contract is available here
+ * github.com/HydroProtocol/protocol/blob/master/contracts/Hydro.sol.
+ */
+interface Hydro {
+ function getAmountSupplied(address, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Asset adapter for DDEX protocol (lending account).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract DdexLendingAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant HYDRO = 0x241e82C79452F51fbfc89Fac6d912e021dB1a3B7;
+ address internal constant HYDRO_ETH = 0x000000000000000000000000000000000000000E;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ /**
+ * @return Amount of tokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return Hydro(HYDRO).getAmountSupplied(token == ETH ? HYDRO_ETH : token, account);
+ }
+}
diff --git a/contracts/adapters/ddexMargin/DdexMarginAssetAdapter.sol b/contracts/adapters/ddexMargin/DdexMarginAssetAdapter.sol
new file mode 100644
index 00000000..bd75d874
--- /dev/null
+++ b/contracts/adapters/ddexMargin/DdexMarginAssetAdapter.sol
@@ -0,0 +1,69 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev Hydro contract interface.
+ * Only the functions required for DdexMarginAssetAdapter contract are added.
+ * The Hydro contract is available here
+ * github.com/HydroProtocol/protocol/blob/master/contracts/Hydro.sol.
+ */
+interface Hydro {
+ function getAllMarketsCount() external view returns (uint256);
+ function marketBalanceOf(uint16, address, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Asset adapter for DDEX protocol (margin account).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract DdexMarginAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant HYDRO = 0x241e82C79452F51fbfc89Fac6d912e021dB1a3B7;
+ address internal constant HYDRO_ETH = 0x000000000000000000000000000000000000000E;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ /**
+ * @return Amount of tokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ uint256 allMarketsCount = Hydro(HYDRO).getAllMarketsCount();
+ uint256 totalBalance = 0;
+
+ for (uint16 i = 0; i < uint16(allMarketsCount); i++) {
+ try Hydro(HYDRO).marketBalanceOf(
+ i,
+ token == ETH ? HYDRO_ETH : token,
+ account
+ ) returns (uint256 marketBalance) {
+ totalBalance += marketBalance;
+ } catch {} // solhint-disable-line no-empty-blocks
+ }
+
+ return totalBalance;
+ }
+}
diff --git a/contracts/adapters/ddexMargin/DdexMarginDebtAdapter.sol b/contracts/adapters/ddexMargin/DdexMarginDebtAdapter.sol
new file mode 100644
index 00000000..b03dd4bd
--- /dev/null
+++ b/contracts/adapters/ddexMargin/DdexMarginDebtAdapter.sol
@@ -0,0 +1,69 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev Hydro contract interface.
+ * Only the functions required for DdexMarginDebtAdapter contract are added.
+ * The Hydro contract is available here
+ * github.com/HydroProtocol/protocol/blob/master/contracts/Hydro.sol.
+ */
+interface Hydro {
+ function getAllMarketsCount() external view returns (uint256);
+ function getAmountBorrowed(address, address, uint16) external view returns (uint256);
+}
+
+
+/**
+ * @title Debt adapter for DDEX protocol (margin account).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract DdexMarginDebtAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Debt";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant HYDRO = 0x241e82C79452F51fbfc89Fac6d912e021dB1a3B7;
+ address internal constant HYDRO_ETH = 0x000000000000000000000000000000000000000E;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ /**
+ * @return Amount of tokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ uint256 allMarketsCount = Hydro(HYDRO).getAllMarketsCount();
+ uint256 totalAmountBorrowed = 0;
+
+ for (uint16 i = 0; i < uint16(allMarketsCount); i++) {
+ try Hydro(HYDRO).getAmountBorrowed(
+ token == ETH ? HYDRO_ETH : token,
+ account,
+ i
+ ) returns (uint256 amountBorrowed) {
+ totalAmountBorrowed += amountBorrowed;
+ } catch {} // solhint-disable-line no-empty-blocks
+ }
+
+ return totalAmountBorrowed;
+ }
+}
diff --git a/contracts/adapters/ddexSpot/DdexSpotAssetAdapter.sol b/contracts/adapters/ddexSpot/DdexSpotAssetAdapter.sol
new file mode 100644
index 00000000..ea98c889
--- /dev/null
+++ b/contracts/adapters/ddexSpot/DdexSpotAssetAdapter.sol
@@ -0,0 +1,55 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev Hydro contract interface.
+ * Only the functions required for DdexSpotAssetAdapter contract are added.
+ * The Hydro contract is available here
+ * github.com/HydroProtocol/protocol/blob/master/contracts/Hydro.sol.
+ */
+interface Hydro {
+ function balanceOf(address, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Asset adapter for DDEX protocol (spot account).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract DdexSpotAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant HYDRO = 0x241e82C79452F51fbfc89Fac6d912e021dB1a3B7;
+ address internal constant HYDRO_ETH = 0x000000000000000000000000000000000000000E;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ /**
+ * @return Amount of tokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return Hydro(HYDRO).balanceOf(token == ETH ? HYDRO_ETH : token, account);
+ }
+}
diff --git a/contracts/adapters/dodo/DodoAdapter.sol b/contracts/adapters/dodo/DodoAdapter.sol
new file mode 100755
index 00000000..c8277855
--- /dev/null
+++ b/contracts/adapters/dodo/DodoAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for DODO protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract DodoAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "DODO pool token";
+
+ /**
+ * @return Amount of DODO pool tokens held by the given account.
+ * @param token Address of the DODO pool.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/dodo/DodoStakingAdapter.sol b/contracts/adapters/dodo/DodoStakingAdapter.sol
new file mode 100644
index 00000000..e88ce60e
--- /dev/null
+++ b/contracts/adapters/dodo/DodoStakingAdapter.sol
@@ -0,0 +1,64 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev DODOMine contract interface.
+ * Only the functions required for DodoStakingAdapter contract are added.
+ * The DODOMine contract is available here
+ * github.com/DODOEX/dodo-smart-contract/blob/master/contracts/token/DODOMine.sol.
+ */
+interface DODOMine {
+ function getUserLpBalance(address, address) external view returns (uint256);
+ function getAllPendingReward(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for DODO protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract DodoStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant DODO = 0x43Dfc4159D86F3A37A5A4B3D4580b888ad7d4DDd;
+ address internal constant DODO_MINE = 0xaeD7384F03844Af886b830862FF0a7AFce0a632C;
+
+ /**
+ * @return Amount of DODO rewards / DLP staked tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == DODO) {
+ uint256 totalBalance = 0;
+
+ totalBalance += DODOMine(DODO_MINE).getAllPendingReward(account);
+ totalBalance += DODOMine(DODO_MINE).getUserLpBalance(token, account);
+
+ return totalBalance;
+ } else {
+ return DODOMine(DODO_MINE).getUserLpBalance(token, account);
+ }
+ }
+}
diff --git a/contracts/adapters/dodo/DodoTokenAdapter.sol b/contracts/adapters/dodo/DodoTokenAdapter.sol
new file mode 100755
index 00000000..3dd13906
--- /dev/null
+++ b/contracts/adapters/dodo/DodoTokenAdapter.sol
@@ -0,0 +1,147 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev DODOLpToken contract interface.
+ * Only the functions required for DodoTokenAdapter contract are added.
+ * The DODOLpToken contract is available here
+ * github.com/DODOEX/dodo-smart-contract/blob/master/contracts/impl/DODOLpToken.sol.
+ */
+interface DODOLpToken {
+ // solhint-disable func-name-mixedcase
+ function _OWNER_() external view returns (address);
+ function originToken() external view returns (address);
+ // solhint-enable func-name-mixedcase
+}
+
+
+/**
+ * @dev DODO contract interface.
+ * Only the functions required for DodoTokenAdapter contract are added.
+ * The DODO contract is available here
+ * github.com/DODOEX/dodo-smart-contract/blob/master/contracts/dodo.sol.
+ */
+interface DODO {
+ // solhint-disable func-name-mixedcase
+ function _BASE_TOKEN_() external view returns (address);
+ function _BASE_CAPITAL_TOKEN_() external view returns (address);
+ function _QUOTE_TOKEN_() external view returns (address);
+ function getExpectedTarget() external view returns (uint256, uint256);
+ // solhint-enable func-name-mixedcase
+}
+
+
+/**
+ * @title Token adapter for DODO pool tokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract DodoTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: getPoolName(token),
+ symbol: "DLP",
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address dodo = DODOLpToken(token)._OWNER_();
+
+ (uint256 baseTarget, uint256 quoteTarget) = DODO(dodo).getExpectedTarget();
+ address baseToken = DODO(dodo)._BASE_TOKEN_();
+ address originToken = DODOLpToken(token).originToken();
+
+ uint256 underlyingTokenAmount = originToken == baseToken ? baseTarget : quoteTarget;
+
+ Component[] memory underlyingTokens = new Component[](1);
+
+ underlyingTokens[0] = Component({
+ token: originToken,
+ tokenType: "ERC20",
+ rate: underlyingTokenAmount * 1e18 / ERC20(token).totalSupply()
+ });
+
+ return underlyingTokens;
+ }
+
+ function getPoolName(address token) internal view returns (string memory) {
+ address dodo = DODOLpToken(token)._OWNER_();
+ return string(
+ abi.encodePacked(
+ getSymbol(DODO(dodo)._BASE_TOKEN_()),
+ "/",
+ getSymbol(DODO(dodo)._QUOTE_TOKEN_()),
+ " Pool: ",
+ getSymbol(DODOLpToken(token).originToken())
+ )
+ );
+ }
+
+ function getSymbol(address token) internal view returns (string memory) {
+ (, bytes memory returnData) = token.staticcall(
+ abi.encodeWithSelector(ERC20(token).symbol.selector)
+ );
+
+ if (returnData.length == 32) {
+ return convertToString(abi.decode(returnData, (bytes32)));
+ } else {
+ return abi.decode(returnData, (string));
+ }
+ }
+
+ /**
+ * @dev Internal function to convert bytes32 to string and trim zeroes.
+ */
+ function convertToString(bytes32 data) internal pure returns (string memory) {
+ uint256 counter = 0;
+ bytes memory result;
+
+ for (uint256 i = 0; i < 32; i++) {
+ if (data[i] != bytes1(0)) {
+ counter++;
+ }
+ }
+
+ result = new bytes(counter);
+ counter = 0;
+ for (uint256 i = 0; i < 32; i++) {
+ if (data[i] != bytes1(0)) {
+ result[counter] = data[i];
+ counter++;
+ }
+ }
+
+ return string(result);
+ }
+}
diff --git a/contracts/adapters/enzyme/EnzymeAssetAdapter.sol b/contracts/adapters/enzyme/EnzymeAssetAdapter.sol
new file mode 100644
index 00000000..98289b43
--- /dev/null
+++ b/contracts/adapters/enzyme/EnzymeAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Asset adapter for Enzyme protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract EnzymeAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "EnzymeToken";
+
+ /**
+ * @return Amount of ENZF held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/enzyme/EnzymeTokenAdapter.sol b/contracts/adapters/enzyme/EnzymeTokenAdapter.sol
new file mode 100644
index 00000000..e3b88ec6
--- /dev/null
+++ b/contracts/adapters/enzyme/EnzymeTokenAdapter.sol
@@ -0,0 +1,75 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev VaultLib contract interface.
+ * Only the functions required for EnzymeTokenAdapter contract are added.
+ */
+interface VaultLib {
+ function getTrackedAssets() external view returns (address[] memory);
+}
+
+
+/**
+ * @title Token adapter for Enzyme Protocol.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract EnzymeTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ uint256 totalSupply = ERC20(token).totalSupply();
+
+ address[] memory trackedAssets = VaultLib(token).getTrackedAssets();
+ uint256 length = trackedAssets.length;
+
+ Component[] memory underlyingTokens = new Component[](length);
+
+ for (uint256 i = 0; i < length; i++) {
+ underlyingTokens[i] = Component({
+ token: trackedAssets[i],
+ tokenType: "ERC20",
+ rate: totalSupply == 0 ? 0 : ERC20(trackedAssets[i]).balanceOf(token) * 1e18 / totalSupply
+ });
+ }
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/finnexus/FinNexusAssetAdapter.sol b/contracts/adapters/finnexus/FinNexusAssetAdapter.sol
new file mode 100644
index 00000000..8b34ab69
--- /dev/null
+++ b/contracts/adapters/finnexus/FinNexusAssetAdapter.sol
@@ -0,0 +1,44 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+interface FPTCoin {
+ function balanceOf(address account) external view returns (uint256);
+ function lockedBalanceOf(address account) external view returns (uint256);
+}
+/**
+ * @title Asset adapter for FinNexus option protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author jeffqg123
+ */
+contract FinNexusAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+ string public constant override tokenType = "FPT token";
+
+ address public constant fptaddress = 0xA072EA1a2a75047908e68e0B1a2baC3a7190CE58;
+
+ /**
+ * @return Amount of FPT token on FNX the Option protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ return FPTCoin(fptaddress).balanceOf(account) + FPTCoin(fptaddress).lockedBalanceOf(account);
+ }
+}
diff --git a/contracts/adapters/finnexus/FinNexusDebtAdapter.sol b/contracts/adapters/finnexus/FinNexusDebtAdapter.sol
new file mode 100644
index 00000000..ccb5f62c
--- /dev/null
+++ b/contracts/adapters/finnexus/FinNexusDebtAdapter.sol
@@ -0,0 +1,60 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev FinNexusCollecteralPool contract interface.
+ */
+interface FinNexusCollecteralPool {
+ function getUserInputCollateral(address user,address collateral) external view returns (uint256);
+}
+
+
+/**
+ * @title Asset adapter for FinNexus option protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author jeffqg123
+ */
+contract FinNexusDebtAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Debt";
+ string public constant override tokenType = "ERC20";
+
+ address public constant COLLATERAL_POOL = 0x20081862B301C1ef9357BC0a125Aa414db210f2c;
+ address internal constant FNX = 0xeF9Cd7882c067686691B6fF49e650b43AFBBCC6B;
+ address internal constant FNX_ETH = 0x0000000000000000000000000000000000000000;
+ address internal constant USDC= 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ /**
+ * @return Amount of FNX/USDC/FNX locked on the protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == FNX || token == ETH || token == USDC) {
+ return FinNexusCollecteralPool(COLLATERAL_POOL).getUserInputCollateral(
+ account,
+ token == ETH ? FNX_ETH : token
+ );
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/finnexus/FinNexusTokenAdapter.sol b/contracts/adapters/finnexus/FinNexusTokenAdapter.sol
new file mode 100755
index 00000000..900a29f9
--- /dev/null
+++ b/contracts/adapters/finnexus/FinNexusTokenAdapter.sol
@@ -0,0 +1,94 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev OptionsManagerV2 contract interface.
+ * Only the functions required for FinNexusTokenAdapter contract are added.
+ */
+interface OptionsManagerV2 {
+ function getTokenNetworth() external view returns (uint256);
+}
+
+
+/**
+ * @dev FNXOracle contract interface.
+ * Only the functions required for FinNexusTokenAdapter contract are added.
+ */
+interface FNXOracle {
+ function getPrice(address asset) external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for FinNexus.
+ * @dev Implementation of TokenAdapter interface.
+ * @author jeffqg123
+ */
+contract FinNexusTokenAdapter is TokenAdapter {
+
+ address public constant OPT_MANAGER = 0xfa30ec96De9840A611FcB64e7312f97bdE6e155A;
+ address public constant ORACLE = 0x940b491905529542Ba3b56244A06B1EBE11e71F2;
+
+ address[] internal underlyingAddress =[
+ 0x0000000000000000000000000000000000000000,
+ 0xeF9Cd7882c067686691B6fF49e650b43AFBBCC6B,
+ 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
+ ];
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address) external view override returns (Component[] memory) {
+
+ Component[] memory underlyingTokens = new Component[](underlyingAddress.length);
+
+ uint256 fptWorth = OptionsManagerV2(OPT_MANAGER).getTokenNetworth();
+ uint256 tokenPrice;
+ for (uint256 i = 0; i < underlyingTokens.length; i++) {
+ tokenPrice = FNXOracle(ORACLE).getPrice(underlyingAddress[i]);
+
+ tokenPrice = (i == 2) ? tokenPrice * 1e6 : tokenPrice * 1e18;
+
+ underlyingTokens[i] = Component({
+ token: i == 0 ? 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE : underlyingAddress[i],
+ tokenType: "ERC20",
+ rate: tokenPrice / fptWorth
+ });
+ }
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/gnosisProtocol/GnosisProtocolAdapter.sol b/contracts/adapters/gnosisProtocol/GnosisProtocolAdapter.sol
new file mode 100644
index 00000000..320e284d
--- /dev/null
+++ b/contracts/adapters/gnosisProtocol/GnosisProtocolAdapter.sol
@@ -0,0 +1,53 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev EpochTokenLocker contract interface.
+ * Only the functions required for GnosisProtocolAdapter contract are added.
+ * The EpochTokenLocker contract is available here
+ * github.com/gnosis/dex-contracts/blob/master/contracts/EpochTokenLocker.sol.
+ */
+interface EpochTokenLocker {
+ function getBalance(address, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for GnosisProtocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Marek Galvanek
+ */
+contract GnosisProtocolAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant BALANCE = 0x6F400810b62df8E13fded51bE75fF5393eaa841F;
+
+ /**
+ * @return Amount of token locked on the protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return EpochTokenLocker(BALANCE).getBalance(account, token);
+ }
+}
diff --git a/contracts/adapters/harvest/HarvestAutoStakingAdapter.sol b/contracts/adapters/harvest/HarvestAutoStakingAdapter.sol
new file mode 100644
index 00000000..3bdd7dc7
--- /dev/null
+++ b/contracts/adapters/harvest/HarvestAutoStakingAdapter.sol
@@ -0,0 +1,74 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+import { Ownable } from "../../Ownable.sol";
+
+
+struct Pool {
+ address poolAddress;
+ address stakingToken;
+}
+
+
+/**
+ * @title Adapter for Harvest protocol (auto staking pools).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract HarvestAutoStakingAdapter is ProtocolAdapter, Ownable {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ // Returns the pool where the given token is a staking token
+ mapping(address => address) internal pool_;
+
+ event PoolSet(
+ address indexed poolAddress,
+ address indexed stakingToken
+ );
+
+ function setPools(Pool[] calldata pools) external onlyOwner {
+ uint256 length = pools.length;
+
+ for (uint256 i = 0; i < length; i++) {
+ setPool(pools[i]);
+ }
+ }
+
+ /**
+ * @return Amount of staked tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(pool_[token]).balanceOf(account);
+ }
+
+ function getPoolAddress(address token) external view returns (address) {
+ return pool_[token];
+ }
+
+ function setPool(Pool memory pool) internal {
+ pool_[pool.stakingToken] = pool.poolAddress;
+
+ emit PoolSet(pool.poolAddress, pool.stakingToken);
+ }
+}
diff --git a/contracts/adapters/harvest/HarvestStakingAdapter.sol b/contracts/adapters/harvest/HarvestStakingAdapter.sol
new file mode 100644
index 00000000..b725f20d
--- /dev/null
+++ b/contracts/adapters/harvest/HarvestStakingAdapter.sol
@@ -0,0 +1,154 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+import { Ownable } from "../../Ownable.sol";
+
+
+struct Pool {
+ address poolAddress;
+ address stakingToken;
+ address rewardToken;
+}
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for YearnStakingV1Adapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Harvest protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract HarvestStakingAdapter is ProtocolAdapter, Ownable {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ // Returns if the pool is enabled
+ mapping(address => bool) internal isEnabledPool_;
+ // Returns the list of pools where the given token is a staking token
+ mapping(address => address[]) internal stakingPools_;
+ // Returns the list of pools where the given token is a reward token
+ mapping(address => address[]) internal rewardPools_;
+
+ event PoolAdded(
+ address indexed poolAddress,
+ address indexed stakingToken,
+ address indexed rewardToken
+ );
+
+ function addPools(Pool[] calldata pools) external onlyOwner {
+ uint256 length = pools.length;
+
+ for (uint256 i = 0; i < length; i++) {
+ addPool(pools[i]);
+ }
+ }
+
+ function setIsEnabledPools(
+ address[] calldata poolAddresses,
+ bool[] calldata isEnabledPools
+ )
+ external
+ onlyOwner
+ {
+ uint256 length = poolAddresses.length;
+ require(isEnabledPools.length == length, "HSA: inconsistent arrays");
+
+ for (uint256 i = 0; i < length; i++) {
+ setIsEnabledPool(poolAddresses[i], isEnabledPools[i]);
+ }
+ }
+
+ /**
+ * @return Amount of staked tokens / rewards earned after staking for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ address[] memory stakingPools = stakingPools_[token];
+ address[] memory rewardPools = rewardPools_[token];
+
+ uint256 length;
+ uint256 totalBalance = 0;
+
+ length = stakingPools.length;
+ for (uint256 i = 0; i < length; i++) {
+ totalBalance += getStakingBalance(stakingPools[i], account);
+ }
+
+ length = rewardPools.length;
+ for (uint256 i = 0; i < length; i++) {
+ totalBalance += getRewardBalance(rewardPools[i], account);
+ }
+
+ return totalBalance;
+ }
+
+ function getRewardPools(address token) external view returns (address[] memory) {
+ return rewardPools_[token];
+ }
+
+ function getStakingPools(address token) external view returns (address[] memory) {
+ return stakingPools_[token];
+ }
+
+ function addPool(Pool memory pool) internal {
+ stakingPools_[pool.stakingToken].push(pool.poolAddress);
+ rewardPools_[pool.rewardToken].push(pool.poolAddress);
+ setIsEnabledPool(pool.poolAddress, true);
+
+ emit PoolAdded(pool.poolAddress, pool.stakingToken, pool.rewardToken);
+ }
+
+ function setIsEnabledPool(address poolAddress, bool isEnabledPool) internal {
+ isEnabledPool_[poolAddress] = isEnabledPool;
+ }
+
+ function getRewardBalance(
+ address poolAddress,
+ address account
+ )
+ internal
+ view
+ returns (uint256)
+ {
+ return isEnabledPool_[poolAddress] ? StakingRewards(poolAddress).earned(account) : 0;
+ }
+
+ function getStakingBalance(
+ address poolAddress,
+ address account
+ )
+ internal
+ view
+ returns (uint256)
+ {
+ return isEnabledPool_[poolAddress] ? ERC20(poolAddress).balanceOf(account) : 0;
+ }
+}
diff --git a/contracts/adapters/idle/IdleRewardsAdapter.sol b/contracts/adapters/idle/IdleRewardsAdapter.sol
new file mode 100644
index 00000000..1a2bc8dd
--- /dev/null
+++ b/contracts/adapters/idle/IdleRewardsAdapter.sol
@@ -0,0 +1,50 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+interface EarlyRewards {
+ function rewards(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for idle.finance protocol (IDLE early rewards).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract IdleRewardsAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant IDLE = 0x875773784Af8135eA0ef43b5a374AaD105c5D39e;
+ address internal constant EARLY_REWARDS = 0xa1F71ED24ABA6c8Da8ca8C046bBc9804625d88Fc;
+
+ /**
+ * @return Amount of IDLE early rewards by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ uint256 reward = EarlyRewards(EARLY_REWARDS).rewards(account);
+ return ERC20(IDLE).balanceOf(EARLY_REWARDS) >= reward ? reward : 0;
+ }
+}
diff --git a/contracts/adapters/iearn/YearnStakingV1Adapter.sol b/contracts/adapters/iearn/YearnStakingV1Adapter.sol
new file mode 100644
index 00000000..20bd2a97
--- /dev/null
+++ b/contracts/adapters/iearn/YearnStakingV1Adapter.sol
@@ -0,0 +1,80 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for YearnStakingV1Adapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Yearn.finance YFI Staking protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Connor Martin
+ */
+contract YearnStakingV1Adapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant YFI = 0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e;
+ address internal constant CURVE_Y = 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8;
+ address internal constant BALANCER_DAI_YFI_98_2 = 0x60626db611a9957C1ae4Ac5b7eDE69e24A3B76c5;
+ address internal constant BALANCER_YFI_CURVE_Y_2_98 = 0x95C4B6C7CfF608c0CA048df8b81a484aA377172B;
+
+ address internal constant CURVE = 0x0001FB050Fe7312791bF6475b96569D83F695C9f;
+ address internal constant BALANCER = 0x033E52f513F9B98e129381c6708F9faA2DEE5db5;
+ address internal constant GOVERNANCE = 0x3A22dF48d84957F907e67F4313E3D43179040d6E;
+ address internal constant FEE_REWARDS = 0xb01419E74D8a2abb1bbAD82925b19c36C191A701;
+
+ /**
+ * @return Amount of YFI rewards earned after staking in a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == YFI) {
+ uint256 totalRewards = 0;
+ totalRewards += StakingRewards(CURVE).earned(account);
+ totalRewards += StakingRewards(BALANCER).earned(account);
+ totalRewards += StakingRewards(GOVERNANCE).earned(account);
+ totalRewards += ERC20(FEE_REWARDS).balanceOf(account);
+ return totalRewards;
+ } else if (token == CURVE_Y) {
+ uint256 totalRewards = 0;
+ totalRewards += ERC20(CURVE).balanceOf(account);
+ totalRewards += StakingRewards(FEE_REWARDS).earned(account);
+ return totalRewards;
+ } else if (token == BALANCER_DAI_YFI_98_2) {
+ return ERC20(BALANCER).balanceOf(account);
+ } else if (token == BALANCER_YFI_CURVE_Y_2_98) {
+ return ERC20(GOVERNANCE).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+ }
diff --git a/contracts/adapters/iearn/YearnStakingV2Adapter.sol b/contracts/adapters/iearn/YearnStakingV2Adapter.sol
new file mode 100755
index 00000000..f9ade054
--- /dev/null
+++ b/contracts/adapters/iearn/YearnStakingV2Adapter.sol
@@ -0,0 +1,62 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for YearnStakingAdapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for yearn.finance protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract YearnStakingV2Adapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant YFI = 0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e;
+ address internal constant CURVE_Y = 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8;
+ address internal constant GOVERNANCE_V2 = 0xBa37B002AbaFDd8E89a1995dA52740bbC013D992;
+
+ /**
+ * @return Amount of YTokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == YFI) {
+ return ERC20(GOVERNANCE_V2).balanceOf(account);
+ } else if (token == CURVE_Y) {
+ return StakingRewards(GOVERNANCE_V2).earned(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/keeperDao/KeeperDaoAssetAdapter.sol b/contracts/adapters/keeperDao/KeeperDaoAssetAdapter.sol
new file mode 100755
index 00000000..20459957
--- /dev/null
+++ b/contracts/adapters/keeperDao/KeeperDaoAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for KeeperDAO protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract KeeperDaoAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "KToken";
+
+ /**
+ * @return Amount of KTokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/keeperDao/KeeperDaoTokenAdapter.sol b/contracts/adapters/keeperDao/KeeperDaoTokenAdapter.sol
new file mode 100755
index 00000000..722cba28
--- /dev/null
+++ b/contracts/adapters/keeperDao/KeeperDaoTokenAdapter.sol
@@ -0,0 +1,81 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev KToken contract interface.
+ * Only the functions required for KeeperDaoTokenAdapter contract are added.
+ */
+interface KToken {
+ function underlying() external view returns (address);
+}
+
+
+/**
+ * @dev LiquidityPoolV2 contract interface.
+ * Only the functions required for KeeperDaoTokenAdapter contract are added.
+ */
+interface LiquidityPoolV2 {
+ function borrowableBalance(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for KTokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract KeeperDaoTokenAdapter is TokenAdapter {
+
+ address internal constant POOL = 0x53463cd0b074E5FDafc55DcE7B1C82ADF1a43B2E;
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ Component[] memory underlyingTokens = new Component[](1);
+ address underlyingToken = KToken(token).underlying();
+ uint256 borrowableBalance = LiquidityPoolV2(POOL).borrowableBalance(underlyingToken);
+
+ underlyingTokens[0] = Component({
+ token: underlyingToken,
+ tokenType: "ERC20",
+ rate: borrowableBalance * 1e18 / ERC20(token).totalSupply()
+ });
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/kimchi/KimchiStakingAdapter.sol b/contracts/adapters/kimchi/KimchiStakingAdapter.sol
new file mode 100644
index 00000000..297da270
--- /dev/null
+++ b/contracts/adapters/kimchi/KimchiStakingAdapter.sol
@@ -0,0 +1,123 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev UserInfo struct from KimchiChef contract.
+ * The KimchiChef contract is available here
+ * github.com/sushiswap/sushiswap/blob/master/contracts/KimchiChef.sol.
+ */
+struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+}
+
+
+/**
+ * @dev PoolInfo struct from KimchiChef contract.
+ * The KimchiChef contract is available here
+ * github.com/sushiswap/sushiswap/blob/master/contracts/KimchiChef.sol.
+ */
+struct PoolInfo {
+ address lpToken;
+ uint256 allocPoint;
+ uint256 lastRewardBlock;
+ uint256 accSushiPerShare;
+}
+
+
+/**
+ * @dev KimchiChef (forked KimchiChef) contract interface.
+ * Only the functions required for SushiStakingAdapter contract are added.
+ * The KimchiChef contract is available here
+ * github.com/sushiswap/sushiswap/blob/master/contracts/KimchiChef.sol.
+ */
+interface KimchiChef {
+ function poolLength() external view returns (uint256);
+ function poolInfo(uint256) external view returns (PoolInfo memory);
+ function userInfo(uint256, address) external view returns (UserInfo memory);
+ function pendingKimchi(uint256, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for KIMCHI protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract KimchiStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant SUSHI = 0x1E18821E69B9FAA8e6e75DFFe54E7E25754beDa0;
+ address internal constant KIMCHI_CHEF = 0x9Dd5b5c71842a4fD51533532E5470298BFA398fd;
+
+ /**
+ * @return Amount of SUSHI rewards / staked tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ uint256 length = KimchiChef(KIMCHI_CHEF).poolLength();
+
+ if (token == SUSHI) {
+ uint256 totalRewards = 0;
+
+ for(uint256 i = 0; i < length; i++) {
+ totalRewards += KimchiChef(KIMCHI_CHEF).pendingKimchi(i, account);
+ }
+
+ return totalRewards;
+ } else {
+ for(uint256 i = 0; i < length; i++) {
+ UserInfo memory user = KimchiChef(KIMCHI_CHEF).userInfo(i, account);
+ PoolInfo memory pool = KimchiChef(KIMCHI_CHEF).poolInfo(i);
+
+ if (pool.lpToken == token) {
+ return user.amount;
+ }
+ }
+
+ return 0;
+ }
+ }
+
+ function sub(uint256 a, uint256 b) internal pure returns (uint256) {
+ require(b <= a, "SafeMath: subtraction overflow");
+ uint256 c = a - b;
+
+ return c;
+ }
+
+ function mul(uint256 a, uint256 b) internal pure returns (uint256) {
+ // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
+ // benefit is lost if 'b' is also tested.
+ // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
+ if (a == 0) {
+ return 0;
+ }
+
+ uint256 c = a * b;
+ require(c / a == b, "SafeMath: multiplication overflow");
+
+ return c;
+ }
+}
diff --git a/contracts/adapters/kyber/KyberAssetAdapter.sol b/contracts/adapters/kyber/KyberAssetAdapter.sol
new file mode 100644
index 00000000..50bd15db
--- /dev/null
+++ b/contracts/adapters/kyber/KyberAssetAdapter.sol
@@ -0,0 +1,111 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev KyberStaking contract interface.
+ * Only the functions required for KyberAssetAdapter contract are added.
+ * The KyberStaking contract is available here
+ * github.com/KyberNetwork/smart-contracts/blob/Katalyst/contracts/sol6/Dao/KyberStaking.sol.
+ */
+interface KyberStaking {
+ function getLatestStakerData(address) external view returns (uint256, uint256);
+}
+
+
+/**
+ * @dev KyberDAO contract interface.
+ * Only the functions required for KyberAssetAdapter contract are added.
+ * The KyberDAO contract is available here
+ * github.com/KyberNetwork/smart-contracts/blob/Katalyst/contracts/sol6/Dao/KyberDAO.sol.
+ */
+interface KyberDAO {
+ function getCurrentEpochNumber() external view returns (uint32);
+ function getPastEpochRewardPercentageInPrecision(
+ address,
+ uint32
+ )
+ external
+ view
+ returns (uint256);
+}
+
+
+/**
+ * @dev KyberFeeHandler contract interface.
+ * Only the functions required for KyberAssetAdapter contract are added.
+ * The KyberFeeHandler contract is available here
+ * github.com/KyberNetwork/smart-contracts/blob/Katalyst/contracts/sol6/Dao/KyberFeeHandler.sol.
+ */
+interface KyberFeeHandler {
+ function hasClaimedReward(address, uint32) external view returns (bool);
+ function rewardsPerEpoch(uint32) external view returns (uint256);
+}
+
+
+/**
+ * @title Asset adapter for KyberDAO protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract KyberAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant KNC = 0xdd974D5C2e2928deA5F71b9825b8b646686BD200;
+ address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+ address internal constant DAO = 0x49bdd8854481005bBa4aCEbaBF6e06cD5F6312e9;
+ address internal constant STAKING = 0xECf0bdB7B3F349AbfD68C3563678124c5e8aaea3;
+ address internal constant FEE_HANDLER = 0xd3d2b5643e506c6d9B7099E9116D7aAa941114fe;
+
+ uint256 internal constant PRECISION = 1e18;
+
+ /**
+ * @return Amount of KNC/ETH locked on the protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == KNC) {
+ uint256 stake;
+ uint256 delegatedStake;
+ (stake, delegatedStake) = KyberStaking(STAKING).getLatestStakerData(account);
+ return stake + delegatedStake;
+ } else if (token == ETH) {
+ uint256 reward = 0;
+ uint256 rewardPercentage;
+ uint256 rewardsPerEpoch;
+ uint32 curEpoch = KyberDAO(DAO).getCurrentEpochNumber();
+ for (uint32 i = 0; i < curEpoch; i++) {
+ if (!KyberFeeHandler(FEE_HANDLER).hasClaimedReward(account, i)) {
+ rewardPercentage = KyberDAO(DAO).getPastEpochRewardPercentageInPrecision(account, i);
+ if (rewardPercentage > 0) {
+ rewardsPerEpoch = KyberFeeHandler(FEE_HANDLER).rewardsPerEpoch(i);
+ reward += rewardsPerEpoch * rewardPercentage / PRECISION;
+ }
+ }
+ }
+ return reward;
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/linkswap/LinkswapAdapter.sol b/contracts/adapters/linkswap/LinkswapAdapter.sol
new file mode 100755
index 00000000..4cbfe39f
--- /dev/null
+++ b/contracts/adapters/linkswap/LinkswapAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for LINKSWAP protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Giovanni Di Siena
+ */
+contract LinkswapAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "Uniswap V2 pool token";
+
+ /**
+ * @return Amount of LINKSWAP LP tokens (LSLP) held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/linkswap/LinkswapStakingAdapter.sol b/contracts/adapters/linkswap/LinkswapStakingAdapter.sol
new file mode 100644
index 00000000..842eca05
--- /dev/null
+++ b/contracts/adapters/linkswap/LinkswapStakingAdapter.sol
@@ -0,0 +1,250 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for LinkswapStakingAdapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/yflink/linkswap-staking/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address, uint256) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for LINKSWAP governance and LP rewards staking.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Giovanni Di Siena
+ */
+contract LinkswapStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant YFL = 0x28cb7e841ee97947a86B06fA4090C8451f64c0be;
+ address internal constant YFLUSD = 0x7b760D06E401f85545F3B50c44bf5B05308b7b62;
+ address internal constant SYFL = 0x8282df223AC402d04B2097d16f758Af4F70e7Db0;
+ address internal constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
+ address internal constant LINK = 0x514910771AF9Ca656af840dff83E8264EcF986CA;
+ address internal constant BUSD = 0x4Fabb145d64652a948d72533023f6E7A623C7C53;
+ address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
+ address internal constant CFI = 0x63b4f3e3fa4e438698CE330e365E831F7cCD1eF4;
+ address internal constant MASQ = 0x06F3C323f0238c72BF35011071f2b5B7F43A054c;
+ address internal constant DPI = 0x1494CA1F11D487c2bBe4543E90080AeBa4BA3C2b;
+ address internal constant CEL = 0xaaAEBE6Fe48E54f431b0C390CfaF0b017d09D42d;
+ address internal constant YAX = 0xb1dC9124c395c1e97773ab855d66E879f053A289;
+ address internal constant GSWAP = 0xaac41EC512808d64625576EDdd580e7Ea40ef8B2;
+ address internal constant AZUKI = 0x910524678C0B1B23FFB9285a81f99C29C11CBaEd;
+ address internal constant DOKI = 0x9cEB84f92A0561fa3Cc4132aB9c0b76A59787544;
+
+ address internal constant LSLP_YFL_WETH = 0x7e5A536F3d79791E283940ec379CEE10C9C40e86;
+ address internal constant LSLP_YFL_LINK = 0x189A730921550314934019d184EC05726881D481;
+ address internal constant LSLP_LINK_YFLUSD = 0x6cD7817e6f3f52123df529E1eDF5830240Ce48c1;
+ address internal constant LSLP_YFLUSD_WETH = 0x195734d862DFb5380eeDa0ACD8acf697eA95D370;
+ address internal constant LSLP_LINK_SYFL = 0x74C89f297b1dC87F927d9432a4eeea697E6f89a5;
+ address internal constant LSLP_SYFL_WETH = 0x3315351F0B20595777a28054EF3d514bdC37463d;
+ address internal constant LSLP_DPI_LINK = 0x017FAD4b7a54C1ACe95Ca614954e4D0d12CDb27E;
+ address internal constant LSLP_LINK_GSWAP = 0xdef0CEF53E0D4c6A5E568c53EdCf45CeB33DBE46;
+ address internal constant LSLP_LINK_CEL = 0x639916bB4B29859FADF7A272185a3212157F8CE1;
+ address internal constant LSLP_MASQ_WETH = 0x37CeE65899dA4B1738412814155540C98DFd752C;
+ address internal constant LSLP_BUSD_LINK = 0x983c9a1BCf0eB980a232D1b17bFfd6Bbf68Fe4Ce;
+ address internal constant LSLP_LINK_YAX = 0x626B88542495d2e341d285969F8678B99cd91DA7;
+ address internal constant LSLP_YAX_WETH = 0x21dee38170F1e1F26baFf2C30C0fc8F8362b6961;
+ address internal constant LSLP_LINK_CFI = 0xf68c01198cDdEaFB9d2EA43368FC9fA509A339Fa;
+ address internal constant LSLP_LINK_USDC = 0x9d996bDD1F65C835EE92Cd0b94E15d886EF14D63;
+ address internal constant LSLP_LINK_USDT = 0xf36c9fc3c2aBE4132019444AfF914Fc8DC9785a9;
+ address internal constant LSLP_LINK_AZUKI = 0xB7Cd446a2a80d4770C6bECde661B659cFC55acf5;
+ address internal constant LSLP_LINK_DOKI = 0xbe755C548D585dbc4e3Fe4bcD712a32Fd81e5Ba0;
+
+ address internal constant LSLP_YFL_WETH_POOL = 0x72368fB97dab2B94A5664EbeEbF504EF482fF149;
+ address internal constant LSLP_YFL_WETH_POOL_NEW = 0x3bE07ed0239d46ca8435D4fb0bE96E43cD1c1796;
+ address internal constant LSLP_YFL_LINK_POOL = 0x35FC734948B36370c15387342F048aC87210bC22;
+ address internal constant LSLP_LINK_YFLUSD_POOL = 0x61401c19200B2420f93Bb2EECF4BAA2C193d76e1;
+ address internal constant LSLP_YFLUSD_WETH_POOL = 0x6DddCc7F963C65b18FdDD842e6553528f014aDeA;
+ address internal constant LSLP_LINK_SYFL_POOL = 0x1b650B522b864f6BF61705A05cc89b2b0e23f9C6;
+ address internal constant LSLP_SYFL_WETH_POOL = 0x81C76925E7F41f0306E1147c4659784d4402bD51;
+ address internal constant LSLP_DPI_LINK_POOL = 0xFe04c284a9725c141CF6de85D7E8452af1B48ab7;
+ address internal constant LSLP_LINK_GSWAP_POOL = 0x4e33D27CBCCe9Fe1c4a21A0f7C8b31C9CF5c0B75;
+ address internal constant LSLP_LINK_CEL_POOL = 0xfa9712cCc86c6BD52187125dCA4c2B9C7bAa3Ef8;
+ address internal constant LSLP_MASQ_WETH_POOL = 0x790aDfE75706cf70191b2bD729048e42d8Ed9f60;
+ address internal constant LSLP_BUSD_LINK_POOL = 0x997d4BAbf8290A19EcDCbD10058fC438EB6F30DE;
+ address internal constant LSLP_LINK_YAX_POOL = 0xf4C17025B623665AAcAb958FC0fa454b1265A219;
+ address internal constant LSLP_YAX_WETH_POOL = 0xBfe0D843D3DA0953EcEf08Fc231033D4B140a085;
+ address internal constant LSLP_LINK_CFI_POOL = 0x5662E09d064781Cf2E98732ec3fC7A4a4aB67eA5;
+ address internal constant LSLP_LINK_USDC_POOL = 0x0D03Cff17367478c3349a579e50259D8A793BBc8;
+ address internal constant LSLP_LINK_USDT_POOL = 0x603065B7e2F69c897F154Ca429a2B96Cf4703f56;
+ address internal constant LSLP_LINK_AZUKI_POOL = 0xa74Ef3faB9E94578c79e0077f6Bd572C9efc8733;
+ address internal constant LSLP_LINK_DOKI_POOL = 0x795BD26b99082E59478cfe8d9Cd207bb196808E4;
+
+ address internal constant GOVERNANCE = 0x75D1aA733920b14fC74c9F6e6faB7ac1EcE8482E;
+ address internal constant GOVERNANCE_FEES = 0x0389d755C1833C9b350d4E8B619Eae16deFc1CbA;
+
+ /**
+ * @return Amount of staked tokens / rewards earned after staking for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == YFL) {
+ uint256 totalRewards = 0;
+
+ totalRewards += ERC20(GOVERNANCE).balanceOf(account);
+
+ totalRewards += StakingRewards(LSLP_YFL_LINK_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_YFL_WETH_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_YFL_WETH_POOL_NEW).earned(account,0);
+ totalRewards += StakingRewards(LSLP_DPI_LINK_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_MASQ_WETH_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_BUSD_LINK_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_LINK_GSWAP_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_LINK_CEL_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_LINK_YAX_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_LINK_CFI_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_LINK_USDC_POOL).earned(account,0);
+ totalRewards += StakingRewards(LSLP_LINK_USDT_POOL).earned(account,0);
+
+ return totalRewards;
+ } else if (token == SYFL) {
+ uint256 totalRewards = 0;
+ totalRewards += StakingRewards(LSLP_LINK_YFLUSD_POOL).earned(account,1);
+ totalRewards += StakingRewards(LSLP_YFLUSD_WETH_POOL).earned(account,1);
+ totalRewards += StakingRewards(LSLP_LINK_SYFL_POOL).earned(account,1);
+ totalRewards += StakingRewards(LSLP_SYFL_WETH_POOL).earned(account,1);
+ return totalRewards;
+ } else if (token == CFI) {
+ return StakingRewards(LSLP_LINK_CFI_POOL).earned(account,1);
+ } else if (token == MASQ) {
+ return StakingRewards(LSLP_MASQ_WETH_POOL).earned(account,1);
+ } else if (token == DPI) {
+ return StakingRewards(LSLP_DPI_LINK_POOL).earned(account,1);
+ } else if (token == CEL) {
+ return StakingRewards(LSLP_LINK_CEL_POOL).earned(account,1);
+ } else if (token == YAX) {
+ uint256 totalRewards = 0;
+ totalRewards += StakingRewards(LSLP_LINK_YAX_POOL).earned(account,1);
+ totalRewards += StakingRewards(LSLP_YAX_WETH_POOL).earned(account,1);
+ return totalRewards;
+ } else if (token == GSWAP) {
+ return StakingRewards(LSLP_LINK_GSWAP_POOL).earned(account,1);
+ } else if (token == AZUKI) {
+ uint256 totalRewards = 0;
+ totalRewards += StakingRewards(LSLP_LINK_AZUKI_POOL).earned(account,1);
+ totalRewards += StakingRewards(LSLP_LINK_DOKI_POOL).earned(account,1);
+ return totalRewards;
+ } else if (token == LSLP_YFL_WETH) {
+ uint256 total = 0;
+ total += ERC20(LSLP_YFL_WETH_POOL).balanceOf(account);
+ total += ERC20(LSLP_YFL_WETH_POOL_NEW).balanceOf(account);
+ total += ERC20(LSLP_YFL_WETH).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_YFL_LINK) {
+ uint256 total = 0;
+ total += ERC20(LSLP_YFL_LINK_POOL).balanceOf(account);
+ total += ERC20(LSLP_YFL_LINK).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_YFLUSD) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_YFLUSD_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_YFLUSD).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_YFLUSD_WETH) {
+ uint256 total = 0;
+ total += ERC20(LSLP_YFLUSD_WETH_POOL).balanceOf(account);
+ total += ERC20(LSLP_YFLUSD_WETH).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_SYFL) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_SYFL_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_SYFL).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_SYFL_WETH) {
+ uint256 total = 0;
+ total += ERC20(LSLP_SYFL_WETH_POOL).balanceOf(account);
+ total += ERC20(LSLP_SYFL_WETH).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_DPI_LINK) {
+ uint256 total = 0;
+ total += ERC20(LSLP_DPI_LINK_POOL).balanceOf(account);
+ total += ERC20(LSLP_DPI_LINK).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_MASQ_WETH) {
+ uint256 total = 0;
+ total += ERC20(LSLP_MASQ_WETH_POOL).balanceOf(account);
+ total += ERC20(LSLP_MASQ_WETH).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_BUSD_LINK) {
+ uint256 total = 0;
+ total += ERC20(LSLP_BUSD_LINK_POOL).balanceOf(account);
+ total += ERC20(LSLP_BUSD_LINK).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_GSWAP) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_GSWAP_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_GSWAP).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_CFI) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_CFI_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_CFI).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_CEL) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_CEL_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_CEL).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_YAX) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_YAX_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_YAX).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_YAX_WETH) {
+ uint256 total = 0;
+ total += ERC20(LSLP_YAX_WETH_POOL).balanceOf(account);
+ total += ERC20(LSLP_YAX_WETH).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_USDC) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_USDC_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_USDC).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_USDT) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_USDT_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_USDT).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_AZUKI) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_AZUKI_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_AZUKI).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else if (token == LSLP_LINK_DOKI) {
+ uint256 total = 0;
+ total += ERC20(LSLP_LINK_DOKI_POOL).balanceOf(account);
+ total += ERC20(LSLP_LINK_DOKI).balanceOf(GOVERNANCE_FEES);
+ return total;
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/livepeer/LivepeerStakingAdapter.sol b/contracts/adapters/livepeer/LivepeerStakingAdapter.sol
new file mode 100644
index 00000000..def27abe
--- /dev/null
+++ b/contracts/adapters/livepeer/LivepeerStakingAdapter.sol
@@ -0,0 +1,73 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev BondingManager contract interface.
+ * Only the functions required for LivepeerStakingAdapter contract are added.
+ * The BondingManager contract is available here
+ * github.com/livepeer/protocol/blob/streamflow/contracts/bonding/BondingManager.sol.
+ */
+interface BondingManager {
+ function pendingStake(address, uint256) external view returns (uint256);
+}
+
+
+/**
+ * @dev RoundsManager contract interface.
+ * Only the functions required for LivepeerStakingAdapter contract are added.
+ * The RoundsManager contract is available here
+ * github.com/livepeer/protocol/blob/streamflow/contracts/rounds/RoundsManager.sol.
+ */
+interface RoundsManager {
+ function currentRound() external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Livepeer protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Adam Soffer
+ */
+contract LivepeerStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant LPT = 0x58b6A8A3302369DAEc383334672404Ee733aB239;
+ address internal constant BONDING_MANAGER = 0x511Bc4556D823Ae99630aE8de28b9B80Df90eA2e;
+ address internal constant ROUNDS_MANAGER = 0x3984fc4ceEeF1739135476f625D36d6c35c40dc3;
+
+ /**
+ * @return Amount of LPT staked by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == LPT) {
+ uint256 currentRound = RoundsManager(ROUNDS_MANAGER).currentRound();
+ return BondingManager(BONDING_MANAGER).pendingStake(account, currentRound);
+ } else {
+ return 0;
+ }
+
+ }
+}
diff --git a/contracts/adapters/maker/MCDAssetAdapter.sol b/contracts/adapters/maker/MCDAssetAdapter.sol
index 5cb4752f..e04008c1 100755
--- a/contracts/adapters/maker/MCDAssetAdapter.sol
+++ b/contracts/adapters/maker/MCDAssetAdapter.sol
@@ -89,7 +89,7 @@ contract MCDAssetAdapter is ProtocolAdapter, MKRAdapter {
(, id) = manager.list(id);
(ink, ) = vat.urns(ilk, urn);
- if (token == WETH && ilk == "ETH-A" || token == BAT && ilk == "BAT-A") {
+ if ((token == WETH && ilk == "ETH-A") || (token == BAT && ilk == "BAT-A")) {
value = uint256(ink);
} else {
value = 0;
diff --git a/contracts/adapters/maker/MKRAdapter.sol b/contracts/adapters/maker/MKRAdapter.sol
index 176a46cb..0b858bee 100755
--- a/contracts/adapters/maker/MKRAdapter.sol
+++ b/contracts/adapters/maker/MKRAdapter.sol
@@ -37,6 +37,7 @@ abstract contract MKRAdapter {
uint256 internal constant ONE = 10 ** 27;
function mkrRpow(uint x, uint n, uint base) internal pure returns (uint z) {
+ //solhint-disable-next-line no-inline-assembly
assembly {
switch x case 0 {switch n case 0 {z := base} default {z := 0}}
default {
diff --git a/contracts/adapters/maker/MakerGovernanceAdapter.sol b/contracts/adapters/maker/MakerGovernanceAdapter.sol
new file mode 100644
index 00000000..4a8220e3
--- /dev/null
+++ b/contracts/adapters/maker/MakerGovernanceAdapter.sol
@@ -0,0 +1,53 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev DSChief contract interface.
+ * Only the functions required for MakerGovernanceAdapter contract are added.
+ * The DSChief contract is available here
+ * github.com/dapphub/ds-chief/blob/master/src/chief.sol.
+ */
+interface DSChief {
+ function deposits(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Maker Governance.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract MakerGovernanceAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant GOVERNANCE = 0x9eF05f7F6deB616fd37aC3c959a2dDD25A54E4F5;
+
+ /**
+ * @return Amount of MKR tokens locked on the Governance module by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ return DSChief(GOVERNANCE).deposits(account);
+ }
+}
diff --git a/contracts/adapters/matic/MaticStakingAdapter.sol b/contracts/adapters/matic/MaticStakingAdapter.sol
new file mode 100644
index 00000000..e86943f4
--- /dev/null
+++ b/contracts/adapters/matic/MaticStakingAdapter.sol
@@ -0,0 +1,55 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingManager contract interface.
+ * Only the functions required for MaticStakingAdapter contract are added.
+ */
+interface ValidatorShare {
+ function getLiquidRewards(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Matic Staking.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract MaticStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant VALIDATOR_SHARE = 0xD9AeF0814e7eCBB4447eab08EDe33b6EBC29F842;
+
+ /**
+ * @return Amount of MATIC tokens locked on the StakingManager contract by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ uint256 totalBalance = 0;
+ totalBalance += ERC20(VALIDATOR_SHARE).balanceOf(account);
+ totalBalance += ValidatorShare(VALIDATOR_SHARE).getLiquidRewards(account);
+ return totalBalance;
+ }
+}
diff --git a/contracts/adapters/melon/MelonAssetAdapter.sol b/contracts/adapters/melon/MelonAssetAdapter.sol
new file mode 100644
index 00000000..c93a3c0f
--- /dev/null
+++ b/contracts/adapters/melon/MelonAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Asset adapter for Melon protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Codingsh
+ */
+contract MelonAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "MelonToken";
+
+ /**
+ * @return Amount of MLNF held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/melon/MelonTokenAdapter.sol b/contracts/adapters/melon/MelonTokenAdapter.sol
new file mode 100644
index 00000000..aa5bac81
--- /dev/null
+++ b/contracts/adapters/melon/MelonTokenAdapter.sol
@@ -0,0 +1,202 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+struct Exchange {
+ address exchange;
+ address adapter;
+ bool takesCustody;
+}
+
+
+struct OpenMakeOrder {
+ uint256 id; // Order Id from exchange
+ uint256 expiresAt; // Timestamp when the order expires
+ uint256 orderIndex; // Index of the order in the orders array
+ address buyAsset; // Address of the buy asset in the order
+ address feeAsset;
+}
+
+
+/**
+ * @dev Spoke contract interface.
+ * Only the functions required for MelonTokenAdapter contract are added.
+ * The Spoke contract is available here
+ * github.com/melonproject/protocol/blob/master/src/fund/hub/Spoke.sol.
+ */
+interface Spoke {
+ function hub() external view returns (address);
+}
+
+
+/**
+ * @dev Hub contract interface.
+ * Only the functions required for MelonTokenAdapter contract are added.
+ * The Hub contract is available here
+ * github.com/melonproject/protocol/blob/master/src/fund/hub/Hub.sol.
+ */
+interface Hub {
+ function accounting() external view returns (address);
+ function vault() external view returns (address);
+ function trading() external view returns (address);
+}
+
+
+/**
+ * @dev Accounting contract interface.
+ * Only the functions required for MelonTokenAdapter contract are added.
+ * The Accounting contract is available here
+ * github.com/melonproject/protocol/blob/master/src/fund/accounting/Accounting.sol.
+ */
+interface Accounting {
+ function getOwnedAssets() external view returns (address[] memory);
+}
+
+
+/**
+ * @dev Trading contract interface.
+ * Only the functions required for MelonTokenAdapter contract are added.
+ * The Trading contract is available here
+ * github.com/melonproject/protocol/blob/master/src/fund/trading/Trading.sol.
+ */
+interface Trading {
+ function exchanges(uint256) external view returns (Exchange memory);
+ function exchangesToOpenMakeOrders(
+ address,
+ address
+ )
+ external
+ view
+ returns (OpenMakeOrder memory);
+}
+
+
+/**
+ * @dev ExchangeAdapter contract interface.
+ * Only the functions required for MelonTokenAdapter contract are added.
+ * The ExchangeAdapter contract is available here
+ * github.com/melonproject/protocol/blob/master/src/exchanges/ExchangeAdapter.sol.
+ */
+interface ExchangeAdapter {
+ function getOrder(
+ address,
+ uint,
+ address
+ )
+ external
+ view
+ returns (
+ address,
+ address,
+ uint
+ );
+}
+
+
+/**
+ * @title Token adapter for Melon Protocol by @codingsh.
+ * @dev Implementation of TokenAdapter interface.
+ * @author codingsh
+ */
+contract MelonTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ uint256 totalSupply = ERC20(token).totalSupply();
+ address hub = Spoke(token).hub();
+ address accounting = Hub(hub).accounting();
+ address vault = Hub(hub).vault();
+ address trading = Hub(hub).trading();
+ address[] memory ownedAssets = Accounting(accounting).getOwnedAssets();
+ uint256 orderId;
+ uint256 totalQuantity;
+ uint256 remainingSellQuantity;
+
+ bool result = true;
+ uint256 counter = 0;
+
+ while (result) {
+ (result, ) = trading.staticcall(
+ abi.encodeWithSelector(
+ Trading(trading).exchanges.selector,
+ counter
+ )
+ );
+ counter++;
+ }
+
+ Exchange[] memory exchanges = new Exchange[](counter - 1);
+
+ for (uint256 i = 0; i < exchanges.length; i++) {
+ exchanges[i] = Trading(trading).exchanges(i);
+ }
+
+ Component[] memory underlyingTokens = new Component[](ownedAssets.length);
+
+ for (uint256 i = 0; i < ownedAssets.length; i++) {
+ totalQuantity = ERC20(ownedAssets[i]).balanceOf(vault);
+ totalQuantity += ERC20(ownedAssets[i]).balanceOf(trading);
+
+ for (uint256 j = 0; j < exchanges.length; j++) {
+ orderId = Trading(trading).exchangesToOpenMakeOrders(
+ exchanges[j].exchange,
+ ownedAssets[i]
+ ).id;
+ if (orderId == 0) {
+ continue;
+ }
+ (, , remainingSellQuantity) = ExchangeAdapter(exchanges[j].adapter).getOrder(
+ exchanges[j].exchange,
+ orderId,
+ ownedAssets[i]
+ );
+ if (exchanges[j].takesCustody) {
+ totalQuantity += remainingSellQuantity;
+ }
+ }
+
+ underlyingTokens[i] = Component({
+ token: ownedAssets[i],
+ tokenType: "ERC20",
+ rate: totalQuantity * 1e18 / totalSupply
+ });
+ }
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/mooniswap/MooniswapAdapter.sol b/contracts/adapters/mooniswap/MooniswapAdapter.sol
new file mode 100755
index 00000000..240c2817
--- /dev/null
+++ b/contracts/adapters/mooniswap/MooniswapAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Mooniswap protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author 1inch.exchange
+ */
+contract MooniswapAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "Mooniswap pool token";
+
+ /**
+ * @return Amount of Mooniswap pool tokens held by the given account.
+ * @param token Address of the Mooniswap pool.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/mooniswap/MooniswapTokenAdapter.sol b/contracts/adapters/mooniswap/MooniswapTokenAdapter.sol
new file mode 100755
index 00000000..5b38a3c1
--- /dev/null
+++ b/contracts/adapters/mooniswap/MooniswapTokenAdapter.sol
@@ -0,0 +1,113 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev CToken contract interface.
+ * Only the functions required for MooniswapTokenAdapter contract are added.
+ * The CToken contract is available here
+ * github.com/compound-finance/compound-protocol/blob/master/contracts/CToken.sol.
+ */
+interface CToken {
+ function isCToken() external view returns (bool);
+}
+
+
+/**
+ * @dev Mooniswap contract interface.
+ * Only the functions required for MooniswapTokenAdapter contract are added.
+ * The MooniswapV2Pair contract is available here
+ * github.com/CryptoManiacsZone/mooniswap/blob/master/contracts/Mooniswap.sol
+ */
+interface Mooniswap {
+ function getTokens() external view returns(address[] memory);
+}
+
+
+/**
+ * @title Token adapter for Mooniswap pool tokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author 1inch.exchange
+ */
+contract MooniswapTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address[] memory tokens = Mooniswap(token).getTokens();
+ uint256 totalSupply = ERC20(token).totalSupply();
+ Component[] memory underlyingTokens = new Component[](2);
+
+ for (uint256 i = 0; i < 2; i++) {
+ underlyingTokens[i] = Component({
+ token: isETH(ERC20(tokens[i])) ? 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE : tokens[i],
+ tokenType: getTokenType(tokens[i]),
+ rate: uniBalanceOf(ERC20(tokens[i]), token) * 1e18 / totalSupply
+ });
+ }
+
+ return underlyingTokens;
+ }
+
+ function getTokenType(address token) internal view returns (string memory) {
+ (bool success, bytes memory returnData) = token.staticcall{gas: 2000}(
+ abi.encodeWithSelector(CToken(token).isCToken.selector)
+ );
+
+ if (success) {
+ if (returnData.length == 32) {
+ return abi.decode(returnData, (bool)) ? "CToken" : "ERC20";
+ } else {
+ return "ERC20";
+ }
+ } else {
+ return "ERC20";
+ }
+ }
+
+ function uniBalanceOf(ERC20 token, address account) internal view returns (uint256) {
+ if (isETH(token)) {
+ return account.balance;
+ } else {
+ return token.balanceOf(account);
+ }
+ }
+
+ function isETH(ERC20 token) internal pure returns(bool) {
+ return (address(token) == address(0));
+ }
+}
diff --git a/contracts/adapters/mstable/MstableAssetAdapter.sol b/contracts/adapters/mstable/MstableAssetAdapter.sol
new file mode 100644
index 00000000..70d45f02
--- /dev/null
+++ b/contracts/adapters/mstable/MstableAssetAdapter.sol
@@ -0,0 +1,60 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev SavingsContract contract interface.
+ * Only the functions required for MstableAssetAdapter contract are added.
+ * The SavingsContract contract is available here
+ * github.com/mstable/mStable-contracts/blob/master/contracts/savings/SavingsContract.sol.
+ */
+interface SavingsContract {
+ function creditBalances(address) external view returns (uint256);
+ function exchangeRate() external view returns (uint256);
+}
+
+
+/**
+ * @title Asset adapter for mStable protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract MstableAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+string public constant override tokenType = "Masset";
+
+address internal constant SAVINGS = 0xcf3F73290803Fc04425BEE135a4Caeb2BaB2C2A1;
+
+uint256 internal constant FULL_SCALE = 1e18;
+
+/**
+ * @return Amount of mUSD owned and locked on the protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+function getBalance(address, address account) external view override returns (uint256) {
+uint256 credits = SavingsContract(SAVINGS).creditBalances(account);
+uint256 exchangeRate = SavingsContract(SAVINGS).exchangeRate();
+
+return credits * exchangeRate / FULL_SCALE;
+}
+}
diff --git a/contracts/adapters/mstable/MstableSavingsAssetAdapter.sol b/contracts/adapters/mstable/MstableSavingsAssetAdapter.sol
new file mode 100644
index 00000000..248a6b25
--- /dev/null
+++ b/contracts/adapters/mstable/MstableSavingsAssetAdapter.sol
@@ -0,0 +1,47 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Asset adapter for mStable protocol (Intereast Bearing mUSD).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract MstableSavingsAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "mStable Savings";
+
+ address internal constant IMUSD = 0x30647a72Dc82d7Fbb1123EA74716aB8A317Eac19;
+
+ /**
+ * @return Amount of imUSD owned by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == IMUSD) {
+ return ERC20(IMUSD).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/mstable/MstableSavingsTokenAdapter.sol b/contracts/adapters/mstable/MstableSavingsTokenAdapter.sol
new file mode 100644
index 00000000..cc8ccc31
--- /dev/null
+++ b/contracts/adapters/mstable/MstableSavingsTokenAdapter.sol
@@ -0,0 +1,69 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+/**
+ * @dev SavingsContract contract interface.
+ * Only the functions required for MstableAssetAdapter contract are added.
+ * The SavingsContract contract is available here
+ * github.com/mstable/mStable-contracts/blob/master/contracts/savings/SavingsContract.sol.
+ */
+interface SavingsContract {
+ function underlying() external view returns (address);
+ function exchangeRate() external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for mStable protocol (Intereast Bearing mUSD).
+ * @dev Implementation of TokenAdapter interface.
+ */
+contract MstableSavingsTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ Component[] memory underlyingTokens = new Component[](1);
+
+ underlyingTokens[0] = Component({
+ token: SavingsContract(token).underlying(),
+ tokenType: "ERC20",
+ rate: SavingsContract(token).exchangeRate()
+ });
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/mstable/MstableStakingAdapter.sol b/contracts/adapters/mstable/MstableStakingAdapter.sol
new file mode 100755
index 00000000..dab49c4f
--- /dev/null
+++ b/contracts/adapters/mstable/MstableStakingAdapter.sol
@@ -0,0 +1,114 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for MstableStakingAdapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/mstable/mStable-contracts/blob/master/contracts/rewards/staking/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
+/**
+ * @dev StakingRewardsWithPlatformToken contract interface.
+ * Only the functions required for MstableStakingAdapter contract are added.
+ * The StakingRewardsWithPlatformToken contract is available here
+ * github.com/mstable/mStable-contracts/blob/master/contracts/rewards/staking/StakingRewardsWithPlatformToken.sol.
+ */
+interface StakingRewardsWithPlatformToken {
+ function earned(address) external view returns (uint256, uint256);
+}
+
+
+/**
+ * @title Adapter for mStable protocol staking.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract MstableStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant MTA = 0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2;
+ address internal constant BAL = 0xba100000625a3754423978a60c9317c58a424e3D;
+ address internal constant BALANCER_MUSD_MTA_20_80 = 0x003a70265a3662342010823bEA15Dc84C6f7eD54;
+ address internal constant BALANCER_USDC_MUSD_50_50 = 0x72Cd8f4504941Bf8c5a21d1Fd83A96499FD71d2C;
+ address internal constant BALANCER_MUSD_MTA_95_5 = 0xa5DA8Cc7167070B62FdCB332EF097A55A68d8824;
+ address internal constant BALANCER_WETH_MUSD_50_50 = 0xe036CCE08cf4E23D33bC6B18e53Caf532AFa8513;
+ address internal constant UNISWAP_MTA_WETH = 0x0d0d65E7A7dB277d3E0F5E1676325E75f3340455;
+
+ address internal constant EARN_POOL = 0x881c72D1e6317f10a1cDCBe05040E7564E790C80;
+ address internal constant EARN_POOL_2 = 0xf7575D4D4DB78F6Ba43C734616C51E9fD4bAA7fb;
+ address internal constant EARN_POOL_3 = 0x25970282aAC735Cd4c76f30BfB0Bf2BC8DAD4e70;
+ address internal constant EARN_POOL_4 = 0xf4a7d2d85F4BA11B5C73c35E27044c0c49F7f027;
+ address internal constant EARN_POOL_5 = 0x9B4abA35b35EEE7481775cCB4055Ce4e176C9a6F;
+
+ /**
+ * @return Amount of YTokens held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == MTA) {
+ uint256 totalRewards = 0;
+ uint256 reward;
+ (reward, ) = StakingRewardsWithPlatformToken(EARN_POOL).earned(account);
+ totalRewards += reward;
+ (reward, ) = StakingRewardsWithPlatformToken(EARN_POOL_2).earned(account);
+ totalRewards += reward;
+ (reward, ) = StakingRewardsWithPlatformToken(EARN_POOL_3).earned(account);
+ totalRewards += reward;
+ (reward, ) = StakingRewardsWithPlatformToken(EARN_POOL_4).earned(account);
+ totalRewards += reward;
+ totalRewards += StakingRewards(EARN_POOL_5).earned(account);
+ return totalRewards;
+ } else if (token == BAL) {
+ uint256 totalRewards = 0;
+ uint256 reward;
+ (, reward) = StakingRewardsWithPlatformToken(EARN_POOL).earned(account);
+ totalRewards += reward;
+ (, reward) = StakingRewardsWithPlatformToken(EARN_POOL_2).earned(account);
+ totalRewards += reward;
+ (, reward) = StakingRewardsWithPlatformToken(EARN_POOL_3).earned(account);
+ totalRewards += reward;
+ (, reward) = StakingRewardsWithPlatformToken(EARN_POOL_4).earned(account);
+ totalRewards += reward;
+ return totalRewards;
+ } else if (token == BALANCER_USDC_MUSD_50_50) {
+ return ERC20(EARN_POOL).balanceOf(account);
+ } else if (token == BALANCER_WETH_MUSD_50_50) {
+ return ERC20(EARN_POOL_2).balanceOf(account);
+ } else if (token == BALANCER_MUSD_MTA_20_80) {
+ return ERC20(EARN_POOL_3).balanceOf(account);
+ } else if (token == BALANCER_MUSD_MTA_95_5) {
+ return ERC20(EARN_POOL_4).balanceOf(account);
+ } else if (token == UNISWAP_MTA_WETH) {
+ return ERC20(EARN_POOL_5).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/mstable/MstableTokenAdapter.sol b/contracts/adapters/mstable/MstableTokenAdapter.sol
new file mode 100644
index 00000000..9fe8bb8f
--- /dev/null
+++ b/contracts/adapters/mstable/MstableTokenAdapter.sol
@@ -0,0 +1,130 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev Basset struct.
+ * The Basset struct is available here
+ * github.com/mstable/mStable-contracts/blob/master/contracts/masset/shared/MassetStructs.sol.
+ */
+struct Basset {
+ address addr;
+ uint8 status;
+ bool isTransferFeeCharged;
+ uint256 ratio;
+ uint256 maxWeight;
+ uint256 vaultBalance;
+}
+//
+//
+///**
+// * @dev BassetStatus enum.
+// * The BassetStatus enum is available here
+// * github.com/mstable/mStable-contracts/blob/master/contracts/masset/shared/MassetStructs.sol.
+// */
+//enum BassetStatus {
+// Default,
+// Normal,
+// BrokenBelowPeg,
+// BrokenAbovePeg,
+// Blacklisted,
+// Liquidating,
+// Liquidated,
+// Failed
+//}
+
+
+/**
+ * @dev BasketManager contract interface.
+ * Only the functions required for MassetTokenAdapter contract are added.
+ * The BasketManager contract is available here
+ * github.com/mstable/mStable-contracts/blob/master/contracts/masset/BasketManager.sol.
+ */
+interface BasketManager {
+ function getBassets() external view returns (Basset[] memory, uint256);
+}
+
+
+/**
+ * @dev ForgeValidator contract interface.
+ * Only the functions required for MassetTokenAdapter contract are added.
+ * The ForgeValidator contract is available here
+ * github.com/mstable/mStable-contracts/blob/master/contracts/masset/forge-validator/ForgeValidator.sol.
+ */
+interface ForgeValidator {
+ function calculateRedemptionMulti(
+ uint256,
+ Basset[] calldata
+ )
+ external
+ view
+ returns (bool, string memory, uint256[] memory);
+}
+
+
+/**
+ * @title Token adapter for Masset.
+ * @dev Implementation of TokenAdapter interface.
+ */
+contract MstableTokenAdapter is TokenAdapter {
+
+ address internal constant BASKET_MANAGER = 0x66126B4aA2a1C07536Ef8E5e8bD4EfDA1FdEA96D;
+ address internal constant FORGE_VALIDATOR = 0xbB90D06371030fFa150E463621c22950b212eaa1;
+
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address) external view override returns (Component[] memory) {
+ (Basset[] memory bassets, uint256 length) = BasketManager(BASKET_MANAGER).getBassets();
+ uint256[] memory underlyingAmounts;
+ (, , underlyingAmounts) = ForgeValidator(FORGE_VALIDATOR).calculateRedemptionMulti(
+ 1e18,
+ bassets
+ );
+
+ Component[] memory underlyingTokens = new Component[](length);
+ for (uint256 i = 0; i < length; i++) {
+ underlyingTokens[i] = Component({
+ token: bassets[i].addr,
+ tokenType: "ERC20",
+ rate: underlyingAmounts[i]
+ });
+ }
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/mushrooms/MushroomsAssetAdapter.sol b/contracts/adapters/mushrooms/MushroomsAssetAdapter.sol
new file mode 100644
index 00000000..f94132e2
--- /dev/null
+++ b/contracts/adapters/mushrooms/MushroomsAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Mushrooms protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract MushroomsAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "MMVault";
+
+ /**
+ * @return Amount of MMVault LP token held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/mushrooms/MushroomsFarmingAdapter.sol b/contracts/adapters/mushrooms/MushroomsFarmingAdapter.sol
new file mode 100644
index 00000000..4ce398a7
--- /dev/null
+++ b/contracts/adapters/mushrooms/MushroomsFarmingAdapter.sol
@@ -0,0 +1,112 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev UserInfo struct from MasterChef contract.
+ * The MasterChef contract is available (verified and open-sourced) at
+ * https://etherscan.io/address/0xf8873a6080e8dbf41ada900498de0951074af577
+ */
+struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+}
+
+
+/**
+ * @dev PoolInfo struct from MasterChef contract.
+ * The MasterChef contract is available (verified and open-sourced) at
+ * https://etherscan.io/address/0xf8873a6080e8dbf41ada900498de0951074af577
+ */
+struct PoolInfo {
+ address lpToken;
+ uint256 allocPoint;
+ uint256 lastRewardBlock;
+ uint256 accSushiPerShare;
+ uint256 amount;
+}
+
+
+/**
+ * @dev MasterChef contract interface.
+ * Only the functions required for MushroomsFarmingAdapter contract are added.
+ * The MasterChef contract is available (verified and open-sourced) at
+ * https://etherscan.io/address/0xf8873a6080e8dbf41ada900498de0951074af577
+ */
+interface MasterChef {
+ function poolLength() external view returns (uint256);
+ function poolInfo(uint256) external view returns (PoolInfo memory);
+ function userInfo(uint256, address) external view returns (UserInfo memory);
+ function pendingMM(uint256, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Mushrooms protocol (farming).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract MushroomsFarmingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant MM = 0xa283aA7CfBB27EF0cfBcb2493dD9F4330E0fd304;
+ address internal constant MASTER_CHEF = 0xf8873a6080e8dbF41ADa900498DE0951074af577;
+
+ /**
+ * @return Amount of staked tokens / claimable rewards for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+uint256 length = MasterChef(MASTER_CHEF).poolLength();
+PoolInfo memory pool;
+
+if (token == MM) {
+ uint256 totalRewards = 0;
+
+ for(uint256 i = 0; i < length; i++) {
+ totalRewards += MasterChef(MASTER_CHEF).pendingMM(i, account);
+ }
+
+ for(uint256 i = 0; i < length; i++) {
+ pool = MasterChef(MASTER_CHEF).poolInfo(i);
+
+ if (pool.lpToken == token) {
+ totalRewards += MasterChef(MASTER_CHEF).userInfo(i, account).amount;
+ break;
+ }
+ }
+
+ return totalRewards;
+ } else {
+ for(uint256 i = 0; i < length; i++) {
+ pool = MasterChef(MASTER_CHEF).poolInfo(i);
+
+ if (pool.lpToken == token) {
+ return MasterChef(MASTER_CHEF).userInfo(i, account).amount;
+ }
+ }
+
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/mushrooms/MushroomsTokenAdapter.sol b/contracts/adapters/mushrooms/MushroomsTokenAdapter.sol
new file mode 100644
index 00000000..c5dd01f8
--- /dev/null
+++ b/contracts/adapters/mushrooms/MushroomsTokenAdapter.sol
@@ -0,0 +1,71 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev MMVault contract interface.
+ * Only the functions required for MushroomsTokenAdapter contract are added.
+ * The MMVault contracts is available (verified and open-sourced) at
+ * https://etherscan.io/address/0x23b197dc671a55f256199cf7e8bee77ea2bdc16d
+ */
+interface MMVault {
+ function token() external view returns (address);
+ function getRatio() external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for MMVault.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract MushroomsTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ Component[] memory underlyingTokens = new Component[](1);
+
+ underlyingTokens[0] = Component({
+ token: MMVault(token).token(),
+ tokenType: "ERC20",
+ rate: MMVault(token).getRatio()
+ });
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/nexus/NexusStakingAdapter.sol b/contracts/adapters/nexus/NexusStakingAdapter.sol
new file mode 100644
index 00000000..1b212353
--- /dev/null
+++ b/contracts/adapters/nexus/NexusStakingAdapter.sol
@@ -0,0 +1,57 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev TokenController contract interface.
+ * Only the functions required for NexusStakingAdapter contract are added.
+ * The TokenController contract is available here
+ * github.com/somish/NexusMutual/blob/master/contracts/TokenController.sol.
+ */
+interface TokenController {
+ function totalBalanceOf(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Nexus Mutual protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract NexusStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant TOKEN_CONTROLLER = 0x5407381b6c251cFd498ccD4A1d877739CB7960B8;
+ address internal constant NXM = 0xd7c49CEE7E9188cCa6AD8FF264C1DA2e69D4Cf3B;
+
+ /**
+ * @return Amount of staked tokens + rewards by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ uint256 totalBalance = TokenController(TOKEN_CONTROLLER).totalBalanceOf(account);
+ uint256 tokenBalance = ERC20(NXM).balanceOf(account);
+ return totalBalance - tokenBalance;
+ }
+}
diff --git a/contracts/adapters/oneInch/ChiAdapter.sol b/contracts/adapters/oneInch/ChiAdapter.sol
new file mode 100644
index 00000000..306c398c
--- /dev/null
+++ b/contracts/adapters/oneInch/ChiAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Chi Gastoken by 1inch.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author 1inch.exchange
+ */
+contract ChiAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "Chi token";
+
+ /**
+ * @return Amount of Chi Token held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/oneInch/ChiTokenAdapter.sol b/contracts/adapters/oneInch/ChiTokenAdapter.sol
new file mode 100644
index 00000000..d9a17469
--- /dev/null
+++ b/contracts/adapters/oneInch/ChiTokenAdapter.sol
@@ -0,0 +1,93 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev OneSplit contract interface.
+ * Only the functions required for OneInchChiTokenAdapter contract are added.
+ * The OneSplit contract is available here
+ * github.com/CryptoManiacsZone/1inchProtocol/blob/master/contracts/OneSplit.sol.
+ */
+interface IOneSplit {
+ function getExpectedReturn(
+ ERC20 fromToken,
+ ERC20 toToken,
+ uint256 amount,
+ uint256 parts,
+ uint256 disableFlags
+ )
+ external
+ view
+ returns(
+ uint256 returnAmount,
+ uint256[] memory distribution
+ );
+}
+
+
+/**
+ * @title Token adapter for Chi Gastoken by 1inch.
+ * @dev Implementation of TokenAdapter interface.
+ * @author 1inch.exchange
+ */
+contract ChiTokenAdapter is TokenAdapter {
+
+ address private constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+ IOneSplit private constant ONE_SPLIT = IOneSplit(0xC586BeF4a0992C495Cf22e1aeEE4E446CECDee0E);
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ (uint256 returnAmount, ) = ONE_SPLIT.getExpectedReturn(
+ ERC20(token),
+ ERC20(ETH_ADDRESS),
+ 1,
+ 1,
+ 0
+ );
+
+ Component[] memory underlyingTokens = new Component[](1);
+
+ underlyingTokens[0] = Component({
+ token: ETH_ADDRESS,
+ tokenType: "ERC20",
+ rate: returnAmount * 1e18
+ });
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/oneInch/OneInchLiquidityProtocolAdapter.sol b/contracts/adapters/oneInch/OneInchLiquidityProtocolAdapter.sol
new file mode 100755
index 00000000..74669209
--- /dev/null
+++ b/contracts/adapters/oneInch/OneInchLiquidityProtocolAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for 1inch liquidity protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author 1inch.exchange
+ */
+contract OneInchLiquidityProtocolAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "1inch liquidity protocol token";
+
+ /**
+ * @return Amount of 1inch liquidity protocol tokens held by the given account.
+ * @param token Address of the 1inch liquidity protocol.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/oneInch/OneInchLiquidityProtocolTokenAdapter.sol b/contracts/adapters/oneInch/OneInchLiquidityProtocolTokenAdapter.sol
new file mode 100755
index 00000000..b2a0fe2e
--- /dev/null
+++ b/contracts/adapters/oneInch/OneInchLiquidityProtocolTokenAdapter.sol
@@ -0,0 +1,84 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev OneInchLiquidityProtocol contract interface.
+ * Only the functions required for OneInchLiquidityProtocolTokenAdapter contract are added.
+ */
+interface OneInchLiquidityProtocol {
+ function getTokens() external view returns(address[] memory);
+}
+
+
+/**
+ * @title Token adapter for OneInchLiquidityProtocol pool tokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author 1inch.exchange
+ */
+contract OneInchLiquidityProtocolTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address[] memory tokens = OneInchLiquidityProtocol(token).getTokens();
+ uint256 totalSupply = ERC20(token).totalSupply();
+ Component[] memory underlyingTokens = new Component[](2);
+
+ for (uint256 i = 0; i < 2; i++) {
+ underlyingTokens[i] = Component({
+ token: isETH(ERC20(tokens[i])) ? 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE : tokens[i],
+ tokenType: "ERC20",
+ rate: totalSupply == 0 ? 0 : uniBalanceOf(ERC20(tokens[i]), token) * 1e18 / totalSupply
+ });
+ }
+
+ return underlyingTokens;
+ }
+
+ function uniBalanceOf(ERC20 token, address account) internal view returns (uint256) {
+ if (isETH(token)) {
+ return account.balance;
+ } else {
+ return token.balanceOf(account);
+ }
+ }
+
+ function isETH(ERC20 token) internal pure returns(bool) {
+ return (address(token) == address(0));
+ }
+}
diff --git a/contracts/adapters/ousd/OusdAssetAdapter.sol b/contracts/adapters/ousd/OusdAssetAdapter.sol
new file mode 100644
index 00000000..6a98113a
--- /dev/null
+++ b/contracts/adapters/ousd/OusdAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2021 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Asset adapter for OUSD token.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Domen Grabec
+ */
+contract OusdAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "OUSD token";
+
+ /**
+ * @return Amount of OUSD held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/ousd/OusdTokenAdapter.sol b/contracts/adapters/ousd/OusdTokenAdapter.sol
new file mode 100644
index 00000000..f6cb5830
--- /dev/null
+++ b/contracts/adapters/ousd/OusdTokenAdapter.sol
@@ -0,0 +1,85 @@
+// Copyright (C) 2021 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev VaultLib contract interface.
+ * Only the functions required for OusdTokenAdapter contract are added.
+ */
+interface VaultLib {
+ function calculateRedeemOutputs(uint256 _amount) external view returns (uint256[] memory);
+ function getAllAssets() external view returns (address[] memory);
+}
+
+
+/**
+ * @dev OUSD contract interface.
+ * Only the functions required for OusdTokenAdapter contract are added.
+ */
+interface OusdLib {
+ function vaultAddress() external view returns (address);
+}
+
+
+/**
+ * @title Token adapter for OUSD Protocol.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Domen Grabec
+ */
+contract OusdTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address vaultAddress = OusdLib(token).vaultAddress();
+ address[] memory trackedAssets = VaultLib(vaultAddress).getAllAssets();
+ uint256[] memory redeemOutputs = VaultLib(vaultAddress).calculateRedeemOutputs(1e18);
+
+ uint256 length = trackedAssets.length;
+ Component[] memory underlyingTokens = new Component[](length);
+
+ for (uint256 i = 0; i < length; i++) {
+ underlyingTokens[i] = Component({
+ token: trackedAssets[i],
+ tokenType: "ERC20",
+ rate: redeemOutputs[i]
+ });
+ }
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/pickle/PickleAssetAdapter.sol b/contracts/adapters/pickle/PickleAssetAdapter.sol
new file mode 100755
index 00000000..483c88f6
--- /dev/null
+++ b/contracts/adapters/pickle/PickleAssetAdapter.sol
@@ -0,0 +1,41 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Pickle protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract PickleAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "PickleJar";
+
+ /**
+ * @return Amount of PickleJars held by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/pickle/PickleStakingV1Adapter.sol b/contracts/adapters/pickle/PickleStakingV1Adapter.sol
new file mode 100644
index 00000000..5d8fd2bb
--- /dev/null
+++ b/contracts/adapters/pickle/PickleStakingV1Adapter.sol
@@ -0,0 +1,71 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for PickleStakingV1Adapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Pickle protocol (staking).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract PickleStakingV1Adapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant PICKLE = 0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5;
+ address internal constant S_CRV = 0xC25a3A3b969415c80451098fa907EC722572917F;
+ address internal constant PICKLE_POOL_V1 = 0xD86F33388BF0bfDF0cCb1ECB4A48a1579504DC0a;
+ address internal constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
+ address internal constant PICKLE_POOL_V2 = 0xa17a8883dA1aBd57c690DF9Ebf58fC194eDAb66F;
+
+ /**
+ * @return Amount of staked tokens / claimable rewards for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == PICKLE) {
+ uint256 totalBalance = 0;
+
+ totalBalance += ERC20(PICKLE_POOL_V1).balanceOf(account);
+ totalBalance += ERC20(PICKLE_POOL_V2).balanceOf(account);
+
+ return totalBalance;
+ } else if (token == S_CRV) {
+ return StakingRewards(PICKLE_POOL_V1).earned(account);
+ } else if (token == WETH) {
+ return StakingRewards(PICKLE_POOL_V2).earned(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/pickle/PickleStakingV2Adapter.sol b/contracts/adapters/pickle/PickleStakingV2Adapter.sol
new file mode 100644
index 00000000..87588ee2
--- /dev/null
+++ b/contracts/adapters/pickle/PickleStakingV2Adapter.sol
@@ -0,0 +1,102 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev UserInfo struct from MasterChef contract.
+ * The MasterChef contract is available here
+ * github.com/pickle-finance/contracts/blob/master/YieldFarming/MasterChef.sol.
+ */
+struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+}
+
+
+/**
+ * @dev PoolInfo struct from MasterChef contract.
+ * The MasterChef contract is available here
+ * github.com/pickle-finance/contracts/blob/master/YieldFarming/MasterChef.sol.
+ */
+struct PoolInfo {
+ address lpToken;
+ uint256 allocPoint;
+ uint256 lastRewardBlock;
+ uint256 accSushiPerShare;
+}
+
+
+/**
+ * @dev MasterChef contract interface.
+ * Only the functions required for PickleStakingV2Adapter contract are added.
+ * The MasterChef contract is available here
+ * github.com/pickle-finance/contracts/blob/master/YieldFarming/MasterChef.sol.
+ */
+interface MasterChef {
+ function poolLength() external view returns (uint256);
+ function poolInfo(uint256) external view returns (PoolInfo memory);
+ function userInfo(uint256, address) external view returns (UserInfo memory);
+ function pendingPickle(uint256, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Pickle protocol (staking).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract PickleStakingV2Adapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant PICKLE = 0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5;
+ address internal constant MASTER_CHEF = 0xbD17B1ce622d73bD438b9E658acA5996dc394b0d;
+
+ /**
+ * @return Amount of staked tokens / claimable rewards for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ uint256 length = MasterChef(MASTER_CHEF).poolLength();
+
+ if (token == PICKLE) {
+ uint256 totalRewards = 0;
+
+ for(uint256 i = 0; i < length; i++) {
+ totalRewards += MasterChef(MASTER_CHEF).pendingPickle(i, account);
+ }
+
+ return totalRewards;
+ } else {
+ PoolInfo memory pool;
+ for(uint256 i = 0; i < length; i++) {
+ pool = MasterChef(MASTER_CHEF).poolInfo(i);
+
+ if (pool.lpToken == token) {
+ return MasterChef(MASTER_CHEF).userInfo(i, account).amount;
+ }
+ }
+
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/pickle/PickleTokenAdapter.sol b/contracts/adapters/pickle/PickleTokenAdapter.sol
new file mode 100755
index 00000000..e1b17e92
--- /dev/null
+++ b/contracts/adapters/pickle/PickleTokenAdapter.sol
@@ -0,0 +1,71 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev PickleJar contract interface.
+ * Only the functions required for PickleTokenAdapter contract are added.
+ * The PickleJar contracts is available here
+ * github.com/pickle-finance/contracts/blob/master/PickleJars/PickleJar.sol.
+ */
+interface PickleJar {
+ function token() external view returns (address);
+ function getRatio() external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for YTokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract PickleTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ Component[] memory underlyingTokens = new Component[](1);
+
+ underlyingTokens[0] = Component({
+ token: PickleJar(token).token(),
+ tokenType: "ERC20",
+ rate: PickleJar(token).getRatio()
+ });
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/pieDAO/PieDAOExperiPieAdapter.sol b/contracts/adapters/pieDAO/PieDAOExperiPieAdapter.sol
new file mode 100644
index 00000000..dbd047e7
--- /dev/null
+++ b/contracts/adapters/pieDAO/PieDAOExperiPieAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {ProtocolAdapter} from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for PieDAO pools.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Mick de Graaf
+ */
+contract PieDAOExperiPieAdapter is ProtocolAdapter {
+
+string public constant override adapterType = "Asset";
+
+string public constant override tokenType = "PieDAO ExperiPie Token";
+
+/**
+ * @return Amount of PieDAO pool tokens held by the given account.
+ * @param token Address of the pool!
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+function getBalance(address token, address account) external view override returns (uint256) {
+return ERC20(token).balanceOf(account);
+}
+}
diff --git a/contracts/adapters/pieDAO/PieDAOExperiPieTokenAdapter.sol b/contracts/adapters/pieDAO/PieDAOExperiPieTokenAdapter.sol
new file mode 100644
index 00000000..1b1c2b76
--- /dev/null
+++ b/contracts/adapters/pieDAO/PieDAOExperiPieTokenAdapter.sol
@@ -0,0 +1,72 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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 .
+//
+// SPDX-License-Identifier: LGPL-3.0-only
+
+pragma solidity 0.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {TokenMetadata, Component} from "../../Structs.sol";
+import {TokenAdapter} from "../TokenAdapter.sol";
+
+
+interface ExperiPie {
+ function balance(address token) external view returns (uint256);
+
+ function getTokens() external view returns (address[] memory);
+}
+
+
+/**
+ * @title Token adapter for Pie pool tokens.
+ * @dev Implementation of TokenAdapter abstract contract.
+ * @author Mick de Graaf
+ */
+contract PieDAOExperiPieTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token : token,
+ name : ERC20(token).name(),
+ symbol : ERC20(token).symbol(),
+ decimals : ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given asset.
+ * @dev Implementation of TokenAdapter abstract contract function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address[] memory tokens = ExperiPie(token).getTokens();
+
+ Component[] memory components = new Component[](tokens.length);
+
+ for (uint256 i = 0; i < tokens.length; i++) {
+ components[i] = Component({
+ token : tokens[i],
+ tokenType : "ERC20",
+ rate : (ExperiPie(token).balance(tokens[i]) * 1e18) / ERC20(token).totalSupply()
+ });
+ }
+
+ return components;
+ }
+}
diff --git a/contracts/adapters/pieDAO/PieDAOPieAdapter.sol b/contracts/adapters/pieDAO/PieDAOPieAdapter.sol
new file mode 100644
index 00000000..e6508135
--- /dev/null
+++ b/contracts/adapters/pieDAO/PieDAOPieAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for PieDAO pools.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Mick de Graaf
+ */
+contract PieDAOPieAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "PieDAO Pie Token";
+
+ /**
+ * @return Amount of PieDAO pool tokens held by the given account.
+ * @param token Address of the pool!
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/pieDAO/PieDAOPieTokenAdapter.sol b/contracts/adapters/pieDAO/PieDAOPieTokenAdapter.sol
new file mode 100644
index 00000000..1194af7e
--- /dev/null
+++ b/contracts/adapters/pieDAO/PieDAOPieTokenAdapter.sol
@@ -0,0 +1,93 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev PieSmartPool contract interface.
+ * Only the functions required for UniswapAdapter contract are added.
+ * The BPool contract is available here
+ * github.com/balancer-labs/balancer-core/blob/master/contracts/BPool.sol.
+ */
+interface IPieSmartPool {
+ function getTokens() external view returns (address[] memory);
+ function getBPool() external view returns (address);
+}
+
+
+/**
+ * @dev BPool contract interface.
+ * Only the functions required for UniswapAdapter contract are added.
+ * The BPool contract is available here
+ * github.com/balancer-labs/balancer-core/blob/master/contracts/BPool.sol.
+ */
+interface BPool {
+ function getFinalTokens() external view returns (address[] memory);
+ function getBalance(address) external view returns (uint256);
+ function getNormalizedWeight(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for Pie pool tokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Mick de Graaf
+ */
+contract PieDAOPieTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given asset.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address[] memory underlyingTokensAddresses = IPieSmartPool(token).getTokens();
+ uint256 totalSupply = ERC20(token).totalSupply();
+ BPool bPool = BPool(IPieSmartPool(token).getBPool());
+
+ Component[] memory underlyingTokens = new Component[](underlyingTokensAddresses.length);
+ address underlyingToken;
+
+ for (uint256 i = 0; i < underlyingTokens.length; i++) {
+ underlyingToken = underlyingTokensAddresses[i];
+ underlyingTokens[i] = Component({
+ token: underlyingToken,
+ tokenType: "ERC20",
+ rate: bPool.getBalance(underlyingToken) * 1e18 / totalSupply
+ });
+ }
+
+ return underlyingTokens;
+ }
+
+}
diff --git a/contracts/adapters/pieDAO/PieDAOStakingAdapter.sol b/contracts/adapters/pieDAO/PieDAOStakingAdapter.sol
new file mode 100644
index 00000000..39cc1e37
--- /dev/null
+++ b/contracts/adapters/pieDAO/PieDAOStakingAdapter.sol
@@ -0,0 +1,76 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for PieDAOStakingAdapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+/**
+ * @title Adapter for PieDAO protocol (staking).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract PieDAOStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant DOUGH = 0xad32A8e6220741182940c5aBF610bDE99E737b2D;
+ address internal constant BALANCER_ETH_20_DOUGH_80 = 0xFAE2809935233d4BfE8a56c2355c4A2e7d1fFf1A;
+ address internal constant UNISWAP_DAI_DEFI = 0x7aeFaF3ea1b465dd01561B0548c9FD969e3F76BA;
+ address internal constant BALANCER_DEFI_70_ETH_30 = 0x35333CF3Db8e334384EC6D2ea446DA6e445701dF;
+
+ address internal constant BALANCER_ETH_20_DOUGH_80_POOL = 0x8314337d2b13e1A61EadF0FD1686b2134D43762F;
+ address internal constant UNISWAP_DAI_DEFI_POOL = 0x64964cb69f40A1B56AF76e32Eb5BF2e2E52a747c;
+ address internal constant BALANCER_DEFI_70_ETH_30_POOL = 0x220f25C2105a65425913FE0CF38e7699E3992B97;
+
+ /**
+ * @return Amount of staked LP tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == DOUGH) {
+ uint256 totalBalance = 0;
+
+ totalBalance += StakingRewards(BALANCER_ETH_20_DOUGH_80_POOL).earned(account);
+ totalBalance += StakingRewards(UNISWAP_DAI_DEFI_POOL).earned(account);
+ totalBalance += StakingRewards(BALANCER_DEFI_70_ETH_30_POOL).earned(account);
+
+ return totalBalance;
+ } else if (token == BALANCER_ETH_20_DOUGH_80) {
+ return ERC20(BALANCER_ETH_20_DOUGH_80_POOL).balanceOf(account);
+ } else if (token == UNISWAP_DAI_DEFI) {
+ return ERC20(UNISWAP_DAI_DEFI_POOL).balanceOf(account);
+ } else if (token == BALANCER_DEFI_70_ETH_30) {
+ return ERC20(BALANCER_DEFI_70_ETH_30_POOL).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/poolTogether/PoolTogetherAdapter.sol b/contracts/adapters/poolTogether/PoolTogetherAdapter.sol
index 93827d59..085194f6 100755
--- a/contracts/adapters/poolTogether/PoolTogetherAdapter.sol
+++ b/contracts/adapters/poolTogether/PoolTogetherAdapter.sol
@@ -18,6 +18,17 @@ pragma experimental ABIEncoderV2;
import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+/**
+ * @dev Pod contract interface.
+ * Only the functions required for PoolTogetherAdapter contract are added.
+ * The Pod contract is available here
+ * github.com/pooltogether/pods/blob/master/contracts/Pod.sol.
+ */
+interface Pod {
+ function balanceOfUnderlying(address) external view returns (uint256);
+ function pendingDeposit(address) external view returns (uint256);
+}
+
/**
* @dev BasePool contract interface.
@@ -41,12 +52,28 @@ contract PoolTogetherAdapter is ProtocolAdapter {
string public constant override tokenType = "PoolTogether pool";
+ address internal constant DAI_POOL = 0x29fe7D60DdF151E5b52e5FAB4f1325da6b2bD958;
+ address internal constant USDC_POOL = 0x0034Ea9808E620A0EF79261c51AF20614B742B24;
+ address internal constant DAI_POD = 0x9F4C5D8d9BE360DF36E67F52aE55C1B137B4d0C4;
+ address internal constant USDC_POD = 0x6F5587E191C8b222F634C78111F97c4851663ba4;
+
/**
* @return Amount of tokens locked in the pool by the given account.
* @param token Address of the pool!
* @dev Implementation of ProtocolAdapter interface function.
*/
function getBalance(address token, address account) external view override returns (uint256) {
- return BasePool(token).totalBalanceOf(account);
+ uint256 totalBalance = BasePool(token).totalBalanceOf(account);
+ if (token == DAI_POOL) {
+ totalBalance += getPodBalance(DAI_POD, account);
+ } else if (token == USDC_POOL) {
+ totalBalance += getPodBalance(USDC_POD, account);
+ }
+
+ return totalBalance;
+ }
+
+ function getPodBalance(address pod, address account) internal view returns (uint256) {
+ return Pod(pod).balanceOfUnderlying(account) + Pod(pod).pendingDeposit(account);
}
}
diff --git a/contracts/adapters/poolTogether/PoolTogetherV3AssetAdapter.sol b/contracts/adapters/poolTogether/PoolTogetherV3AssetAdapter.sol
new file mode 100755
index 00000000..312af848
--- /dev/null
+++ b/contracts/adapters/poolTogether/PoolTogetherV3AssetAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for PoolTogether V3 protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract PoolTogetherV3AssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "PoolTogether V3 ticket";
+
+ /**
+ * @return Amount of PoolTogether Tickets by the given account.
+ * @param token Address of the ticket.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/poolTogether/PoolTogetherV3TokenAdapter.sol b/contracts/adapters/poolTogether/PoolTogetherV3TokenAdapter.sol
new file mode 100755
index 00000000..7aea269d
--- /dev/null
+++ b/contracts/adapters/poolTogether/PoolTogetherV3TokenAdapter.sol
@@ -0,0 +1,81 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev ControlledToken contract interface.
+ * Only the functions required for PoolTogetherV3TokenAdapter contract are added.
+ * The ControlledToken contract is available here
+ * github.com/pooltogether/pooltogether-pool-contracts/blob/master/contracts/token/ControlledToken.sol.
+ */
+interface ControlledToken {
+ function controller() external view returns (address);
+}
+
+
+/**
+ * @dev PrizePool contract interface.
+ * Only the functions required for PoolTogetherV3TokenAdapter contract are added.
+ * The PrizePool contract is available here
+ * github.com/pooltogether/pooltogether-pool-contracts/blob/master/contracts/prize-pool/PrizePool.sol.
+ */
+interface PrizePool {
+ function token() external view returns (address);
+}
+
+
+/**
+ * @title Token adapter for PoolTogether V3 tickets.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract PoolTogetherV3TokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ Component[] memory underlyingTokens = new Component[](1);
+
+ underlyingTokens[0] = Component({
+ token: PrizePool(ControlledToken(token).controller()).token(),
+ tokenType: "ERC20",
+ rate: 1e18
+ });
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/reflexer/ReflexerAdapter.sol b/contracts/adapters/reflexer/ReflexerAdapter.sol
new file mode 100755
index 00000000..9870c9ac
--- /dev/null
+++ b/contracts/adapters/reflexer/ReflexerAdapter.sol
@@ -0,0 +1,75 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+
+/**
+ * @title Reflexer adapter abstract contract.
+ * @dev Base contract for Reflexer adapters.
+ * Math function are taken from the SAFEEngine contract available here
+ * github.com/reflexer-labs/geb/blob/master/src/SAFEEngine.sol.
+ * @author Igor Sobolev
+ */
+abstract contract ReflexerAdapter {
+ address internal constant SAFE_ENGINE = 0xCC88a9d330da1133Df3A7bD823B95e52511A6962;
+ address internal constant TAX_COLLECTOR = 0xcDB05aEda142a1B0D6044C09C64e4226c1a281EB;
+ address internal constant MANAGER = 0xEfe0B4cA532769a3AE758fD82E1426a03A94F185;
+
+ address internal constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
+
+ uint256 internal constant RAY = 10 ** 27;
+
+ function rpow(uint256 x, uint256 n, uint256 b) internal pure returns (uint256 z) {
+ //solhint-disable-next-line no-inline-assembly
+ assembly {
+ switch x case 0 {switch n case 0 {z := b} default {z := 0}}
+ default {
+ switch mod(n, 2) case 0 { z := b } default { z := x }
+ let half := div(b, 2) // for rounding.
+ for { n := div(n, 2) } n { n := div(n,2) } {
+ let xx := mul(x, x)
+ if iszero(eq(div(xx, x), x)) { revert(0,0) }
+ let xxRound := add(xx, half)
+ if lt(xxRound, xx) { revert(0,0) }
+ x := div(xxRound, b)
+ if mod(n,2) {
+ let zx := mul(z, x)
+ if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) }
+ let zxRound := add(zx, half)
+ if lt(zxRound, zx) { revert(0,0) }
+ z := div(zxRound, b)
+ }
+ }
+ }
+ }
+ }
+
+ function rmultiply(uint256 x, uint256 y) internal pure returns (uint256 z) {
+ z = x * y;
+ require(y == 0 || z / y == x, "ReflexerAdapter/rmul-overflow");
+ z = z / RAY;
+ }
+
+ function multiply(uint256 x, uint256 y) internal pure returns (uint256 z) {
+ require(y == 0 || (z = x * y) / y == x, "ReflexerAdapter/multiply-uint-uint-overflow");
+ }
+
+ function addition(uint256 x, uint256 y) internal pure returns (uint256 z) {
+ z = x + y;
+ require(z >= x, "ReflexerAdapter/add-uint-uint-overflow");
+ }
+}
diff --git a/contracts/adapters/reflexer/ReflexerAssetAdapter.sol b/contracts/adapters/reflexer/ReflexerAssetAdapter.sol
new file mode 100755
index 00000000..dc095cd6
--- /dev/null
+++ b/contracts/adapters/reflexer/ReflexerAssetAdapter.sol
@@ -0,0 +1,91 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+import { ReflexerAdapter } from "./ReflexerAdapter.sol";
+
+
+/**
+ * @dev SAFEEngine contract interface.
+ * Only the functions required for ReflexerAssetAdapter contract are added.
+ * The SAFEEngine contract is available here
+ * github.com/reflexer-labs/geb/blob/master/src/SAFEEngine.sol.
+ */
+interface SAFEEngine {
+ function safes(bytes32, address) external view returns (uint256, uint256);
+ function collateralTypes(bytes32) external view returns (uint256, uint256);
+}
+
+
+/**
+ * @dev GebSafeManager contract interface.
+ * Only the functions required for ReflexerAssetAdapter contract are added.
+ * The GebSafeManager contract is available here
+ * github.com/reflexer-labs/geb-safe-manager/blob/master/src/GebSafeManager.sol.
+ */
+interface GebSafeManager {
+ function firstSAFEID(address) external view returns (uint256);
+ function safeList(uint256) external view returns (uint256, uint256);
+ function safes(uint256) external view returns (address);
+ function collateralTypes(uint256) external view returns (bytes32);
+}
+
+
+/**
+ * @title Asset adapter for Reflexer protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract ReflexerAssetAdapter is ProtocolAdapter, ReflexerAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ /**
+ * @return Amount of collateral locked on the protocol by the given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ GebSafeManager manager = GebSafeManager(MANAGER);
+ SAFEEngine safeEngine = SAFEEngine(SAFE_ENGINE);
+ uint256 id = manager.firstSAFEID(account);
+ address safe;
+ bytes32 collateralType;
+ uint256 lockedCollateral;
+ uint256 value;
+ uint256 totalValue = 0;
+
+ while (id > 0) {
+ safe = manager.safes(id);
+ collateralType = manager.collateralTypes(id);
+ (, id) = manager.safeList(id);
+ (lockedCollateral, ) = safeEngine.safes(collateralType, safe);
+
+ if (token == WETH && collateralType == "ETH-A") {
+ value = lockedCollateral;
+ } else {
+ value = 0;
+ }
+
+ totalValue = totalValue + value;
+ }
+
+ return totalValue;
+ }
+}
diff --git a/contracts/adapters/reflexer/ReflexerDebtAdapter.sol b/contracts/adapters/reflexer/ReflexerDebtAdapter.sol
new file mode 100755
index 00000000..96e0418f
--- /dev/null
+++ b/contracts/adapters/reflexer/ReflexerDebtAdapter.sol
@@ -0,0 +1,109 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+import { ReflexerAdapter } from "./ReflexerAdapter.sol";
+
+
+/**
+ * @dev SAFEEngine contract interface.
+ * Only the functions required for ReflexerDebtAdapter contract are added.
+ * The SAFEEngine contract is available here
+ * github.com/reflexer-labs/geb/blob/master/src/SAFEEngine.sol.
+ */
+interface SAFEEngine {
+ function safes(bytes32, address) external view returns (uint256, uint256);
+ function collateralTypes(bytes32) external view returns (uint256, uint256);
+}
+
+
+/**
+ * @dev TaxCollector contract interface.
+ * Only the functions required for ReflexerDebtAdapter contract are added.
+ * The TaxCollector contract is available here
+ * github.com/makerdao/dss/blob/master/src/taxCollector.sol.
+ */
+interface TaxCollector {
+ function collateralTypes(bytes32) external view returns (uint256, uint256);
+ function globalStabilityFee() external view returns (uint256);
+}
+
+
+/**
+ * @dev GebSafeManager contract interface.
+ * Only the functions required for ReflexerDebtAdapter contract are added.
+ * The GebSafeManager contract is available here
+ * github.com/reflexer-labs/geb-safe-manager/blob/master/src/GebSafeManager.sol.
+ */
+interface GebSafeManager {
+ function firstSAFEID(address) external view returns (uint256);
+ function safeList(uint256) external view returns (uint256, uint256);
+ function safes(uint256) external view returns (address);
+ function collateralTypes(uint256) external view returns (bytes32);
+}
+
+
+/**
+ * @title Debt adapter for Reflexer protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract ReflexerDebtAdapter is ProtocolAdapter, ReflexerAdapter {
+
+ string public constant override adapterType = "Debt";
+
+ string public constant override tokenType = "ERC20";
+
+ /**
+ * @return Amount of debt of the given account for the protocol.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address, address account) external view override returns (uint256) {
+ GebSafeManager manager = GebSafeManager(MANAGER);
+ SAFEEngine safeEngine = SAFEEngine(SAFE_ENGINE);
+ TaxCollector taxCollector = TaxCollector(TAX_COLLECTOR);
+ uint256 id = manager.firstSAFEID(account);
+ bytes32 collateralType;
+ uint256 generatedDebt;
+ uint256 accumulatedRate;
+ uint256 debtAmount;
+ uint256 updateTime;
+ uint256 totalValue = 0;
+
+ while (id > 0) {
+ collateralType = manager.collateralTypes(id);
+ (, generatedDebt) = safeEngine.safes(collateralType, manager.safes(id));
+ (, id) = manager.safeList(id);
+ (, accumulatedRate) = safeEngine.collateralTypes(collateralType);
+ (debtAmount, updateTime) = taxCollector.collateralTypes(collateralType);
+ uint256 currentRate = rmultiply(
+ rpow(
+ addition(taxCollector.globalStabilityFee(), debtAmount),
+ // solhint-disable-next-line not-rely-on-time
+ now - updateTime,
+ RAY
+ ),
+ accumulatedRate
+ );
+
+ totalValue = totalValue + rmultiply(generatedDebt, currentRate);
+ }
+
+ return totalValue;
+ }
+}
diff --git a/contracts/adapters/sashimi/SashimiStakingAdapter.sol b/contracts/adapters/sashimi/SashimiStakingAdapter.sol
new file mode 100644
index 00000000..e6c4ea62
--- /dev/null
+++ b/contracts/adapters/sashimi/SashimiStakingAdapter.sol
@@ -0,0 +1,96 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev UserInfo struct from MasterChef contract.
+ */
+struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+}
+
+
+/**
+ * @dev PoolInfo struct from MasterChef contract.
+ */
+struct PoolInfo {
+ address lpToken;
+ uint256 allocPoint;
+ uint256 lastRewardBlock;
+ uint256 accSushiPerShare;
+}
+
+
+/**
+ * @dev MasterChef contract interface.
+ * Only the functions required for SashimiStakingAdapter contract are added.
+ */
+interface MasterChef {
+ function poolLength() external view returns (uint256);
+ function poolInfo(uint256) external view returns (PoolInfo memory);
+ function userInfo(uint256, address) external view returns (UserInfo memory);
+ function pendingSashimi(uint256, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for SashimiSwap protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract SashimiStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant SASHIMI = 0xC28E27870558cF22ADD83540d2126da2e4b464c2;
+ address internal constant MASTER_CHEF = 0x1DaeD74ed1dD7C9Dabbe51361ac90A69d851234D;
+
+ /**
+ * @return Amount of SASHIMI rewards / staked tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ uint256 length = MasterChef(MASTER_CHEF).poolLength();
+
+ if (token == SASHIMI) {
+ uint256 totalRewards = 0;
+
+ for(uint256 i = 0; i < length; i++) {
+ totalRewards += MasterChef(MASTER_CHEF).pendingSashimi(i, account);
+ }
+
+ return totalRewards;
+ } else {
+ for(uint256 i = 0; i < length; i++) {
+ UserInfo memory user = MasterChef(MASTER_CHEF).userInfo(i, account);
+ PoolInfo memory pool = MasterChef(MASTER_CHEF).poolInfo(i);
+
+ if (pool.lpToken == token) {
+ return user.amount;
+ }
+ }
+
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/snowswap/SnowSwapAdapter.sol b/contracts/adapters/snowswap/SnowSwapAdapter.sol
new file mode 100755
index 00000000..360b2504
--- /dev/null
+++ b/contracts/adapters/snowswap/SnowSwapAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {ProtocolAdapter} from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for SnowSwap protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract SnowSwapAdapter is ProtocolAdapter {
+
+string public constant override adapterType = "Asset";
+
+string public constant override tokenType = "SnowSwap pool token";
+
+/**
+ * @return Amount of SnowSwap pool tokens held by the given account.
+ * @param token Address of the pool token!
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+function getBalance(address token, address account) external view override returns (uint256) {
+return ERC20(token).balanceOf(account);
+}
+}
diff --git a/contracts/adapters/snowswap/SnowSwapTokenAdapter.sol b/contracts/adapters/snowswap/SnowSwapTokenAdapter.sol
new file mode 100755
index 00000000..787b60b1
--- /dev/null
+++ b/contracts/adapters/snowswap/SnowSwapTokenAdapter.sol
@@ -0,0 +1,99 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import {ERC20} from "../../ERC20.sol";
+import {TokenMetadata, Component} from "../../Structs.sol";
+import {TokenAdapter} from "../TokenAdapter.sol";
+
+/**
+ * @dev CurveRegistry contract interface.
+ * Only the functions required for CurveTokenAdapter contract are added.
+ * The CurveRegistry contract is available here
+ * github.com/zeriontech/defi-sdk/blob/master/contracts/adapters/curve/CurveRegistry.sol.
+ */
+interface CurveRegistry {
+ function getSwapAndTotalCoins(address) external view returns (address, uint256);
+
+ function getName(address) external view returns (string memory);
+}
+
+
+/**
+ * @dev stableswap contract interface.
+ * Only the functions required for CurveTokenAdapter contract are added.
+ * The stableswap contract is available here
+ * github.com/curvefi/curve-contract/blob/compounded/vyper/stableswap.vy.
+ */
+// solhint-disable-next-line contract-name-camelcase
+interface stableswap {
+ function coins(int128) external view returns (address);
+
+ function balances(int128) external view returns (uint256);
+
+ function balances(uint256) external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for SnowSwap pool tokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract SnowSwapTokenAdapter is TokenAdapter {
+
+ address internal constant REGISTRY = 0x86A1755BA805ecc8B0608d56c22716bd1d4B68A8;
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token : token,
+ name : getPoolName(token),
+ symbol : ERC20(token).symbol(),
+ decimals : ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ (address swap, uint256 totalCoins) = CurveRegistry(REGISTRY).getSwapAndTotalCoins(token);
+ Component[] memory underlyingComponents = new Component[](totalCoins);
+
+ for (uint256 i = 0; i < totalCoins; i++) {
+ underlyingComponents[i] = Component({
+ token : stableswap(swap).coins(int128(i)),
+ tokenType : "ERC20",
+ rate : stableswap(swap).balances(int128(i)) * 1e18 / ERC20(token).totalSupply()
+ });
+ }
+
+ return underlyingComponents;
+ }
+
+ /**
+ * @return Pool name.
+ */
+ function getPoolName(address token) internal view returns (string memory) {
+ return CurveRegistry(REGISTRY).getName(token);
+ }
+}
diff --git a/contracts/adapters/sushi/SushiStakingAdapter.sol b/contracts/adapters/sushi/SushiStakingAdapter.sol
new file mode 100644
index 00000000..86db817c
--- /dev/null
+++ b/contracts/adapters/sushi/SushiStakingAdapter.sol
@@ -0,0 +1,102 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev UserInfo struct from MasterChef contract.
+ * The MasterChef contract is available here
+ * github.com/sushiswap/sushiswap/blob/master/contracts/MasterChef.sol.
+ */
+struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+}
+
+
+/**
+ * @dev PoolInfo struct from MasterChef contract.
+ * The MasterChef contract is available here
+ * github.com/sushiswap/sushiswap/blob/master/contracts/MasterChef.sol.
+ */
+struct PoolInfo {
+ address lpToken;
+ uint256 allocPoint;
+ uint256 lastRewardBlock;
+ uint256 accSushiPerShare;
+}
+
+
+/**
+ * @dev MasterChef contract interface.
+ * Only the functions required for SushiStakingAdapter contract are added.
+ * The MasterChef contract is available here
+ * github.com/sushiswap/sushiswap/blob/master/contracts/MasterChef.sol.
+ */
+interface MasterChef {
+ function poolLength() external view returns (uint256);
+ function poolInfo(uint256) external view returns (PoolInfo memory);
+ function userInfo(uint256, address) external view returns (UserInfo memory);
+ function pendingSushi(uint256, address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for SushiSwap protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract SushiStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant SUSHI = 0x6B3595068778DD592e39A122f4f5a5cF09C90fE2;
+ address internal constant MASTER_CHEF = 0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd;
+
+ /**
+ * @return Amount of SUSHI rewards / staked tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ uint256 length = MasterChef(MASTER_CHEF).poolLength();
+
+ if (token == SUSHI) {
+ uint256 totalRewards = 0;
+
+ for(uint256 i = 0; i < length; i++) {
+ totalRewards += MasterChef(MASTER_CHEF).pendingSushi(i, account);
+ }
+
+ return totalRewards;
+ } else {
+ for(uint256 i = 0; i < length; i++) {
+ UserInfo memory user = MasterChef(MASTER_CHEF).userInfo(i, account);
+ PoolInfo memory pool = MasterChef(MASTER_CHEF).poolInfo(i);
+
+ if (pool.lpToken == token) {
+ return user.amount;
+ }
+ }
+
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/swerve/SwerveAdapter.sol b/contracts/adapters/swerve/SwerveAdapter.sol
new file mode 100755
index 00000000..d69db85b
--- /dev/null
+++ b/contracts/adapters/swerve/SwerveAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Swerve protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract SwerveAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "Swerve pool token";
+
+ /**
+ * @return Amount of Swerve pool tokens held by the given account.
+ * @param token Address of the pool token!
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/swerve/SwerveRegistry.sol b/contracts/adapters/swerve/SwerveRegistry.sol
new file mode 100644
index 00000000..1415866d
--- /dev/null
+++ b/contracts/adapters/swerve/SwerveRegistry.sol
@@ -0,0 +1,72 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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 .
+//
+// SPDX-License-Identifier: LGPL-3.0-only
+
+pragma solidity 0.6.5;
+
+import { Ownable } from "../../Ownable.sol";
+
+
+struct PoolInfo {
+ address swap; // stableswap contract address.
+ uint256 totalCoins; // Number of coins used in stableswap contract.
+ string name; // Pool name ("... Pool").
+}
+
+
+/**
+ * @title Registry for Swerve contracts.
+ * @dev Implements two getters - getSwapAndTotalCoins(address) and getName(address).
+ * @notice Call getSwapAndTotalCoins(token) and getName(address) function and get address,
+ * coins number, and name of stableswap contract for the given token address.
+ * @author Igor Sobolev
+ */
+contract SwerveRegistry is Ownable {
+
+ mapping (address => PoolInfo) internal poolInfo;
+
+ constructor() public {
+ poolInfo[0x77C6E4a580c0dCE4E5c7a17d0bc077188a83A059] = PoolInfo({
+ swap: 0x329239599afB305DA0A2eC69c58F8a6697F9F88d,
+ totalCoins: 4,
+ name: "swUSD Pool"
+ });
+ }
+
+ function setPoolInfo(
+ address token,
+ address swap,
+ uint256 totalCoins,
+ string calldata name
+ )
+ external
+ onlyOwner
+ {
+ poolInfo[token] = PoolInfo({
+ swap: swap,
+ totalCoins: totalCoins,
+ name: name
+ });
+ }
+
+ function getSwapAndTotalCoins(address token) external view returns (address, uint256) {
+ return (poolInfo[token].swap, poolInfo[token].totalCoins);
+ }
+
+ function getName(address token) external view returns (string memory) {
+ return poolInfo[token].name;
+ }
+}
diff --git a/contracts/adapters/swerve/SwerveStakingAdapter.sol b/contracts/adapters/swerve/SwerveStakingAdapter.sol
new file mode 100644
index 00000000..508703f1
--- /dev/null
+++ b/contracts/adapters/swerve/SwerveStakingAdapter.sol
@@ -0,0 +1,49 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Swerve protocol (staking).
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract SwerveStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant SWUSD = 0x77C6E4a580c0dCE4E5c7a17d0bc077188a83A059;
+
+ address internal constant SWUSD_GAUGE = 0xb4d0C929cD3A1FbDc6d57E7D3315cF0C4d6B4bFa;
+
+ /**
+ * @return Amount of staked Swerve Pool tokens for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == SWUSD) {
+ return ERC20(SWUSD_GAUGE).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/swerve/SwerveTokenAdapter.sol b/contracts/adapters/swerve/SwerveTokenAdapter.sol
new file mode 100755
index 00000000..0919b692
--- /dev/null
+++ b/contracts/adapters/swerve/SwerveTokenAdapter.sol
@@ -0,0 +1,97 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+/**
+ * @dev CurveRegistry contract interface.
+ * Only the functions required for CurveTokenAdapter contract are added.
+ * The CurveRegistry contract is available here
+ * github.com/zeriontech/defi-sdk/blob/master/contracts/adapters/curve/CurveRegistry.sol.
+ */
+interface CurveRegistry {
+ function getSwapAndTotalCoins(address) external view returns (address, uint256);
+ function getName(address) external view returns (string memory);
+}
+
+
+/**
+ * @dev stableswap contract interface.
+ * Only the functions required for CurveTokenAdapter contract are added.
+ * The stableswap contract is available here
+ * github.com/curvefi/curve-contract/blob/compounded/vyper/stableswap.vy.
+ */
+// solhint-disable-next-line contract-name-camelcase
+interface stableswap {
+ function coins(int128) external view returns (address);
+ function balances(int128) external view returns (uint256);
+}
+
+
+/**
+ * @title Token adapter for Swerve pool tokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract SwerveTokenAdapter is TokenAdapter {
+
+ address internal constant REGISTRY = 0x2f9505a841a1e3b4fBFbb6693c8C3b26C5F1254D;
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: getPoolName(token),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ (address swap, uint256 totalCoins) = CurveRegistry(REGISTRY).getSwapAndTotalCoins(token);
+ Component[] memory underlyingComponents= new Component[](totalCoins);
+
+ address underlyingToken;
+ for (uint256 i = 0; i < totalCoins; i++) {
+ underlyingToken = stableswap(swap).coins(int128(i));
+ underlyingComponents[i] = Component({
+ token: underlyingToken,
+ tokenType: "ERC20",
+ rate: stableswap(swap).balances(int128(i)) * 1e18 / ERC20(token).totalSupply()
+ });
+ }
+
+ return underlyingComponents;
+ }
+
+ /**
+ * @return Pool name.
+ */
+ function getPoolName(address token) internal view returns (string memory) {
+ return CurveRegistry(REGISTRY).getName(token);
+ }
+}
diff --git a/contracts/adapters/synthetix/SynthetixAssetAdapter.sol b/contracts/adapters/synthetix/SynthetixAssetAdapter.sol
index c04cfd24..4922dafa 100755
--- a/contracts/adapters/synthetix/SynthetixAssetAdapter.sol
+++ b/contracts/adapters/synthetix/SynthetixAssetAdapter.sol
@@ -16,9 +16,21 @@
pragma solidity 0.6.5;
pragma experimental ABIEncoderV2;
+import { ERC20 } from "../../ERC20.sol";
import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for SynthetixAssetAdapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
/**
* @dev Proxy contract interface.
* Only the functions required for SynthetixAssetAdapter contract are added.
@@ -52,13 +64,50 @@ contract SynthetixAssetAdapter is ProtocolAdapter {
string public constant override tokenType = "ERC20";
+ address internal constant SNX = 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F;
+ address internal constant CURVE_SUSD = 0xC25a3A3b969415c80451098fa907EC722572917F;
+ address internal constant CURVE_SBTC = 0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3;
+ address internal constant IETH = 0xA9859874e1743A32409f75bB11549892138BBA1E;
+ address internal constant UNISWAP_SETH = 0xe9Cf7887b93150D4F2Da7dFc6D502B216438F244;
+ address internal constant UNISWAP_SXAU = 0x34a0216C5057bC18e5d34D4405284564eFd759b2;
+ address internal constant BALANCER_SNX_USDC = 0x815F8eF4863451f4Faf34FBc860034812E7377d9;
+ address internal constant BALANCER_SNX_REN = 0x330416C863f2acCE7aF9C9314B422d24c672534a;
+ address internal constant LP_REWARD_SUSD = 0xDCB6A51eA3CA5d3Fd898Fd6564757c7aAeC3ca92;
+ address internal constant LP_REWARD_IETH = 0xC746bc860781DC90BBFCD381d6A058Dc16357F8d;
+ address internal constant LP_REWARD_SETH = 0x48D7f315feDcaD332F68aafa017c7C158BC54760;
+ address internal constant LP_REWARD_SXAU = 0x8302FE9F0C509a996573D3Cc5B0D5D51e4FDD5eC;
+ address internal constant LP_REWARD_SBTC = 0x13C1542A468319688B89E323fe9A3Be3A90EBb27;
+ address internal constant LP_REWARD_BALANCER = 0xFBaEdde70732540cE2B11A8AC58Eb2dC0D69dE10;
+
/**
* @return Amount of SNX locked on the protocol by the given account.
* @dev Implementation of ProtocolAdapter interface function.
*/
function getBalance(address token, address account) external view override returns (uint256) {
- Synthetix synthetix = Synthetix(Proxy(token).target());
-
- return synthetix.collateral(account);
+ if (token == SNX) {
+ uint256 balance = Synthetix(Proxy(SNX).target()).collateral(account);
+ balance += StakingRewards(LP_REWARD_SUSD).earned(account);
+ balance += StakingRewards(LP_REWARD_IETH).earned(account);
+ balance += StakingRewards(LP_REWARD_SETH).earned(account);
+ balance += StakingRewards(LP_REWARD_SXAU).earned(account);
+ balance += StakingRewards(LP_REWARD_BALANCER).earned(account);
+ return balance;
+ } else if (token == BALANCER_SNX_REN) {
+ return StakingRewards(LP_REWARD_SBTC).earned(account);
+ } else if (token == CURVE_SUSD) {
+ return ERC20(LP_REWARD_SUSD).balanceOf(account);
+ } else if (token == CURVE_SBTC) {
+ return ERC20(LP_REWARD_SBTC).balanceOf(account);
+ } else if (token == IETH) {
+ return ERC20(LP_REWARD_IETH).balanceOf(account);
+ } else if (token == UNISWAP_SETH) {
+ return ERC20(LP_REWARD_SETH).balanceOf(account);
+ } else if (token == UNISWAP_SXAU) {
+ return ERC20(LP_REWARD_SXAU).balanceOf(account);
+ } else if (token == BALANCER_SNX_USDC) {
+ return ERC20(LP_REWARD_BALANCER).balanceOf(account);
+ } else {
+ return 0;
+ }
}
}
diff --git a/contracts/adapters/tokenSets/TokenSetsV2Adapter.sol b/contracts/adapters/tokenSets/TokenSetsV2Adapter.sol
new file mode 100755
index 00000000..cdacf153
--- /dev/null
+++ b/contracts/adapters/tokenSets/TokenSetsV2Adapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for TokenSets.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract TokenSetsV2Adapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "SetToken V2";
+
+ /**
+ * @return Amount of SetTokens held by the given account.
+ * @param token Address of the SetToken contract.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/tokenSets/TokenSetsV2TokenAdapter.sol b/contracts/adapters/tokenSets/TokenSetsV2TokenAdapter.sol
new file mode 100755
index 00000000..171a55e3
--- /dev/null
+++ b/contracts/adapters/tokenSets/TokenSetsV2TokenAdapter.sol
@@ -0,0 +1,73 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev SetTokenV2 contract interface.
+ * Only the functions required for TokenSetsTokenAdapter contract are added.
+ */
+interface SetTokenV2 {
+ function getTotalComponentRealUnits(address) external view returns (int256);
+ function getComponents() external view returns(address[] memory);
+}
+
+
+/**
+ * @title Token adapter for TokenSets.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract TokenSetsV2TokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address[] memory components = SetTokenV2(token).getComponents();
+
+ Component[] memory underlyingTokens = new Component[](components.length);
+
+ for (uint256 i = 0; i < underlyingTokens.length; i++) {
+ underlyingTokens[i] = Component({
+ token: components[i],
+ tokenType: "ERC20",
+ rate: uint256(SetTokenV2(token).getTotalComponentRealUnits(components[i]))
+ });
+ }
+
+ return underlyingTokens;
+ }
+}
diff --git a/contracts/adapters/tube/MustStakingAdapter.sol b/contracts/adapters/tube/MustStakingAdapter.sol
new file mode 100644
index 00000000..8d958e25
--- /dev/null
+++ b/contracts/adapters/tube/MustStakingAdapter.sol
@@ -0,0 +1,62 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev Tube contract interface.
+ * Only the functions required for MustStakingAdapter contract are added.
+ * The Tube contract is available here
+ * etherscan.io/address/0x048Dda990f581e80EFfc72E4e1996AE548f8d64C#code
+ *
+ */
+interface StakingRewards {
+ function balanceOf(address account) external view returns (uint256);
+ function earned(address account) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Tube protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ */
+contract MustStakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant MUST = 0x9C78EE466D6Cb57A4d01Fd887D2b5dFb2D46288f;
+ address internal constant UNI_V2_WETH_POOL = 0x15861b072abAd08b24460Add30b09E1481290F94;
+ address internal constant STAKING_REWARD = 0x048Dda990f581e80EFfc72E4e1996AE548f8d64C;
+
+ /**
+ * @return Amount of TUBE for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == MUST) {
+ return StakingRewards(STAKING_REWARD).earned(account);
+ } else if (token == UNI_V2_WETH_POOL) {
+ return StakingRewards(STAKING_REWARD).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/tube/TubeProtocolAdapter.sol b/contracts/adapters/tube/TubeProtocolAdapter.sol
new file mode 100644
index 00000000..68b23f84
--- /dev/null
+++ b/contracts/adapters/tube/TubeProtocolAdapter.sol
@@ -0,0 +1,58 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev Tube contract interface.
+ * Only the functions required for TubeProtocolAdapter contract are added.
+ * The Tube contract is available here
+ * etherscan.io/address/0x85BC2E8Aaad5dBc347db49Ea45D95486279eD918#code
+ *
+ */
+interface Tube {
+ function mustOf(address holder) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Tube protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ */
+contract TubeProtocolAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant MUST = 0x9C78EE466D6Cb57A4d01Fd887D2b5dFb2D46288f;
+ address internal constant TUBE = 0x85BC2E8Aaad5dBc347db49Ea45D95486279eD918;
+
+ /**
+ * @return Amount of TUBE for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == MUST) {
+ return Tube(TUBE).mustOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/uniswap/UniswapV1TokenAdapter.sol b/contracts/adapters/uniswap/UniswapV1TokenAdapter.sol
index 5cc04b92..dc3b2b33 100755
--- a/contracts/adapters/uniswap/UniswapV1TokenAdapter.sol
+++ b/contracts/adapters/uniswap/UniswapV1TokenAdapter.sol
@@ -88,7 +88,6 @@ contract UniswapV1TokenAdapter is TokenAdapter {
function getComponents(address token) external view override returns (Component[] memory) {
address underlyingToken = Factory(FACTORY).getToken(token);
uint256 totalSupply = ERC20(token).totalSupply();
- string memory underlyingTokenType;
Component[] memory underlyingTokens = new Component[](2);
underlyingTokens[0] = Component({
@@ -97,15 +96,9 @@ contract UniswapV1TokenAdapter is TokenAdapter {
rate: token.balance * 1e18 / totalSupply
});
- try CToken(underlyingToken).isCToken{gas: 2000}() returns (bool) {
- underlyingTokenType = "CToken";
- } catch {
- underlyingTokenType = "ERC20";
- }
-
underlyingTokens[1] = Component({
token: underlyingToken,
- tokenType: underlyingTokenType,
+ tokenType: getTokenType(underlyingToken),
rate: ERC20(underlyingToken).balanceOf(token) * 1e18 / totalSupply
});
@@ -134,6 +127,22 @@ contract UniswapV1TokenAdapter is TokenAdapter {
}
}
+ function getTokenType(address token) internal view returns (string memory) {
+ (bool success, bytes memory returnData) = token.staticcall{gas: 2000}(
+ abi.encodeWithSelector(CToken(token).isCToken.selector)
+ );
+
+ if (success) {
+ if (returnData.length == 32) {
+ return abi.decode(returnData, (bool)) ? "CToken" : "ERC20";
+ } else {
+ return "ERC20";
+ }
+ } else {
+ return "ERC20";
+ }
+ }
+
/**
* @dev Internal function to convert bytes32 to string and trim zeroes.
*/
diff --git a/contracts/adapters/uniswap/UniswapV2Adapter.sol b/contracts/adapters/uniswap/UniswapV2Adapter.sol
new file mode 100755
index 00000000..45bb34f4
--- /dev/null
+++ b/contracts/adapters/uniswap/UniswapV2Adapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Uniswap V2 protocol.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract UniswapV2Adapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "Uniswap V2 pool token";
+
+ /**
+ * @return Amount of Uniswap pool tokens held by the given account.
+ * @param token Address of the Uniswap pool.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/uniswap/UniswapV2StakingAdapter.sol b/contracts/adapters/uniswap/UniswapV2StakingAdapter.sol
new file mode 100644
index 00000000..94d3ed0c
--- /dev/null
+++ b/contracts/adapters/uniswap/UniswapV2StakingAdapter.sol
@@ -0,0 +1,83 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @dev StakingRewards contract interface.
+ * Only the functions required for UniswapV2StakingAdapter contract are added.
+ * The StakingRewards contract is available here
+ * github.com/Synthetixio/synthetix/blob/master/contracts/StakingRewards.sol.
+ */
+interface StakingRewards {
+ function earned(address) external view returns (uint256);
+}
+
+
+/**
+ * @title Adapter for Uniswap V2 staking.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract UniswapV2StakingAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "ERC20";
+
+ address internal constant UNI = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984;
+
+ address internal constant UNI_V2_WBTC_WETH = 0xBb2b8038a1640196FbE3e38816F3e67Cba72D940;
+ address internal constant UNI_V2_WETH_USDT = 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852;
+ address internal constant UNI_V2_USDC_WETH = 0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc;
+ address internal constant UNI_V2_DAI_WETH = 0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11;
+
+ address internal constant UNI_V2_WBTC_WETH_POOL = 0xCA35e32e7926b96A9988f61d510E038108d8068e;
+ address internal constant UNI_V2_WETH_USDT_POOL = 0x6C3e4cb2E96B01F4b866965A91ed4437839A121a;
+ address internal constant UNI_V2_USDC_WETH_POOL = 0x7FBa4B8Dc5E7616e59622806932DBea72537A56b;
+ address internal constant UNI_V2_DAI_WETH_POOL = 0xa1484C3aa22a66C62b77E0AE78E15258bd0cB711;
+
+ /**
+ * @return Amount of staked tokens / rewards earned after staking for a given account.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ if (token == UNI) {
+ uint256 totalRewards = 0;
+
+ totalRewards += StakingRewards(UNI_V2_WBTC_WETH_POOL).earned(account);
+ totalRewards += StakingRewards(UNI_V2_WETH_USDT_POOL).earned(account);
+ totalRewards += StakingRewards(UNI_V2_USDC_WETH_POOL).earned(account);
+ totalRewards += StakingRewards(UNI_V2_DAI_WETH_POOL).earned(account);
+
+ return totalRewards;
+ } else if (token == UNI_V2_WBTC_WETH) {
+ return ERC20(UNI_V2_WBTC_WETH_POOL).balanceOf(account);
+ } else if (token == UNI_V2_WETH_USDT) {
+ return ERC20(UNI_V2_WETH_USDT_POOL).balanceOf(account);
+ } else if (token == UNI_V2_USDC_WETH) {
+ return ERC20(UNI_V2_USDC_WETH_POOL).balanceOf(account);
+ } else if (token == UNI_V2_DAI_WETH) {
+ return ERC20(UNI_V2_DAI_WETH_POOL).balanceOf(account);
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/contracts/adapters/uniswap/UniswapV2TokenAdapter.sol b/contracts/adapters/uniswap/UniswapV2TokenAdapter.sol
new file mode 100755
index 00000000..78ddf484
--- /dev/null
+++ b/contracts/adapters/uniswap/UniswapV2TokenAdapter.sol
@@ -0,0 +1,154 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+
+/**
+ * @dev CToken contract interface.
+ * Only the functions required for UniswapV2TokenAdapter contract are added.
+ * The CToken contract is available here
+ * github.com/compound-finance/compound-protocol/blob/master/contracts/CToken.sol.
+ */
+interface CToken {
+ function isCToken() external view returns (bool);
+}
+
+
+/**
+ * @dev UniswapV2Pair contract interface.
+ * Only the functions required for UniswapV2TokenAdapter contract are added.
+ * The UniswapV2Pair contract is available here
+ * github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Pair.sol.
+ */
+interface UniswapV2Pair {
+ function token0() external view returns (address);
+ function token1() external view returns (address);
+ function getReserves() external view returns (uint256, uint256);
+}
+
+
+/**
+ * @title Token adapter for Uniswap V2 pool tokens.
+ * @dev Implementation of TokenAdapter interface.
+ * @author Igor Sobolev
+ */
+contract UniswapV2TokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token : token,
+ name : getPoolName(token),
+ symbol : ERC20(token).symbol(),
+ decimals : ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ address token0 = UniswapV2Pair(token).token0();
+ address token1 = UniswapV2Pair(token).token1();
+ uint256 totalSupply = ERC20(token).totalSupply();
+ (uint256 reserve0, uint256 reserve1) = UniswapV2Pair(token).getReserves();
+
+ Component[] memory underlyingTokens = new Component[](2);
+
+ underlyingTokens[0] = Component({
+ token: token0,
+ tokenType: getTokenType(token0),
+ rate: totalSupply == 0 ? 0 : reserve0 * 1e18 / totalSupply
+ });
+ underlyingTokens[1] = Component({
+ token: token1,
+ tokenType: getTokenType(token1),
+ rate: totalSupply == 0 ? 0 : reserve1 * 1e18 / totalSupply
+ });
+
+ return underlyingTokens;
+ }
+
+ function getPoolName(address token) internal view returns (string memory) {
+ return string(
+ abi.encodePacked(
+ getSymbol(UniswapV2Pair(token).token0()),
+ "/",
+ getSymbol(UniswapV2Pair(token).token1()),
+ " Pool"
+ )
+ );
+ }
+
+ function getSymbol(address token) internal view returns (string memory) {
+ (, bytes memory returnData) = token.staticcall(
+ abi.encodeWithSelector(ERC20(token).symbol.selector)
+ );
+
+ if (returnData.length == 32) {
+ return convertToString(abi.decode(returnData, (bytes32)));
+ } else {
+ return abi.decode(returnData, (string));
+ }
+ }
+
+ function getTokenType(address token) internal view returns (string memory) {
+ (bool success, bytes memory returnData) = token.staticcall{gas: 2000}(
+ abi.encodeWithSelector(CToken(token).isCToken.selector)
+ );
+
+ if (success) {
+ if (returnData.length == 32) {
+ return abi.decode(returnData, (bool)) ? "CToken" : "ERC20";
+ } else {
+ return "ERC20";
+ }
+ } else {
+ return "ERC20";
+ }
+ }
+
+ /**
+ * @dev Internal function to convert bytes32 to string and trim zeroes.
+ */
+ function convertToString(bytes32 data) internal pure returns (string memory) {
+ uint256 length = 0;
+ bytes memory result;
+
+ for (uint256 i = 0; i < 32; i++) {
+ if (data[i] != byte(0)) {
+ length++;
+ }
+ }
+
+ result = new bytes(length);
+
+ for (uint256 i = 0; i < length; i++) {
+ result[i] = data[i];
+ }
+
+ return string(result);
+ }
+}
diff --git a/contracts/adapters/yearn/YearnVaultAssetAdapter.sol b/contracts/adapters/yearn/YearnVaultAssetAdapter.sol
new file mode 100755
index 00000000..8b45cfeb
--- /dev/null
+++ b/contracts/adapters/yearn/YearnVaultAssetAdapter.sol
@@ -0,0 +1,42 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { ProtocolAdapter } from "../ProtocolAdapter.sol";
+
+
+/**
+ * @title Adapter for Yearn Token Vaults.
+ * @dev Implementation of ProtocolAdapter interface.
+ * @author Igor Sobolev
+ */
+contract YearnVaultAssetAdapter is ProtocolAdapter {
+
+ string public constant override adapterType = "Asset";
+
+ string public constant override tokenType = "Yearn Token Vault v0.3.0";
+
+ /**
+ * @return Amount of Yearn Vault by the given account.
+ * @param token Address of the vault.
+ * @dev Implementation of ProtocolAdapter interface function.
+ */
+ function getBalance(address token, address account) external view override returns (uint256) {
+ return ERC20(token).balanceOf(account);
+ }
+}
diff --git a/contracts/adapters/yearn/YearnVaultTokenAdapter.sol b/contracts/adapters/yearn/YearnVaultTokenAdapter.sol
new file mode 100755
index 00000000..b51bde57
--- /dev/null
+++ b/contracts/adapters/yearn/YearnVaultTokenAdapter.sol
@@ -0,0 +1,72 @@
+// Copyright (C) 2020 Zerion Inc.
+//
+// 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 .
+//
+// SPDX-License-Identifier: LGPL-3.0-only
+
+pragma solidity 0.6.5;
+pragma experimental ABIEncoderV2;
+
+import { ERC20 } from "../../ERC20.sol";
+import { TokenMetadata, Component } from "../../Structs.sol";
+import { TokenAdapter } from "../TokenAdapter.sol";
+
+/**
+ * @dev Vault contract interface.
+ * Only the functions required for YearnVaultTokenAdapter contract are added.
+ * The Vault contracts is available here
+ * https://github.com/iearn-finance/yearn-vaults/blob/master/contracts/Vault.vy.
+ */
+interface Vault {
+ function token() external view returns (address);
+
+ function pricePerShare() external view returns (uint256);
+}
+
+/**
+ * @title Token adapter for Yearn Token Vaults.
+ * @dev Implementation of TokenAdapter abstract contract.
+ * @author Igor Sobolev
+ */
+contract YearnVaultTokenAdapter is TokenAdapter {
+
+ /**
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
+ function getMetadata(address token) external view override returns (TokenMetadata memory) {
+ return TokenMetadata({
+ token: token,
+ name: ERC20(token).name(),
+ symbol: ERC20(token).symbol(),
+ decimals: ERC20(token).decimals()
+ });
+ }
+
+ /**
+ * @return Array of Component structs with underlying tokens rates for the given token.
+ * @dev Implementation of TokenAdapter abstract contract function.
+ */
+ function getComponents(address token) external view override returns (Component[] memory) {
+ Component[] memory components = new Component[](1);
+
+ components[0] = Component({
+ token: Vault(token).token(),
+ tokenType: "ERC20",
+ rate: Vault(token).pricePerShare() * (10 ** uint256(18 - ERC20(token).decimals()))
+ });
+
+ return components;
+ }
+}
diff --git a/contracts/mock/MockAdapter.sol b/contracts/mock/MockAdapter.sol
index c02c4810..48f8dcdf 100755
--- a/contracts/mock/MockAdapter.sol
+++ b/contracts/mock/MockAdapter.sol
@@ -25,16 +25,16 @@ import { ProtocolAdapter } from "../adapters/ProtocolAdapter.sol";
*/
contract MockAdapter is ProtocolAdapter {
- mapping (address => uint256) internal balanceOf;
-
- constructor() public {
- balanceOf[msg.sender] = 1000;
- }
+ mapping(address => uint256) internal balanceOf;
string public constant override adapterType = "Asset";
string public constant override tokenType = "ERC20";
+ constructor() public {
+ balanceOf[msg.sender] = 1000;
+ }
+
/**
* @return Mock balance.
*/
diff --git a/contracts/mock/MockTokenAdapter.sol b/contracts/mock/MockTokenAdapter.sol
index e8c6280a..1deee06a 100755
--- a/contracts/mock/MockTokenAdapter.sol
+++ b/contracts/mock/MockTokenAdapter.sol
@@ -27,9 +27,9 @@ import { TokenAdapter } from "../adapters/TokenAdapter.sol";
contract MockTokenAdapter is TokenAdapter {
/**
- * @return TokenMetadata struct with ERC20-style token info.
- * @dev Implementation of TokenAdapter interface function.
- */
+ * @return TokenMetadata struct with ERC20-style token info.
+ * @dev Implementation of TokenAdapter interface function.
+ */
function getMetadata(address token) external view override returns (TokenMetadata memory) {
return TokenMetadata({
token: token,
diff --git a/migrations_scripts/1_deploy_registry_and_add_adapters.js b/migrations_scripts/1_deploy_registry_and_add_adapters.js
index de271e38..ae97dc00 100755
--- a/migrations_scripts/1_deploy_registry_and_add_adapters.js
+++ b/migrations_scripts/1_deploy_registry_and_add_adapters.js
@@ -1,40 +1,126 @@
+const AragonStakingAdapter = artifacts.require('AragonStakingAdapter');
const AaveAssetAdapter = artifacts.require('AaveAssetAdapter');
+const BzxAssetAdapter = artifacts.require('BzxAssetAdapter');
+const BzxDebtAdapter = artifacts.require('BzxDebtAdapter');
const AaveDebtAdapter = artifacts.require('AaveDebtAdapter');
+const AaveUniswapAssetAdapter = artifacts.require('AaveUniswapAssetAdapter');
+const AaveUniswapDebtAdapter = artifacts.require('AaveUniswapDebtAdapter');
+const AaveStakingAdapter = artifacts.require('AaveStakingAdapter');
const BalancerAdapter = artifacts.require('BalancerAdapter');
const BancorAdapter = artifacts.require('BancorAdapter');
const CompoundAssetAdapter = artifacts.require('CompoundAssetAdapter');
const CompoundDebtAdapter = artifacts.require('CompoundDebtAdapter');
+const CreamAssetAdapter = artifacts.require('CreamAssetAdapter');
+const CreamDebtAdapter = artifacts.require('CreamDebtAdapter');
+const CreamStakingAdapter = artifacts.require('CreamStakingAdapter');
const CurveAdapter = artifacts.require('CurveAdapter');
+const CurveStakingAdapter = artifacts.require('CurveStakingAdapter');
+const CurveVestingAdapter = artifacts.require('CurveVestingAdapter');
+const DdexLendingAssetAdapter = artifacts.require('DdexLendingAssetAdapter');
+const DdexMarginAssetAdapter = artifacts.require('DdexMarginAssetAdapter');
+const DdexMarginDebtAdapter = artifacts.require('DdexMarginDebtAdapter');
+const DdexSpotAssetAdapter = artifacts.require('DdexSpotAssetAdapter');
const DmmAssetAdapter = artifacts.require('DmmAssetAdapter');
+const DodoAdapter = artifacts.require('DodoAdapter');
+const DodoStakingAdapter = artifacts.require('DodoStakingAdapter');
const DyDxAssetAdapter = artifacts.require('DyDxAssetAdapter');
const DyDxDebtAdapter = artifacts.require('DyDxDebtAdapter');
+const GnosisProtocolAdapter = artifacts.require('GnosisProtocolAdapter');
+const HarvestStakingAdapter = artifacts.require('HarvestStakingAdapter');
+const HarvestStakingV2Adapter = artifacts.require('HarvestStakingV2Adapter');
const IdleAdapter = artifacts.require('IdleAdapter');
const IearnAdapter = artifacts.require('IearnAdapter');
+const KeeperDaoAssetAdapter = artifacts.require('KeeperDaoAssetAdapter');
+const KimchiStakingAdapter = artifacts.require('KimchiStakingAdapter');
+const KyberAdapter = artifacts.require('KyberAdapter');
+const LinkswapAdapter = artifacs.require('LinkswapAdapter');
+const LinkswapStakingAdapter = artifacs.require('LinkswapStakingAdapter');
+const LivepeerStakingAdapter = artifacts.require('LivepeerStakingAdapter');
const ChaiAdapter = artifacts.require('ChaiAdapter');
const DSRAdapter = artifacts.require('DSRAdapter');
+const GovernanceAdapter = artifacts.require('GovernanceAdapter');
const MCDAssetAdapter = artifacts.require('MCDAssetAdapter');
const MCDDebtAdapter = artifacts.require('MCDDebtAdapter');
+const MaticStakingAdapter = artifacs.require('MaticStakingAdapter');
+const MelonAssetAdapter = artifacs.require('MelonAssetAdapter');
+const MstableAssetAdapter = artifacts.require('MstableAssetAdapter');
+const NexusStakingAdapter = artifacts.require('NexusStakingAdapter');
+const MstableStakingAdapter = artifacts.require('MstableStakingAdapter');
+const ChiAdapter = artifacts.require('ChiAdapter');
+const PickleAssetAdapter = artifacts.require('PickleAssetAdapter');
+const PickleStakingV1Adapter = artifacts.require('PickleStakingV1Adapter');
+const PickleStakingV2Adapter = artifacts.require('PickleStakingV2Adapter');
+const PieDAOPieAdapter = artifacts.require('PieDAOPieAdapter');
+const PieDAOStakingAdapter = artifacts.require('PieDAOStakingAdapter');
const PoolTogetherAdapter = artifacts.require('PoolTogetherAdapter');
+const SashimiStakingAdapter = artifacts.require('SashimiStakingAdapter');
+const SushiStakingAdapter = artifacts.require('SushiStakingAdapter');
+const SwerveAdapter = artifacts.require('SwerveAdapter');
+const SwerveStakingAdapter = artifacts.require('SwerveStakingAdapter');
const SynthetixAssetAdapter = artifacts.require('SynthetixAssetAdapter');
const SynthetixDebtAdapter = artifacts.require('SynthetixDebtAdapter');
const TokenSetsAdapter = artifacts.require('TokenSetsAdapter');
+const TokenSetsV2Adapter = artifacts.require('TokenSetsV2Adapter');
const UniswapV1Adapter = artifacts.require('UniswapV1Adapter');
+const UniswapV2Adapter = artifacts.require('UniswapV2Adapter');
+const UniswapV2StakingAdapter = artifacts.require('UniswapV2StakingAdapter');
+const YearnStakingV1Adapter = artifacts.require('YearnStakingV1Adapter');
+const YearnStakingV2Adapter = artifacts.require('YearnStakingV2Adapter');
const ZrxAdapter = artifacts.require('ZrxAdapter');
const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
const AaveTokenAdapter = artifacts.require('AaveTokenAdapter');
+const BzxTokenAdapter = artifacts.require('BzxTokenAdapter');
+const AaveUniswapTokenAdapter = artifacts.require('AaveUniswapTokenAdapter');
const BalancerTokenAdapter = artifacts.require('BalancerTokenAdapter');
const BancorTokenAdapter = artifacts.require('BancorTokenAdapter');
const CompoundTokenAdapter = artifacts.require('CompoundTokenAdapter');
const CurveTokenAdapter = artifacts.require('CurveTokenAdapter');
const DmmTokenAdapter = artifacts.require('DmmTokenAdapter');
+const DodoTokenAdapter = artifacts.require('DodoTokenAdapter');
const IdleTokenAdapter = artifacts.require('IdleTokenAdapter');
const IearnTokenAdapter = artifacts.require('IearnTokenAdapter');
+const KeeperDaoTokenAdapter = artifacts.require('IearnTokenAdapter');
+const LinkswapTokenAdapter = artifacs.require('LinkswapTokenAdapter');
const ChaiTokenAdapter = artifacts.require('ChaiTokenAdapter');
+const MelonTokenAdapter = artifacts.require('MelonTokenAdapter');
+const MstableTokenAdapter = artifacts.require('MstableTokenAdapter');
+const ChiTokenAdapter = artifacts.require('ChiTokenAdapter');
+const PickleTokenAdapter = artifacts.require('PickleTokenAdapter');
+const PieDAOPieTokenAdapter = artifacts.require('PieDAOPieTokenAdapter');
const PoolTogetherTokenAdapter = artifacts.require('PoolTogetherTokenAdapter');
const TokenSetsTokenAdapter = artifacts.require('TokenSetsTokenAdapter');
+const TokenSetsV2TokenAdapter = artifacts.require('TokenSetsV2TokenAdapter');
+const TubeProtocolAdapter = artifacs.require('TubeProtocolAdapter');
+const MustStakingAdapter = artifacs.require('MustStakingAdapter');
const UniswapV1TokenAdapter = artifacts.require('UniswapV1TokenAdapter');
+const UniswapV2TokenAdapter = artifacts.require('UniswapV2TokenAdapter');
const AdapterRegistry = artifacts.require('AdapterRegistry');
+const antAddress = '0x960b236A07cf122663c4303350609A66A7B288C0';
+const uniAntWethAddress = '0xfa19de406e8F5b9100E4dD5CaD8a503a6d686Efe';
+
+const iDaiAddress = '0x6b093998d36f2c7f0cc359441fbb24cc629d5ff0';
+const iEthAddress = '0xb983e01458529665007ff7e0cddecdb74b967eb6';
+const iUSDCAddress = '0x32e4c68b3a4a813b710595aeba7f6b7604ab9c15';
+const iWBTCAddress = '0x2ffa85f655752fb2acb210287c60b9ef335f5b6e';
+const iLENDAddress = '0xab45bf58c6482b87da85d6688c4d9640e093be98';
+const iKNCAddress = '0x687642347a9282be8fd809d8309910a3f984ac5a';
+const iMKRAddress = '0x9189c499727f88f8ecc7dc4eea22c828e6aac015';
+const iLINKAddress = '0x463538705e7d22aa7f03ebf8ab09b067e1001b54';
+const iYFIAddress = '0x7f3fe9d492a9a60aebb06d82cba23c6f32cad10b';
+const iUSDTAddress = '0x7e9997a38a439b2be7ed9c9c4628391d3e055d48';
+
+const bzxDaiAddress = '0x6b175474e89094c44da98b954eedeac495271d0f';
+const bzxEthAddress = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2';
+const bzxUSDCAddress = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
+const bzxWBTCAddress = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599';
+const bzxLENDAddress = '0x80fB784B7eD66730e8b1DBd9820aFD29931aab03';
+const bzxKNCAddress = '0xdd974d5c2e2928dea5f71b9825b8b646686bd200';
+const bzxMKRAddress = '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2';
+const bzxLINKAddress = '0x514910771AF9Ca656af840dff83E8264EcF986CA';
+const bzxYFIAddress = '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e';
+const bzxUSDTAddress = '0xdac17f958d2ee523a2206206994597c13d831ec7';
+
const aDaiAddress = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d';
const aTusdAddress = '0x4DA9b813057D04BAef4e5800E36083717b4a0341';
const aUsdcAddress = '0x9bA00D6856a4eDF4665BcA2C2309936572473B7E';
@@ -64,6 +150,7 @@ const batAddress = '0x0D8775F648430679A709E98d2b0Cb6250d2887EF';
const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
const linkAddress = '0x514910771AF9Ca656af840dff83E8264EcF986CA';
const kncAddress = '0xdd974D5C2e2928deA5F71b9825b8b646686BD200';
+const lptAddress = '0x58b6a8a3302369daec383334672404ee733ab239';
const repAddress = '0x1985365e9f78359a9B6AD760e32412f4a445E862';
const mkrAddress = '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2';
const manaAddress = '0x0F5D2fB29fb7d3CFeE444a200298f468908cC942';
@@ -71,6 +158,17 @@ const zrxAddress = '0xE41d2489571d322189246DaFA5ebDe1F4699F498';
const snxAddress = '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F';
const wbtcAddress = '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599';
+const aUniUsdcEthAddress = '0x1D0e53A0e524E3CC92C1f0f33Ae268FfF8D7E7a5';
+const aUniLinkEthAddress = '0x9548DB8b1cA9b6c757485e7861918b640390169c';
+const aUniDaiEthAddress = '0xBbBb7F2aC04484F7F04A2C2C16f20479791BbB44';
+const aUniLendEthAddress = '0xc88ebbf7c523f38ef3eb8a151273c0f0da421e63';
+const aUniMkrEthAddress = '0x8c69f7A4C9B38F1b48005D216c398Efb2F1Ce3e4';
+const aUniSethEthAddress = '0x84BBcaB430717ff832c3904fa6515f97fc63C76F';
+const auDaiAddress = '0x048930eec73c91B44b0844aEACdEBADC2F2b6efb';
+const auUsdcAddress = '0xe02b2Ad63eFF3Ac1D5827cBd7AB9DD3DaC4f4AD0';
+const auUsdtAddress = '0xb977ee318010A5252774171494a1bCB98E7fab65';
+const auEthAddress = '0x6179078872605396Ee62960917128F9477a5DdbB';
+
const cDAIAddress = '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643';
const cBATAddress = '0x6C8c6b02E7b2BE14d4fA6022Dfd6d75921D90E4E';
const cETHAddress = '0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5';
@@ -79,6 +177,39 @@ const cSAIAddress = '0xF5DCe57282A584D2746FaF1593d3121Fcac444dC';
const cZRXAddress = '0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407';
const cUSDCAddress = '0x39AA39c021dfbaE8faC545936693aC917d5E7563';
const cWBTCAddress = '0xC11b1268C1A384e55C48c2391d8d480264A3A7F4';
+const cUSDTAddress = '0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9';
+const cUNIAddress = '0x35a18000230da775cac24873d00ff85bccded550';
+
+const crEthAddress = '0xD06527D5e56A3495252A528C4987003b712860eE';
+const crUsdtAddress = '0x797AAB1ce7c01eB727ab980762bA88e7133d2157';
+const crUsdcAddress = '0x44fbeBd2F576670a6C33f6Fc0B00aA8c5753b322';
+const crCompAddress = '0x19D1666f543D42ef17F66E376944A22aEa1a8E46';
+const crBalAddress = '0xcE4Fe9b4b8Ff61949DCfeB7e03bc9FAca59D2Eb3';
+const crYfiAddress = '0xCbaE0A83f4f9926997c8339545fb8eE32eDc6b76';
+const crYCrvAddress = '0x9baF8a5236d44AC410c0186Fe39178d5AAD0Bb87';
+const crLinkAddress = '0x697256CAA3cCaFD62BB6d3Aa1C7C5671786A5fD9';
+const crCreamAddress = '0x892B14321a4FCba80669aE30Bd0cd99a7ECF6aC0';
+const crLendAddress = '0x8B86e0598616a8d4F1fdAE8b59E55FB5Bc33D0d6';
+const crCrvAddress = '0xc7Fd8Dcee4697ceef5a2fd4608a7BD6A94C77480';
+const crRenBtcAddress = '0x17107f40d70f4470d20CB3f138a052cAE8EbD4bE';
+const crBusdAddress = '0x1FF8CDB51219a8838b52E9cAc09b71e591BC998e';
+const crMtaAddress = '0x3623387773010d9214B10C551d6e7fc375D31F58';
+const crYYCrvAddress = '0x4EE15f44c6F0d8d1136c83EfD2e8E4AC768954c6';
+const crSushiAddress = '0x338286C0BC081891A4Bda39C7667ae150bf5D206';
+const crFttAddress = '0x10FDBD1e48eE2fD9336a482D746138AE19e649Db';
+const crYEthAddress = '0x01da76DEa59703578040012357b81ffE62015C2d';
+const crSrmAddress = '0xef58b2d5A1b8D3cDE67b8aB054dC5C831E9Bc025';
+
+const balancerCream80Weth20Address = '0x5a82503652d05B21780f33178FDF53d31c29B916';
+const uniCreamWethAddress = '0xddF9b7a31b32EBAF5c064C80900046C9e5b7C65F';
+const creamCreamUsdcAddress = '0x4Fd2d9d6eF05E13Bf0B167509151A4EC3D4d4b93';
+const creamCreamWethAddress = '0xa49b3c7C260ce8A7C665e20Af8aA6E099A86cf8A';
+const creamCrCreamCrYfiAddress = '0xA65405e0dD378C65308deAE51dA9e3BcEBb81261';
+const creamCrYEthCrYYCrvAddress = '0xB3284F2F22563F27cEF2912637b6A00F162317c4';
+const creamCrYEthWethAddrvess = '0x6a3B875854f5518E85Ef97620c5e7de75bbc3fA0';
+const creamYYCrvUsdcAddress = '0x661b94d96ADb18646e791A06576F7905a8d1BEF6';
+const creamYfiUsdcAddress = '0x7350c6D00D63AB5988250aea347f277c19BEA785';
+const creamAddress = '0x2ba592F78dB6436527729929AAf6c908497cB200';
const mDAIAddress = '0x06301057D77D54B6e14c7FafFB11Ffc7Cab4eaa7';
const mETHAddress = '0xdF9307DFf0a1B57660F60f9457D32027a55ca0B2';
@@ -98,12 +229,35 @@ const yUSDCv3 = '0x26EA744E5B887E5205727f55dFBE8685e3b21951';
const yUSDTv3 = '0xE6354ed5bC4b393a5Aad09f21c46E101e692d447';
const yBUSDv3 = '0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE';
-const idleDAI = '0x10eC0D497824e342bCB0EDcE00959142aAa766dD';
-const idleUSDC = '0xeB66ACc3d011056B00ea521F8203580C2E5d3991';
+const idleBestYieldDAI = '0x3fE7940616e5Bc47b0775a0dccf6237893353bB4';
+const idleBestYieldUSDC = '0x5274891bEC421B39D23760c04A6755eCB444797C';
+const idleBestYieldUSDT = '0xF34842d05A1c888Ca02769A633DF37177415C2f8';
+const idleBestYieldSUSD = '0xf52cdcd458bf455aed77751743180ec4a595fd3f';
+const idleBestYieldTUSD = '0xc278041fDD8249FE4c1Aad1193876857EEa3D68c';
+const idleBestYieldWBTC = '0x8C81121B15197fA0eEaEE1DC75533419DcfD3151';
+
+const idleRiskAdjustedDAI = '0xa14eA0E11121e6E951E87c66AFe460A00BCD6A16';
+const idleRiskAdjustedUSDC = '0x3391bc034f2935ef0e1e41619445f998b2680d35';
+const idleRiskAdjustedUSDT = '0x28fAc5334C9f7262b3A3Fe707e250E01053e07b5';
+
+const kETHAddress = '0xC4c43C78fb32F2c7F8417AF5af3B85f090F1d327';
+const kWETHAddress = '0xac19815455C2c438af8A8b4623F65f091364be10';
+
+const crvAddress = '0xD533a949740bb3306d119CC777fa900bA034cd52';
+
+const cCrvAddress = '0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2';
+const tCrvAddress = '0x9fC689CCaDa600B6DF723D9E47D84d76664a1F23';
+const yCrvAddress = '0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8';
+const bCrvAddress = '0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B';
+const sCrvAddress = '0xC25a3A3b969415c80451098fa907EC722572917F';
+const pCrvAddress = '0xD905e2eaeBe188fc92179b6350807D8bd91Db0D8';
+const tbtcCrvAddress = '0x1f2a662FB513441f06b8dB91ebD9a1466462b275';
+const renCrvAddress = '0x49849C98ae39Fff122806C06791Fa73784FB3675';
+const sbtcCrvAddress = '0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3';
-const ssCompoundTokenAddress = '0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2';
-const ssYTokenAddress = '0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8';
-const ssBusdTokenAddress = '0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B';
+const sethUniAddress = '0xe9Cf7887b93150D4F2Da7dFc6D502B216438F244';
+const curveSnxAddress = '0xC25a3A3b969415c80451098fa907EC722572917F';
+const iETHAddress = '0xA9859874e1743A32409f75bB11549892138BBA1E';
const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
@@ -111,8 +265,172 @@ const saiPoolAddress = '0xb7896fce748396EcFC240F5a0d3Cc92ca42D7d84';
const daiPoolAddress = '0x29fe7D60DdF151E5b52e5FAB4f1325da6b2bD958';
const usdcPoolAddress = '0x0034Ea9808E620A0EF79261c51AF20614B742B24';
+const yfiAddress = '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e';
+const balancerDai98Yfi2Address = '0x60626db611a9957C1ae4Ac5b7eDE69e24A3B76c5';
+const balancerYfi2yCrv98Address = '0x95C4B6C7CfF608c0CA048df8b81a484aA377172B';
+
+const yflAddress = '0x28cb7e841ee97947a86B06fA4090C8451f64c0be';
+const yflusdAddress = '0x7b760d06e401f85545f3b50c44bf5b05308b7b62';
+const syflAddress = '0x8282df223ac402d04b2097d16f758af4f70e7db0';
+const cfiAddress = '0x63b4f3e3fa4e438698ce330e365e831f7ccd1ef4';
+const masqAddress = '0x06F3C323f0238c72BF35011071f2b5B7F43A054c';
+const dpiAddress = '0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b';
+const celAddress = '0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d';
+const yaxAddress = '0xb1dc9124c395c1e97773ab855d66e879f053a289';
+const gswapAddress = '0xaac41EC512808d64625576EDdd580e7Ea40ef8B2';
+
+const lslpYflLink = '0x189a730921550314934019d184ec05726881d481';
+const lslpLinkYflusd = '0x6cd7817e6f3f52123df529e1edf5830240ce48c1';
+const lslpYflusdWeth = '0x195734d862dfb5380eeda0acd8acf697ea95d370';
+const lslpLinkSyfl = '0x74c89f297b1dc87f927d9432a4eeea697e6f89a5';
+const lslpSyflWeth = '0x3315351f0b20595777a28054ef3d514bdc37463d';
+const lslpDpiLink = '0x017fad4b7a54c1ace95ca614954e4d0d12cdb27e';
+const lslpLinkGswap = '0xdef0cef53e0d4c6a5e568c53edcf45ceb33dbe46';
+const lslpLinkCel = '0x639916bb4b29859fadf7a272185a3212157f8ce1';
+const lslpMasqWeth = '0x37cee65899da4b1738412814155540c98dfd752c';
+const lslpBusdLink = '0x983c9a1bcf0eb980a232d1b17bffd6bbf68fe4ce';
+const lslpLinkYax = '0x626b88542495d2e341d285969f8678b99cd91da7';
+const lslpYaxWeth = '0x21dee38170F1e1F26baFf2C30C0fc8F8362b6961';
+const lslpLinkCfi = '0xf68c01198cddeafb9d2ea43368fc9fa509a339fa';
+const lslpLinkUsdc = '0x9d996bDD1F65C835EE92Cd0b94E15d886EF14D63';
+const lslpLinkUsdt = '0xf36c9fc3c2abe4132019444aff914fc8dc9785a9';
+const lslpYflWeth = '0x7e5A536F3d79791E283940ec379CEE10C9C40e86';
+const lslpLinkAzuki = '0xB7Cd446a2a80d4770C6bECde661B659cFC55acf5';
+const lslpLinkDoki = '0xbe755C548D585dbc4e3Fe4bcD712a32Fd81e5Ba0';
+
const chaiAddress = '0x06AF07097C9Eeb7fD685c692751D5C66dB49c215';
+const mUsdAddress = '0xe2f2a5C287993345a840Db3B0845fbC70f5935a5';
+
+const chiAddress = '0x0000000000004946c0e9F43F4Dee607b0eF1fA1c';
+
+const BTCPPAddress = '0x0327112423F3A68efdF1fcF402F6c5CB9f7C33fd';
+const USDPPAddress = '0x9A48BD0EC040ea4f1D3147C025cd4076A2e71e3e';
+const DEFIPLAddress = '0x24d1917c1ae6c085e6b68b6c1a41b8f9de5bd441';
+const DEFIPSAddress = '0xad6a626ae2b43dcb1b39430ce496d2fa0365ba9c';
+const DEFIPPAddress = '0x880873a96ce38c7fd39dc714592902b069bde048';
+
+const mtaAddress = '0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2';
+const balAddress = '0xba100000625a3754423978a60c9317c58a424e3D';
+const balancerMusd20Mta80Address = '0x003a70265a3662342010823bEA15Dc84C6f7eD54';
+const balancerUsdc50Musd50Address = '0x72Cd8f4504941Bf8c5a21d1Fd83A96499FD71d2C';
+const balancerMusd95Mta5Address = '0xa5DA8Cc7167070B62FdCB332EF097A55A68d8824';
+const balancerWeth50Musd50Address = '0xe036CCE08cf4E23D33bC6B18e53Caf532AFa8513';
+const uniswapMtaWethAddress = '0x0d0d65E7A7dB277d3E0F5E1676325E75f3340455';
+
+const amplAddress = '0xD46bA6D942050d489DBd938a2C909A5d5039A161';
+const uniAmplWethAddress = '0xc5be99A02C6857f9Eac67BbCE58DF5572498F40c';
+
+const maticAddress = '0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0';
+
+const nxmAddress = '0xd7c49CEE7E9188cCa6AD8FF264C1DA2e69D4Cf3B';
+
+const sashimiAddress = '0xC28E27870558cF22ADD83540d2126da2e4b464c2';
+const uniSashimiWethAddress = '0x4b618087DaE7765823BC47fFbF38C8Ee8489F5CA';
+const uniSashimiElfAddress = '0x1629B0259E6E5c315B8Eea09fd1a4D0A26291F98';
+const uniElfWethAddress = '0xA6be7F7C6c454B364cDA446ea39Be9e5E4369DE8';
+const uniWbtcWethAddress = '0xBb2b8038a1640196FbE3e38816F3e67Cba72D940';
+
+const sushiAddress = '0x6B3595068778DD592e39A122f4f5a5cF09C90fE2';
+const uniUsdtWethAddress = '0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852';
+const uniUsdcWethAddress = '0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc';
+const uniDaiWethAddress = '0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11';
+const uniSusdWethAddress = '0xf80758aB42C3B07dA84053Fd88804bCB6BAA4b5c';
+const uniBandWethAddress = '0xf421c3f2e695c2d4c0765379ccace8ade4a480d9';
+const uniLinkWethAddress = '0xa2107FA5B38d9bbd2C461D6EDf11B11A50F6b974';
+const uniLendWethAddress = '0xaB3F9bF1D81ddb224a2014e98B238638824bCf20';
+const uniSnxWethAddress = '0x43AE24960e5534731Fc831386c07755A2dc33D47';
+const uniYfiWethAddress = '0x2fDbAdf3C4D5A8666Bc06645B8358ab803996E28';
+
+const sushiSushiWethAddress = '0x795065dCc9f64b5614C407a6EFDC400DA6221FB0';
+const sushiUsdtWethAddress = '0x06da0fd433C1A5d7a4faa01111c044910A184553';
+const sushiUsdcWethAddress = '0x397FF1542f962076d0BFE58eA045FfA2d347ACa0';
+const sushiDaiWethAddress = '0xC3D03e4F041Fd4cD388c549Ee2A29a9E5075882f';
+const sushiSusdWethAddress = '0xF1F85b2C54a2bD284B1cf4141D64fD171Bd85539';
+const sushiUmaWethAddress = '0x001b6450083e531a5a7bf310bd2c1af4247e23d4';
+const sushiBandWethAddress = '0xA75F7c2F025f470355515482BdE9EFA8153536A8';
+const sushiLinkWethAddress = '0xC40D16476380e4037e6b1A2594cAF6a6cc8Da967';
+const sushiAmplWethAddress = '0xCb2286d9471cc185281c4f763d34A962ED212962';
+const sushiCompWethAddress = '0x31503dcb60119a812fee820bb7042752019f2355';
+const sushiLendWethAddress = '0x5E63360E891BD60C69445970256C260b0A6A54c6';
+const sushiSnxWethAddress = '0xA1d7b2d891e3A1f9ef4bBC5be20630C2FEB1c470';
+const sushiYfiWethAddress = '0x088ee5007C98a9677165D78dD2109AE4a3D04d0C';
+const sushiRenWethAddress = '0x611CDe65deA90918c0078ac0400A72B0D25B9bb1';
+const sushiBaseSusdAddress = '0xaAD22f5543FCDaA694B68f94Be177B561836AE57';
+const sushiSrmWethAddress = '0x117d4288B3635021a3D612FE05a3Cbf5C717fEf2';
+const sushiYam2WethAddress = '0x95b54C8Da12BB23F7A5F6E26C38D04aCC6F81820';
+const sushiCrvWethAddress = '0x58Dc5a51fE44589BEb22E8CE67720B5BC5378009';
+
+const kimchiAddress = '0x1E18821E69B9FAA8e6e75DFFe54E7E25754beDa0';
+const uniKimchiWeth = '0xC4da39E646e7F5D233B89CA0F7B75344e7ddB2cc';
+const uniKimchiSushi = '0xC8d02f2669eF9aABE6B3b75E2813695AeD63748d';
+const uniKimchiTend = '0x1F4e87F70002867ab5df276d6A09A94E3eDa4f9A';
+
+const farmAddress = '0xa0246c9032bC3A600820415aE600c6388619A14D';
+const fDaiAddress = '0xe85C8581e60D7Cd32Bbfd86303d2A4FA6a951Dac';
+const fUsdcAddress = '0xc3F7ffb5d5869B3ade9448D094d81B0521e8326f';
+const fUsdtAddress = '0xc7EE21406BB581e741FBb8B21f213188433D9f2F';
+const balancerUsdc95Farm5Address = '0x0395e4A17fF11D36DaC9959f2D7c8Eca10Fe89c9';
+const uniUsdcFarmAddress = '0x514906FC121c7878424a5C928cad1852CC545892';
+const yfvAddress = '0x45f24BaEef268BB6d63AEe5129015d69702BCDfa';
+const yfiiAddress = '0xa1d0E215a23d7030842FC67cE582a6aFa3CCaB83';
+const ognAddress = '0x8207c1FfC5B6804F6024322CcF34F29c3541Ae26';
+const uniBasedSusdAddress = '0xaAD22f5543FCDaA694B68f94Be177B561836AE57';
+const uniPastaWethAddress = '0xE92346d9369Fe03b735Ed9bDeB6bdC2591b8227E';
+
+const balancerCrv90Farm10 = '0xac6bac9Dc3de2c14b420E287De8ECB330d96E492';
+const balancerSwrv90Farm10 = '0xf9F2dF6e0e369145481a32Fcd260E353AA20c1a6';
+const balancerUniSusdBased90Farm10 = '0xf76206115617f090f5a49961a78BCf99BB91cFeE';
+const balancerUniAmplWeth90Farm10 = '0xdFb341093ea062a74Bd19a222c74Abdcb97C067b';
+const balancerYFV90Farm10 = '0x97cD8E51cd6C888567c6c620188B8Fb264EE8E91';
+const balancerSUSHI90Farm10 = '0xB39Ce7fa5953beBC6697112e88cd11579CBCA579';
+const balancerLINK90Farm10 = '0x418d3DfcA5099923Cd57e0Bf9Ed1e9994f515152';
+const balancerUniPastaWeth90Farm10 = '0xa3e69eBCE417eE0508d6996340126aD60078fCDd';
+const balancerPYLON90Farm10 = '0x1e2dA0aa71155726C5C0E39AF76Ac0c2e8F74bEF';
+const UniUsdtFUsdt = '0x713f62ccf8545Ff1Df19E5d7Ab94887cFaf95677';
+const UniUsdcFUsdc = '0x4161Fa43eaA1Ac3882aeeD12C5FC05249e533e67';
+const UniDaiFDai = '0x007E383BF3c3Ffa12A5De06a53BAb103335eFF28';
+const UniWbtcFWbtc = '0xaebfeA924DE4080C14DF5C432cECe261934457E0';
+const UniWbtcFRenbtc = '0x007F74c5C82d68A138Cc3Bc623E51270279fa525';
+const UniWbtcFCrvWbtc = '0xb6A6a3D8EF31D9FAeb1AB1487aCe79Fe1f5df1BB';
+
+const swUsdAddress = '0x77C6E4a580c0dCE4E5c7a17d0bc077188a83A059';
+
+const compAddress = '0xc00e94Cb662C3520282E6f5717214004A7f26888';
+const renBtcAddress = '0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D';
+const yYCrvAddress = '0x5dbcF33D8c2E976c6b560249878e6F1491Bca25c';
+const fttAddress = '0x50D1c9771902476076eCFc8B2A83Ad6b9355a4c9';
+const yEthAddress = '0xe1237aA7f535b0CC33Fd973D66cBf830354D16c7';
+const srmAddress = '0x476c5E26a75bd202a9683ffD34359C0CC15be0fF';
+
+const uniAddress = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984';
+const aaveAddress = '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9';
+
+const goughAddress = '0xad32A8e6220741182940c5aBF610bDE99E737b2D';
+const balancerWeth20Dough80Address = '0xFAE2809935233d4BfE8a56c2355c4A2e7d1fFf1A';
+const uniswapDaiDefiSAddress = '0x7aeFaF3ea1b465dd01561B0548c9FD969e3F76BA';
+const balancerDefiS70Weth30Address = '0x35333CF3Db8e334384EC6D2ea446DA6e445701dF';
+
+const pickleAddress = '0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5';
+const pickleSCrvJarAddress = '0x68d14d66B2B0d6E157c06Dc8Fefa3D8ba0e66a89';
+const pickleRenbtcCrvJarAddress = '0x2E35392F4c36EBa7eCAFE4de34199b2373Af22ec';
+const pickleThreeCrvJarV2Address = '0x1BB74b5DdC1f4fC91D6f9E7906cf68bc93538e33';
+const pickleUniswapWethDaiJarV2Address = '0xCffA068F1E44D98D3753966eBd58D4CFe3BB5162';
+const pickleUniswapWethUsdcJarV2Address = '0x53Bf2E62fA20e2b4522f05de3597890Ec1b352C6';
+const pickleUniswapWethUsdtJarV2Address = '0x09FC573c502037B149ba87782ACC81cF093EC6ef';
+const pickleUniswapWethWbtcJarAddress = '0xc80090AA05374d336875907372EE4ee636CBC562';
+
+const uniswapWethPickleAddress = '0xdc98556Ce24f007A5eF6dC1CE96322d65832A819';
+const pickleUniswapWethDaiJarAddress = '0xf79Ae82DCcb71ca3042485c85588a3E0C395D55b';
+const pickleUniswapWethUsdcJarAddress = '0x46206E9BDaf534d057be5EcF231DaD2A1479258B';
+const pickleUniswapWethUsdtJarAddress = '0x3a41AB1e362169974132dEa424Fb8079Fd0E94d8';
+const pickleThreeCrvJarAddress = '0x2385D31f1EB3736bE0C3629E6f03C4b3cd997Ffd';
+
+const tubeAddress = '0x85BC2E8Aaad5dBc347db49Ea45D95486279eD918';
+
+const mustStakingAddress = '0x048Dda990f581e80EFfc72E4e1996AE548f8d64C';
+const mustAddress = '0x9C78EE466D6Cb57A4d01Fd887D2b5dFb2D46288f';
+
const aaveAssetAdapterTokens = [
aDaiAddress,
aTusdAddress,
@@ -151,6 +469,59 @@ const aaveDebtAdapterTokens = [
snxAddress,
wbtcAddress,
];
+const aaveUniswapAssetAdapterTokens = [
+ aUniUsdcEthAddress,
+ aUniLinkEthAddress,
+ aUniDaiEthAddress,
+ aUniLendEthAddress,
+ aUniMkrEthAddress,
+ aUniSethEthAddress,
+ auDaiAddress,
+ auUsdcAddress,
+ auUsdtAddress,
+ auEthAddress,
+];
+const aaveUniswapDebtAdapterTokens = [
+ daiAddress,
+ usdcAddress,
+ usdtAddress,
+ ethAddress,
+];
+const aaveStakingAdapterTokens = [
+ aaveAddress,
+];
+const ampleforthAdapterTokens = [
+ amplAddress,
+ uniAmplWethAddress,
+];
+const aragonStakingAdapterTokens = [
+ antAddress,
+ uniAntWethAddress,
+];
+const bzxAssetAdapterTokens = [
+ iDaiAddress,
+ iEthAddress,
+ iUSDCAddress,
+ iWBTCAddress,
+ iLENDAddress,
+ iKNCAddress,
+ iMKRAddress,
+ iLINKAddress,
+ iYFIAddress,
+ iUSDTAddress,
+];
+const bzxDebtAdapterTokens = [
+ bzxDaiAddress,
+ bzxEthAddress,
+ bzxUSDCAddress,
+ bzxWBTCAddress,
+ bzxLENDAddress,
+ bzxKNCAddress,
+ bzxMKRAddress,
+ bzxLINKAddress,
+ bzxYFIAddress,
+ bzxUSDTAddress,
+];
const compoundAssetAdapterTokens = [
cDAIAddress,
cBATAddress,
@@ -160,6 +531,8 @@ const compoundAssetAdapterTokens = [
cZRXAddress,
cUSDCAddress,
cWBTCAddress,
+ cUSDTAddress,
+ cUNIAddress,
];
const compoundDebtAdapterTokens = [
daiAddress,
@@ -170,11 +543,99 @@ const compoundDebtAdapterTokens = [
zrxAddress,
usdcAddress,
wbtcAddress,
+ usdtAddress,
+ uniAddress,
+];
+
+creamAssetAdapterTokens = [
+ crEthAddress,
+ crUsdtAddress,
+ crUsdcAddress,
+ crCompAddress,
+ crBalAddress,
+ crYfiAddress,
+ crYCrvAddress,
+ crLinkAddress,
+ crCreamAddress,
+ crLendAddress,
+ crCrvAddress,
+ crRenBtcAddress,
+ crBusdAddress,
+ crMtaAddress,
+ crYYCrvAddress,
+ crSushiAddress,
+ crFttAddress,
+ crYEthAddress,
+ crSrmAddress,
];
+
+creamDebtAdapterTokens = [
+ ethAddress,
+ usdtAddress,
+ usdcAddress,
+ compAddress,
+ balAddress,
+ yfiAddress,
+ yCrvAddress,
+ linkAddress,
+ creamAddress,
+ lendAddress,
+ crvAddress,
+ renBtcAddress,
+ busdAddress,
+ mtaAddress,
+ yYCrvAddress,
+ sushiAddress,
+ fttAddress,
+ yEthAddress,
+ srmAddress,
+];
+
+creamStakingAdapterTokens = [
+ balancerCream80Weth20Address,
+ uniCreamWethAddress,
+ creamCreamUsdcAddress,
+ creamCreamWethAddress,
+ creamCrCreamCrYfiAddress,
+ creamCrYEthCrYYCrvAddress,
+ creamCrYEthWethAddrvess,
+ creamYYCrvUsdcAddress,
+ creamYfiUsdcAddress,
+ crCreamAddress,
+ creamAddress,
+];
+
const curveAdapterTokens = [
- ssCompoundTokenAddress,
- ssYTokenAddress,
- ssBusdTokenAddress,
+ cCrvAddress,
+ tCrvAddress,
+ yCrvAddress,
+ bCrvAddress,
+ sCrvAddress,
+ pCrvAddress,
+ tbtcCrvAddress,
+ renCrvAddress,
+ sbtcCrvAddress,
+];
+const curveStakingAdapterTokens = [
+ crvAddress,
+ cCrvAddress,
+ yCrvAddress,
+ bCrvAddress,
+ sCrvAddress,
+ pCrvAddress,
+ renCrvAddress,
+ sbtcCrvAddress,
+];
+const curveVestingAdapterTokens = [
+ crvAddress,
+];
+const ddexAdapterTokens = [
+ busdAddress,
+ daiAddress,
+ ethAddress,
+ usdcAddress,
+ usdtAddress,
+ wbtcAddress,
];
const dmmAssetAdapterTokens = [
mDAIAddress,
@@ -187,9 +648,20 @@ const dydxAdapterTokens = [
usdcAddress,
daiAddress,
];
-const idleAdapterTokens = [
- idleDAI,
- idleUSDC,
+const gnosisProtocolAdapterTokens = [
+];
+const idleBestYieldAdapterTokens = [
+ idleBestYieldDAI,
+ idleBestYieldUSDC,
+ idleBestYieldUSDT,
+ idleBestYieldSUSD,
+ idleBestYieldTUSD,
+ idleBestYieldWBTC,
+];
+const idleRiskAdjustedAdapterTokens = [
+ idleRiskAdjustedDAI,
+ idleRiskAdjustedUSDC,
+ idleRiskAdjustedUSDT,
];
const iearn2AdapterTokens = [
yDAIv2,
@@ -205,9 +677,70 @@ const iearn3AdapterTokens = [
yUSDTv3,
yBUSDv3,
];
+const harvestStakingAdapterTokens = [
+ farmAddress,
+ fDaiAddress,
+ fUsdcAddress,
+ fUsdtAddress,
+ balancerUsdc95Farm5Address,
+ uniUsdcFarmAddress,
+ daiAddress,
+ wethAddress,
+ linkAddress,
+ yfiAddress,
+ sushiAddress,
+ yfvAddress,
+ yfiiAddress,
+ ognAddress,
+ uniBasedSusdAddress,
+ uniPastaWethAddress,
+];
+const harvestStakingV2AdapterTokens = [
+ farmAddress,
+ balancerCrv90Farm10,
+ balancerSwrv90Farm10,
+ balancerUniSusdBased90Farm10,
+ balancerUniAmplWeth90Farm10,
+ balancerYFV90Farm10,
+ balancerSUSHI90Farm10,
+ balancerLINK90Farm10,
+ balancerUniPastaWeth90Farm10,
+ balancerPYLON90Farm10,
+ UniUsdtFUsdt,
+ UniUsdcFUsdc,
+ UniDaiFDai,
+ UniWbtcFWbtc,
+ UniWbtcFRenbtc,
+ UniWbtcFCrvWbtc,
+];
+const keeperDaoAdapterTokens = [
+ kETHAddress,
+ kWETHAddress,
+];
+const kimchiStakingAdapterTokens = [
+ kimchiAddress,
+ uniKimchiWeth,
+ uniKimchiSushi,
+ uniKimchiTend,
+ uniUsdtWethAddress,
+ uniUsdcWethAddress,
+ uniSusdWethAddress,
+ uniBandWethAddress,
+ uniYfiWethAddress,
+];
+const kyberAdapterTokens = [
+ kncAddress,
+ ethAddress,
+];
+const livepeerAdapterTokens = [
+ lptAddress,
+];
const dsrAdapterTokens = [
daiAddress,
];
+const governanceAdapterTokens = [
+ mkrAddress,
+];
const chaiAdapterTokens = [
chaiAddress,
];
@@ -218,20 +751,185 @@ const mcdAssetAdapterTokens = [
const mcdDebtAdapterTokens = [
daiAddress,
];
+const maticStakingAdapterTokens = [
+ maticAddress,
+];
+const mstableAssetAdapterTokens = [
+ mUsdAddress,
+];
+const nexusStakingAdapterTokens = [
+ nxmAddress,
+];
+const mstableStakingAdapterTokens = [
+ mtaAddress,
+ balAddress,
+ balancerMusd20Mta80Address,
+ balancerUsdc50Musd50Address,
+ balancerMusd95Mta5Address,
+ balancerWeth50Musd50Address,
+ uniswapMtaWethAddress,
+];
+const chiAdapterTokens = [
+ chiAddress,
+];
+const pickleAssetAdapterTokens = [
+ pickleSCrvJarAddress,
+ pickleRenbtcCrvJarAddress,
+ pickleThreeCrvJarV2Address,
+ pickleUniswapWethDaiJarV2Address,
+ pickleUniswapWethUsdcJarV2Address,
+ pickleUniswapWethUsdtJarV2Address,
+ pickleUniswapWethWbtcJarAddress,
+];
+const pickleStakingV1AdapterTokens = [
+ pickleAddress,
+ sCrvAddress,
+];
+const pickleStakingV2AdapterTokens = [
+ pickleAddress,
+ uniswapWethPickleAddress,
+ uniUsdtWethAddress,
+ uniUsdcWethAddress,
+ uniDaiWethAddress,
+ uniSusdWethAddress,
+ pickleUniswapWethDaiJarAddress,
+ pickleUniswapWethUsdcJarAddress,
+ pickleUniswapWethUsdtJarAddress,
+ pickleThreeCrvJarAddress,
+ pickleSCrvJarAddress,
+ pickleUniswapWethDaiJarV2Address,
+ pickleUniswapWethUsdcJarV2Address,
+ pickleUniswapWethUsdtJarV2Address,
+];
+const pieDAOPieAdapterTokens = [
+ BTCPPAddress,
+ USDPPAddress,
+ DEFIPLAddress,
+ DEFIPSAddress,
+ DEFIPPAddress,
+];
+const pieDAOStakingAdapterTokens = [
+ goughAddress,
+ balancerWeth20Dough80Address,
+ uniswapDaiDefiSAddress,
+ balancerDefiS70Weth30Address,
+];
const poolTogetherAdapterTokens = [
saiPoolAddress,
daiPoolAddress,
usdcPoolAddress,
];
+const sashimiStakingAdapterTokens = [
+ sashimiAddress,
+ uniSashimiWethAddress,
+ uniSashimiElfAddress,
+ uniElfWethAddress,
+ uniWbtcWethAddress,
+ uniUsdtWethAddress,
+ uniUsdcWethAddress,
+ uniDaiWethAddress,
+ uniLinkWethAddress,
+ uniLendWethAddress,
+ uniSnxWethAddress,
+ uniYfiWethAddress,
+];
+const sushiStakingAdapterTokens = [
+ sushiAddress,
+ sushiSushiWethAddress,
+ sushiUsdtWethAddress,
+ sushiUsdcWethAddress,
+ sushiDaiWethAddress,
+ sushiSusdWethAddress,
+ sushiUmaWethAddress,
+ sushiBandWethAddress,
+ sushiLinkWethAddress,
+ sushiAmplWethAddress,
+ sushiCompWethAddress,
+ sushiLendWethAddress,
+ sushiSnxWethAddress,
+ sushiYfiWethAddress,
+ sushiRenWethAddress,
+ sushiBaseSusdAddress,
+ sushiSrmWethAddress,
+ sushiYam2WethAddress,
+ sushiCrvWethAddress,
+];
+const swerveAdapterTokens = [
+ swUsdAddress,
+];
+const swerveStakingAdapterTokens = [
+ swUsdAddress,
+];
const synthetixAssetAdapterTokens = [
snxAddress,
+ sethUniAddress,
+ curveSnxAddress,
+ iETHAddress,
];
const synthetixDebtAdapterTokens = [
susdAddress,
];
+const uniswapV2StakingAdapterTokens = [
+ uniAddress,
+ uniDaiWethAddress,
+ uniUsdcWethAddress,
+ uniUsdcWethAddress,
+ uniWbtcWethAddress,
+];
+const yearnStakingV1AdapterTokens = [
+ yfiAddress,
+ yCrvAddress,
+ balancerDai98Yfi2Address,
+ balancerYfi2yCrv98Address,
+];
+const yearnStakingV2AdapterTokens = [
+ yfiAddress,
+ yCrvAddress,
+];
+const LinkswapStakingAdapterTokens = [
+ yflAddress,
+ yflusdAddress,
+ syflAddress,
+ wethAddress,
+ linkAddress,
+ busdAddress,
+ usdcAddress,
+ usdtAddress,
+ cfiAddress,
+ masqAddress,
+ dpiAddress,
+ celAddress,
+ yaxAddress,
+ gswapAddress,
+ lslpYflWeth,
+ lslpYflLink,
+ lslpLinkYflusd,
+ lslpYflusdWeth,
+ lslpLinkSyfl,
+ lslpSyflWeth,
+ lslpBusdLink,
+ lslpLinkUsdc,
+ lslpLinkUsdt,
+ lslpLinkCfi,
+ lslpMasqWeth,
+ lslpDpiLink,
+ lslpLinkCel,
+ lslpLinkYax,
+ lslpYaxWeth,
+ lslpLinkGswap,
+ lslpLinkAzuki,
+ lslpLinkDoki,
+];
const zrxAdapterTokens = [
zrxAddress,
];
+const tubeProtocolAdapterTokens = [
+ tubeAddress,
+];
+const mustStakingAdapterTokens = [
+ mustAddress,
+ mustStakingAddress,
+];
let protocolNames = [];
let metadata = [];
@@ -242,8 +940,9 @@ let tokenAdapters = [];
module.exports = async (deployer, network, accounts) => {
await deployer.deploy(AaveAssetAdapter, { from: accounts[0] });
await deployer.deploy(AaveDebtAdapter, { from: accounts[0] });
- adapters.push([AaveAssetAdapter.address, AaveDebtAdapter.address]);
- tokens.push([aaveAssetAdapterTokens, aaveDebtAdapterTokens]);
+ await deployer.deploy(AaveStakingAdapter, { from: accounts[0] });
+ adapters.push([AaveAssetAdapter.address, AaveDebtAdapter.address, AaveStakingAdapter.address]);
+ tokens.push([aaveAssetAdapterTokens, aaveDebtAdapterTokens, aaveStakingAdapterTokens]);
protocolNames.push('Aave');
metadata.push([
'Aave',
@@ -253,6 +952,43 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(AaveUniswapAssetAdapter, { from: accounts[0] });
+ await deployer.deploy(AaveUniswapDebtAdapter, { from: accounts[0] });
+ adapters.push([AaveUniswapAssetAdapter.address, AaveUniswapDebtAdapter.address]);
+ tokens.push([aaveUniswapAssetAdapterTokens, aaveUniswapDebtAdapterTokens]);
+ protocolNames.push('Aave • Uniswap Market');
+ metadata.push([
+ 'Aave • Uniswap Market',
+ 'Decentralized lending & borrowing protocol',
+ 'aave.com',
+ 'protocol-icons.s3.amazonaws.com/aave.png',
+ '0',
+ ]);
+
+ await deployer.deploy(AmpleforthAdapter, { from: accounts[0] });
+ adapters.push([AmpleforthAdapter.address]);
+ tokens.push([ampleforthAdapterTokens]);
+ protocolNames.push('Ampleforth');
+ metadata.push([
+ 'Ampleforth',
+ 'An adaptive money built on sound economics',
+ 'ampleforth.org',
+ 'protocol-icons.s3.amazonaws.com/ampl.png',
+ '0',
+ ]);
+
+ await deployer.deploy(AragonStakingAdapter, { from: accounts[0] });
+ adapters.push([AragonStakingAdapter.address]);
+ tokens.push([aragonStakingAdapterTokens]);
+ protocolNames.push('Aragon');
+ metadata.push([
+ 'Aragon',
+ 'ANT liquidity rewards',
+ 'liquidity.aragon.org',
+ 'protocol-icons.s3.amazonaws.com/aragon.png',
+ '0',
+ ]);
+
await deployer.deploy(BalancerAdapter, { from: accounts[0] });
adapters.push([BalancerAdapter.address]);
tokens.push([[]]);
@@ -277,6 +1013,19 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(BzxAssetAdapter, { from: accounts[0] });
+ await deployer.deploy(BzxDebtAdapter, { from: accounts[0] });
+ adapters.push([BzxAssetAdapter.address, BzxDebtAdapter.address]);
+ tokens.push([bzxAssetAdapterTokens, bzxDebtAdapterTokens]);
+ protocolNames.push('bZx');
+ metadata.push([
+ 'bZx',
+ 'Margin trading/lending and borrowing with bZx',
+ 'bzx.network',
+ 'protocol-icons.s3.amazonaws.com/TODO.png', // TODO
+ '0',
+ ]);
+
await deployer.deploy(CompoundAssetAdapter, { from: accounts[0] });
await deployer.deploy(CompoundDebtAdapter, { from: accounts[0] });
adapters.push([CompoundAssetAdapter.address, CompoundDebtAdapter.address]);
@@ -290,9 +1039,25 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(CreamAssetAdapter, { from: accounts[0] });
+ await deployer.deploy(CreamDebtAdapter, { from: accounts[0] });
+ await deployer.deploy(CreamStakingAdapter, { from: accounts[0] });
+ adapters.push([CreamAssetAdapter.address, CreamDebtAdapter.address, CreamStakingAdapter.address]);
+ tokens.push([creamAssetAdapterTokens, creamDebtAdapterTokens, creamStakingAdapterTokens]);
+ protocolNames.push('C.R.E.A.M.');
+ metadata.push([
+ 'C.R.E.A.M.',
+ 'A lending platform based on Compound Finance and exchange platform based on Balancer Labs',
+ 'cream.finance',
+ 'protocol-icons.s3.amazonaws.com/cream.png',
+ '0',
+ ]);
+
await deployer.deploy(CurveAdapter, { from: accounts[0] });
- adapters.push([CurveAdapter.address]);
- tokens.push([curveAdapterTokens]);
+ await deployer.deploy(CurveStakingAdapter, { from: accounts[0] });
+ await deployer.deploy(CurveVestingAdapter, { from: accounts[0] });
+ adapters.push([CurveAdapter.address, CurveStakingAdapter.address, CurveVestingAdapter.address]);
+ tokens.push([curveAdapterTokens, curveStakingAdapterTokens, curveVestingAdapterTokens]);
protocolNames.push('Curve');
metadata.push([
'Curve',
@@ -302,9 +1067,46 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(DdexLendingAssetAdapter, { from: accounts[0] });
+ adapters.push([DdexLendingAssetAdapter.address]);
+ tokens.push([ddexAdapterTokens]);
+ protocolNames.push('DDEX • Lending');
+ metadata.push([
+ 'DDEX • Lending',
+ 'Decentralized margin trading',
+ 'ddex.io',
+ 'protocol-icons.s3.amazonaws.com/ddex.png',
+ '0',
+ ]);
+
+ await deployer.deploy(DdexMarginAssetAdapter, { from: accounts[0] });
+ await deployer.deploy(DdexMarginDebtAdapter, { from: accounts[0] });
+ adapters.push([DdexMarginAssetAdapter.address, DdexMarginDebtAdapter.address]);
+ tokens.push([ddexAdapterTokens, ddexAdapterTokens]);
+ protocolNames.push('DDEX • Margin');
+ metadata.push([
+ 'DDEX • Margin',
+ 'Decentralized margin trading',
+ 'ddex.io',
+ 'protocol-icons.s3.amazonaws.com/ddex.png',
+ '0',
+ ]);
+
+ await deployer.deploy(DdexSpotAssetAdapter, { from: accounts[0] });
+ adapters.push([DdexSpotAssetAdapter.address]);
+ tokens.push([ddexAdapterTokens]);
+ protocolNames.push('DDEX • Spot');
+ metadata.push([
+ 'DDEX • Spot',
+ 'Decentralized margin trading',
+ 'ddex.io',
+ 'protocol-icons.s3.amazonaws.com/ddex.png',
+ '0',
+ ]);
+
await deployer.deploy(DmmAssetAdapter, { from: accounts[0] });
- adapters.push(DmmAssetAdapter.address);
- tokens.push(dmmAssetAdapterTokens);
+ adapters.push([DmmAssetAdapter.address]);
+ tokens.push([dmmAssetAdapterTokens]);
protocolNames.push('DeFi Money Market');
metadata.push([
'DeFi Money Market',
@@ -314,6 +1116,19 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(DodoAdapter, { from: accounts[0] });
+ await deployer.deploy(DodoStakingAdapter, { from: accounts[0] });
+ adapters.push([DodoAdapter.address, DodoStakingAdapter.address]);
+ tokens.push([[], []]);
+ protocolNames.push('DODO');
+ metadata.push([
+ 'DODO',
+ 'Your on-chain liquidity provider',
+ 'dodoex.io',
+ 'protocol-icons.s3.amazonaws.com/dodo.png',
+ '0',
+ ]);
+
await deployer.deploy(DyDxAssetAdapter, { from: accounts[0] });
await deployer.deploy(DyDxDebtAdapter, { from: accounts[0] });
adapters.push([DyDxAssetAdapter.address, DyDxDebtAdapter.address]);
@@ -327,21 +1142,49 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(GnosisProtocolAdapter, { from: accounts[0] });
+ adapters.push([GnosisProtocolAdapter.address]);
+ tokens.push([gnosisProtocolAdapterTokens]);
+ protocolNames.push('Gnosis Protocol');
+ metadata.push([
+ 'Gnosis Protocol',
+ 'A DEX that enables ring trades to maximize liquidity',
+ 'gnosis.io',
+ 'protocol-icons.s3.amazonaws.com/gnosis.png',
+ '0',
+ ]);
+
await deployer.deploy(IdleAdapter, { from: accounts[0] });
adapters.push([IdleAdapter.address]);
- tokens.push([idleAdapterTokens]);
- protocolNames.push('Idle');
+ tokens.push([idleBestYieldAdapterTokens]);
+ protocolNames.push('Idle • Best-Yield');
metadata.push([
- 'Idle',
- 'Yield aggregator for lending platforms',
+ 'Idle • Best-Yield',
+ 'Maximize your returns across DeFi lending protocols',
+ 'idle.finance',
+ 'protocol-icons.s3.amazonaws.com/idle.png',
+ '0',
+ ]);
+
+ await deployer.deploy(IdleAdapter, { from: accounts[0] });
+ adapters.push([IdleAdapter.address]);
+ tokens.push([idleRiskAdjustedAdapterTokens]);
+ protocolNames.push('Idle • Risk-Adjusted');
+ metadata.push([
+ 'Idle • Risk-Adjusted',
+ 'Optimize your risk exposure across DeFi lending protocols',
'idle.finance',
'protocol-icons.s3.amazonaws.com/idle.png',
'0',
]);
await deployer.deploy(IearnAdapter, { from: accounts[0] });
- adapters.push([IearnAdapter.address]);
- tokens.push([iearn2AdapterTokens]);
+ await deployer.deploy(YearnStakingV1Adapter, { from: accounts[0] });
+ await deployer.deploy(YearnStakingV2Adapter, { from: accounts[0] });
+ adapters.push(
+ [IearnAdapter.address, YearnStakingV1Adapter.address, YearnStakingV2Adapter.address],
+ );
+ tokens.push([iearn2AdapterTokens, yearnStakingV1AdapterTokens, yearnStakingV2AdapterTokens]);
protocolNames.push('iearn.finance (v2)');
metadata.push([
'iearn.finance (v2)',
@@ -363,6 +1206,82 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(LinkswapAdapter, { from: accounts[0] });
+ await deployer.deploy(LinkswapStakingAdapter, { from: accounts[0] });
+ adapters.push(
+ [LinkswapAdapter.address, LinkswapStakingAdapter.address],
+ );
+ tokens.push([LinkswapStakingAdapterTokens]);
+ protocolNames.push('LINKSWAP');
+ metadata.push([
+ 'LINKSWAP',
+ 'YF Link community-governed automated market maker',
+ 'linkswap.app',
+ 'protocol-icons.s3.amazonaws.com/yflink.png',
+ '0',
+ ]);
+
+ await deployer.deploy(HarvestStakingAdapter, { from: accounts[0] });
+ await deployer.deploy(HarvestStakingV2Adapter, { from: accounts[0] });
+ adapters.push([HarvestStakingAdapter.address, HarvestStakingV2Adapter.address]);
+ tokens.push([harvestStakingAdapterTokens, harvestStakingV2AdapterTokens]);
+ protocolNames.push('Harvest');
+ metadata.push([
+ 'Harvest',
+ 'Your hard work is about to become easier with Harvest',
+ 'harvest.finance',
+ 'protocol-icons.s3.amazonaws.com/harvest.png',
+ '0',
+ ]);
+
+ await deployer.deploy(KeeperDaoAssetAdapter, { from: accounts[0] });
+ adapters.push([KeeperDaoAssetAdapter.address]);
+ tokens.push([keeperDaoAdapterTokens]);
+ protocolNames.push('KeeperDAO');
+ metadata.push([
+ 'KeeperDAO',
+ 'An on-chain liquidity underwriter for DeFi',
+ 'keeperdao.com',
+ 'protocol-icons.s3.amazonaws.com/keeperDAO.png',
+ '0',
+ ]);
+
+ await deployer.deploy(KimchiStakingAdapter, { from: accounts[0] });
+ adapters.push([KimchiStakingAdapter.address]);
+ tokens.push([[kimchiStakingAdapterTokens]]);
+ protocolNames.push('KIMCHI');
+ metadata.push([
+ 'KIMCHI',
+ 'Farm KIMCHI by staking LP tokens',
+ 'kimchi.finance',
+ 'protocol-icons.s3.amazonaws.com/kimchi.png',
+ '0',
+ ]);
+
+ await deployer.deploy(KyberAdapter, { from: accounts[0] });
+ adapters.push([KyberAdapter.address]);
+ tokens.push([kyberAdapterTokens]);
+ protocolNames.push('KyberDAO');
+ metadata.push([
+ 'KyberDAO',
+ 'Platform that allows KNC token holders to participate in governance',
+ 'kyber.network',
+ 'protocol-icons.s3.amazonaws.com/kyber.png',
+ '0',
+ ]);
+
+ await deployer.deploy(LivepeerStakingAdapter, { from: accounts[0] });
+ adapters.push([LivepeerStakingAdapter.address]);
+ tokens.push([livepeerAdapterTokens]);
+ protocolNames.push('Livepeer');
+ metadata.push([
+ 'Livepeer',
+ 'Delegated stake based protocol for decentralized video streaming.',
+ 'livepeer.org',
+ 'protocol-icons.s3.amazonaws.com/livepeer.png',
+ '0',
+ ]);
+
await deployer.deploy(ChaiAdapter, { from: accounts[0] });
adapters.push([ChaiAdapter.address]);
tokens.push([chaiAdapterTokens]);
@@ -387,6 +1306,18 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(GovernanceAdapter, { from: accounts[0] });
+ adapters.push([GovernanceAdapter.address]);
+ tokens.push([governanceAdapterTokens]);
+ protocolNames.push('Maker Governance');
+ metadata.push([
+ 'Maker Governance',
+ 'MKR tokens locked on the MakerDAO governance contracts',
+ 'vote.makerdao.com',
+ 'protocol-icons.s3.amazonaws.com/maker.png',
+ '0',
+ ]);
+
await deployer.deploy(MCDAssetAdapter, { from: accounts[0] });
await deployer.deploy(MCDDebtAdapter, { from: accounts[0] });
adapters.push([MCDAssetAdapter.address, MCDDebtAdapter.address]);
@@ -400,6 +1331,102 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(MelonAssetAdapter, { from: accounts[0] });
+ adapters.push([MelonAssetAdapter.address]);
+ tokens.push([]);
+ protocolNames.push('Melon');
+ metadata.push([
+ 'Melon',
+ 'A protocol for decentralized on-chain asset management',
+ 'melonport.com',
+ 'protocol-icons.s3.amazonaws.com/melon.png',
+ '0',
+ ]);
+
+ await deployer.deploy(MaticStakingAdapter, { from: accounts[0] });
+ adapters.push([MaticStakingAdapter.address]);
+ tokens.push([maticStakingAdapterTokens]);
+ protocolNames.push('Matic');
+ metadata.push([
+ 'Matic',
+ 'A scaling solution for public blockchains',
+ 'matic.network',
+ 'protocol-icons.s3.amazonaws.com/matic.png',
+ '0',
+ ]);
+
+ await deployer.deploy(MstableAssetAdapter, { from: accounts[0] });
+ await deployer.deploy(MstableStakingAdapter, { from: accounts[0] });
+ adapters.push([MstableAssetAdapter.address, MstableStakingAdapter.address]);
+ tokens.push([mstableAssetAdapterTokens, mstableStakingAdapterTokens]);
+ protocolNames.push('mStable');
+ metadata.push([
+ 'mStable',
+ 'mStable unifies stablecoins, lending and swapping into one standard',
+ 'mstable.org',
+ 'protocol-icons.s3.amazonaws.com/mstable.png',
+ '0',
+ ]);
+
+ await deployer.deploy(NexusStakingAdapter, { from: accounts[0] });
+ adapters.push([NexusStakingAdapter.address]);
+ tokens.push([nexusStakingAdapterTokens]);
+ protocolNames.push('Nexus Mutual');
+ metadata.push([
+ 'Nexus Mutual',
+ 'A people-powered alternative to insurance',
+ 'nexusmutual.io',
+ 'protocol-icons.s3.amazonaws.com/nexusmutual.png',
+ '0',
+ ]);
+
+ await deployer.deploy(ChiAdapter, { from: accounts[0] });
+ adapters.push([ChiAdapter.address]);
+ tokens.push([chiAdapterTokens]);
+ protocolNames.push('Chi Gastoken by 1inch');
+ metadata.push([
+ 'Chi Gastoken by 1inch',
+ 'Next-generation Gastoken',
+ '1inch.exchange',
+ 'protocol-icons.s3.amazonaws.com/chi_token.png',
+ '0',
+ ]);
+
+ await deployer.deploy(PickleAssetAdapter, { from: accounts[0] });
+ await deployer.deploy(PickleStakingV1Adapter, { from: accounts[0] });
+ await deployer.deploy(PickleStakingV2Adapter, { from: accounts[0] });
+ adapters.push([
+ PickleAssetAdapter.address,
+ PickleStakingV1Adapter.address,
+ PickleStakingV2Adapter.address,
+ ]);
+ tokens.push([
+ pickleAssetAdapterTokens,
+ pickleStakingV1AdapterTokens,
+ pickleStakingV2AdapterTokens,
+ ]);
+ protocolNames.push('Pickle Finance');
+ metadata.push([
+ 'Pickle Finance',
+ 'Off peg bad, on peg good',
+ 'pickle.finance',
+ 'protocol-icons.s3.us-east-1.amazonaws.com/pickle.png',
+ '0',
+ ]);
+
+ await deployer.deploy(PieDAOPieAdapter, { from: accounts[0] });
+ await deployer.deploy(PieDAOStakingAdapter, { from: accounts[0] });
+ adapters.push([PieDAOPieAdapter.address, PieDAOStakingAdapter.address]);
+ tokens.push([pieDAOPieAdapterTokens, pieDAOStakingAdapterTokens]);
+ protocolNames.push('PieDAO');
+ metadata.push([
+ 'PieDAO',
+ 'The Asset Allocation DAO',
+ 'piedao.org',
+ 'protocol-icons.s3.us-east-1.amazonaws.com/piedao.png',
+ '0',
+ ]);
+
await deployer.deploy(PoolTogetherAdapter, { from: accounts[0] });
adapters.push([PoolTogetherAdapter.address]);
tokens.push([poolTogetherAdapterTokens]);
@@ -412,6 +1439,43 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(SashimiStakingAdapter, { from: accounts[0] });
+ adapters.push([SashimiStakingAdapter.address]);
+ tokens.push([[sashimiStakingAdapterTokens]]);
+ protocolNames.push('SashimiSwap');
+ metadata.push([
+ 'SashimiSwap',
+ 'Earn SASHIMI tokens by staking Uniswap V2 LP Tokens',
+ 'sashimi.cool',
+ 'protocol-icons.s3.amazonaws.com/sashimi.png',
+ '0',
+ ]);
+
+ await deployer.deploy(SushiStakingAdapter, { from: accounts[0] });
+ adapters.push([SushiStakingAdapter.address]);
+ tokens.push([[sushiStakingAdapterTokens]]);
+ protocolNames.push('SushiSwap');
+ metadata.push([
+ 'SushiSwap',
+ 'Stake Uniswap LP tokens to claim your very own yummy SUSHI!',
+ 'sushiswap.org',
+ 'protocol-icons.s3.amazonaws.com/sushi.png',
+ '0',
+ ]);
+
+ await deployer.deploy(SwerveAdapter, { from: accounts[0] });
+ await deployer.deploy(SwerveStakingAdapter, { from: accounts[0] });
+ adapters.push([SwerveAdapter.address, SwerveStakingAdapter.address]);
+ tokens.push([[swerveAdapterTokens, swerveStakingAdapterTokens]]);
+ protocolNames.push('Swerve');
+ metadata.push([
+ 'Swerve',
+ 'A fork that\'s 100% community owned and governed',
+ 'swerve.fi',
+ 'protocol-icons.s3.amazonaws.com/swerve.png',
+ '0',
+ ]);
+
await deployer.deploy(SynthetixAssetAdapter, { from: accounts[0] });
await deployer.deploy(SynthetixDebtAdapter, { from: accounts[0] });
adapters.push([SynthetixAssetAdapter.address, SynthetixDebtAdapter.address]);
@@ -426,8 +1490,9 @@ module.exports = async (deployer, network, accounts) => {
]);
await deployer.deploy(TokenSetsAdapter, { from: accounts[0] });
- adapters.push([TokenSetsAdapter.address]);
- tokens.push([[]]);
+ await deployer.deploy(TokenSetsV2Adapter, { from: accounts[0] });
+ adapters.push([TokenSetsAdapter.address, TokenSetsV2Adapter.address]);
+ tokens.push([[], []]);
protocolNames.push('TokenSets');
metadata.push([
'TokenSets',
@@ -437,6 +1502,30 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(TubeProtocolAdapter, { from: accounts[0] });
+ adapters.push([TubeProtocolAdapter.address]);
+ tokens.push([tubeProtocolAdapterTokens]);
+ protocolNames.push('Tube');
+ metadata.push([
+ 'Tube',
+ 'MUST staking contract',
+ 'cometh.io',
+ 'www.cometh.io/alembic.png',
+ '0',
+ ]);
+
+ await deployer.deploy(MustStakingAdapter, { from: accounts[0] });
+ adapters.push([MustStakingAdapter.address]);
+ tokens.push([mustStakingAdapterTokens]);
+ protocolNames.push('Staking reward');
+ metadata.push([
+ 'Staking reward',
+ 'MUST liquidity providers staking reward',
+ 'cometh.io',
+ 'www.cometh.io/alembic.png',
+ '0',
+ ]);
+
await deployer.deploy(UniswapV1Adapter, { from: accounts[0] });
adapters.push([UniswapV1Adapter.address]);
tokens.push([[]]);
@@ -449,6 +1538,19 @@ module.exports = async (deployer, network, accounts) => {
'0',
]);
+ await deployer.deploy(UniswapV2Adapter, { from: accounts[0] });
+ await deployer.deploy(UniswapV2StakingAdapter, { from: accounts[0] });
+ adapters.push([UniswapV2Adapter.address, UniswapV2StakingAdapter.address]);
+ tokens.push([[], uniswapV2StakingAdapterTokens]);
+ protocolNames.push('Uniswap V2');
+ metadata.push([
+ 'Uniswap V2',
+ 'Automated liquidity protocol',
+ 'uniswap.org',
+ 'protocol-icons.s3.amazonaws.com/Uniswap.png',
+ '0',
+ ]);
+
await deployer.deploy(ZrxAdapter, { from: accounts[0] });
adapters.push([ZrxAdapter.address]);
tokens.push([zrxAdapterTokens]);
@@ -473,6 +1575,12 @@ module.exports = async (deployer, network, accounts) => {
AaveTokenAdapter.address,
);
});
+ await deployer.deploy(AaveUniswapTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ AaveUniswapTokenAdapter.address,
+ );
+ });
await deployer.deploy(BalancerTokenAdapter, { from: accounts[0] })
.then(() => {
tokenAdapters.push(
@@ -485,6 +1593,12 @@ module.exports = async (deployer, network, accounts) => {
BancorTokenAdapter.address,
);
});
+ await deployer.deploy(BzxTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ BzxTokenAdapter.address,
+ );
+ });
await deployer.deploy(CompoundTokenAdapter, { from: accounts[0] })
.then(() => {
tokenAdapters.push(
@@ -503,6 +1617,12 @@ module.exports = async (deployer, network, accounts) => {
DmmTokenAdapter.address,
);
});
+ await deployer.deploy(DodoTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ DodoTokenAdapter.address,
+ );
+ });
await deployer.deploy(IdleTokenAdapter, { from: accounts[0] })
.then(() => {
tokenAdapters.push(
@@ -515,12 +1635,48 @@ module.exports = async (deployer, network, accounts) => {
IearnTokenAdapter.address,
);
});
+ await deployer.deploy(KeeperDaoTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ KeeperDaoTokenAdapter.address,
+ );
+ });
await deployer.deploy(ChaiTokenAdapter, { from: accounts[0] })
.then(() => {
tokenAdapters.push(
ChaiTokenAdapter.address,
);
});
+ await deployer.deploy(MelonTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ MelonTokenAdapter.address,
+ );
+ });
+ await deployer.deploy(MstableTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ MstableTokenAdapter.address,
+ );
+ });
+ await deployer.deploy(ChiTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ ChiTokenAdapter.address,
+ );
+ });
+ await deployer.deploy(PieDAOPieTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ PieDAOPieTokenAdapter.address,
+ );
+ });
+ await deployer.deploy(PickleTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ PickleTokenAdapter.address,
+ );
+ });
await deployer.deploy(PoolTogetherTokenAdapter, { from: accounts[0] })
.then(() => {
tokenAdapters.push(
@@ -533,12 +1689,30 @@ module.exports = async (deployer, network, accounts) => {
TokenSetsTokenAdapter.address,
);
});
+ await deployer.deploy(TokenSetsV2TokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ TokenSetsV2TokenAdapter.address,
+ );
+ });
await deployer.deploy(UniswapV1TokenAdapter, { from: accounts[0] })
.then(() => {
tokenAdapters.push(
UniswapV1TokenAdapter.address,
);
});
+ await deployer.deploy(UniswapV2TokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ UniswapV2TokenAdapter.address,
+ );
+ });
+ await deployer.deploy(LinkswapTokenAdapter, { from: accounts[0] })
+ .then(() => {
+ tokenAdapters.push(
+ LinkswapTokenAdapter.address,
+ );
+ });
await deployer.deploy(AdapterRegistry, { from: accounts[0] })
.then(async (registry) => {
await registry.contract.methods.addProtocols(
@@ -555,17 +1729,28 @@ module.exports = async (deployer, network, accounts) => {
[
'ERC20',
'AToken',
+ 'AToken Uniswap Market',
'Balancer pool token',
+ 'SmartToken',
+ 'iToken',
'CToken',
'Curve pool token',
'MToken',
+ 'DODO pool token',
'IdleToken',
'YToken',
+ 'KToken',
'Chai token',
+ 'MelonToken',
+ 'Masset',
+ 'Chi token',
+ 'PickleJar',
+ 'PieDAO Pie Token',
'PoolTogether pool',
'SetToken',
- 'SmartToken',
+ 'SetToken V2',
'Uniswap V1 pool token',
+ 'Uniswap V2 pool token',
],
tokenAdapters,
)
diff --git a/migrations_scripts/1_use_registry_and_add_adapters.js b/migrations_scripts/1_use_registry_and_add_adapters.js
deleted file mode 100755
index 38c3068f..00000000
--- a/migrations_scripts/1_use_registry_and_add_adapters.js
+++ /dev/null
@@ -1,577 +0,0 @@
-const AaveAssetAdapter = artifacts.require('AaveAssetAdapter');
-const AaveDebtAdapter = artifacts.require('AaveDebtAdapter');
-const BalancerAdapter = artifacts.require('BalancerAdapter');
-const BancorAdapter = artifacts.require('BancorAdapter');
-const CompoundAssetAdapter = artifacts.require('CompoundAssetAdapter');
-const CompoundDebtAdapter = artifacts.require('CompoundDebtAdapter');
-const CurveAdapter = artifacts.require('CurveAdapter');
-const DmmAssetAdapter = artifacts.require('DmmAssetAdapter');
-const DyDxAssetAdapter = artifacts.require('DyDxAssetAdapter');
-const DyDxDebtAdapter = artifacts.require('DyDxDebtAdapter');
-const IdleAdapter = artifacts.require('IdleAdapter');
-const IearnAdapter = artifacts.require('IearnAdapter');
-const ChaiAdapter = artifacts.require('ChaiAdapter');
-const DSRAdapter = artifacts.require('DSRAdapter');
-const MCDAssetAdapter = artifacts.require('MCDAssetAdapter');
-const MCDDebtAdapter = artifacts.require('MCDDebtAdapter');
-const PoolTogetherAdapter = artifacts.require('PoolTogetherAdapter');
-const SynthetixAssetAdapter = artifacts.require('SynthetixAssetAdapter');
-const SynthetixDebtAdapter = artifacts.require('SynthetixDebtAdapter');
-const TokenSetsAdapter = artifacts.require('TokenSetsAdapter');
-const UniswapV1Adapter = artifacts.require('UniswapV1Adapter');
-const ZrxAdapter = artifacts.require('ZrxAdapter');
-const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
-const AaveTokenAdapter = artifacts.require('AaveTokenAdapter');
-const BalancerTokenAdapter = artifacts.require('BalancerTokenAdapter');
-const BancorTokenAdapter = artifacts.require('BancorTokenAdapter');
-const CompoundTokenAdapter = artifacts.require('CompoundTokenAdapter');
-const CurveTokenAdapter = artifacts.require('CurveTokenAdapter');
-const DmmTokenAdapter = artifacts.require('DmmTokenAdapter');
-const IdleTokenAdapter = artifacts.require('IdleTokenAdapter');
-const IearnTokenAdapter = artifacts.require('IearnTokenAdapter');
-const ChaiTokenAdapter = artifacts.require('ChaiTokenAdapter');
-const PoolTogetherTokenAdapter = artifacts.require('PoolTogetherTokenAdapter');
-const TokenSetsTokenAdapter = artifacts.require('TokenSetsTokenAdapter');
-const UniswapV1TokenAdapter = artifacts.require('UniswapV1TokenAdapter');
-const AdapterRegistry = artifacts.require('AdapterRegistry');
-
-const aDaiAddress = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d';
-const aTusdAddress = '0x4DA9b813057D04BAef4e5800E36083717b4a0341';
-const aUsdcAddress = '0x9bA00D6856a4eDF4665BcA2C2309936572473B7E';
-const aUsdtAddress = '0x71fc860F7D3A592A4a98740e39dB31d25db65ae8';
-const aSusdAddress = '0x625aE63000f46200499120B906716420bd059240';
-const aBusdAddress = '0x6Ee0f7BB50a54AB5253dA0667B0Dc2ee526C30a8';
-const aLendAddress = '0x7D2D3688Df45Ce7C552E19c27e007673da9204B8';
-const aBatAddress = '0xE1BA0FB44CCb0D11b80F92f4f8Ed94CA3fF51D00';
-const aEthAddress = '0x3a3A65aAb0dd2A17E3F1947bA16138cd37d08c04';
-const aLinkAddress = '0xA64BD6C70Cb9051F6A9ba1F163Fdc07E0DfB5F84';
-const aKncAddress = '0x9D91BE44C06d373a8a226E1f3b146956083803eB';
-const aRepAddress = '0x71010A9D003445aC60C4e6A7017c1E89A477B438';
-const aMkrAddress = '0x7deB5e830be29F91E298ba5FF1356BB7f8146998';
-const aManaAddress = '0x6FCE4A401B6B80ACe52baAefE4421Bd188e76F6f';
-const aZrxAddress = '0x6Fb0855c404E09c47C3fBCA25f08d4E41f9F062f';
-const aSnxAddress = '0x328C4c80BC7aCa0834Db37e6600A6c49E12Da4DE';
-const aWbtcAddress = '0xFC4B8ED459e00e5400be803A9BB3954234FD50e3';
-
-const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
-const tusdAddress = '0x0000000000085d4780B73119b644AE5ecd22b376';
-const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
-const usdtAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
-const susdAddress = '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51';
-const busdAddress = '0x4Fabb145d64652a948d72533023f6E7A623C7C53';
-const lendAddress = '0x80fB784B7eD66730e8b1DBd9820aFD29931aab03';
-const batAddress = '0x0D8775F648430679A709E98d2b0Cb6250d2887EF';
-const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
-const linkAddress = '0x514910771AF9Ca656af840dff83E8264EcF986CA';
-const kncAddress = '0xdd974D5C2e2928deA5F71b9825b8b646686BD200';
-const repAddress = '0x1985365e9f78359a9B6AD760e32412f4a445E862';
-const mkrAddress = '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2';
-const manaAddress = '0x0F5D2fB29fb7d3CFeE444a200298f468908cC942';
-const zrxAddress = '0xE41d2489571d322189246DaFA5ebDe1F4699F498';
-const snxAddress = '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F';
-const wbtcAddress = '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599';
-
-const cDAIAddress = '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643';
-const cBATAddress = '0x6C8c6b02E7b2BE14d4fA6022Dfd6d75921D90E4E';
-const cETHAddress = '0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5';
-const cREPAddress = '0x158079Ee67Fce2f58472A96584A73C7Ab9AC95c1';
-const cSAIAddress = '0xF5DCe57282A584D2746FaF1593d3121Fcac444dC';
-const cZRXAddress = '0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407';
-const cUSDCAddress = '0x39AA39c021dfbaE8faC545936693aC917d5E7563';
-const cWBTCAddress = '0xC11b1268C1A384e55C48c2391d8d480264A3A7F4';
-
-const mDAIAddress = '0x06301057D77D54B6e14c7FafFB11Ffc7Cab4eaa7';
-const mETHAddress = '0xdF9307DFf0a1B57660F60f9457D32027a55ca0B2';
-const mUSDCAddress = '0x3564ad35b9E95340E5Ace2D6251dbfC76098669B';
-
-const saiAddress = '0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359';
-
-const yDAIv2 = '0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01';
-const yUSDCv2 = '0xd6aD7a6750A7593E092a9B218d66C0A814a3436e';
-const yUSDTv2 = '0x83f798e925BcD4017Eb265844FDDAbb448f1707D';
-const ySUSDv2 = '0xF61718057901F84C4eEC4339EF8f0D86D2B45600';
-const yTUSDv2 = '0x73a052500105205d34Daf004eAb301916DA8190f';
-const yWBTCv2 = '0x04Aa51bbcB46541455cCF1B8bef2ebc5d3787EC9';
-
-const yDAIv3 = '0xC2cB1040220768554cf699b0d863A3cd4324ce32';
-const yUSDCv3 = '0x26EA744E5B887E5205727f55dFBE8685e3b21951';
-const yUSDTv3 = '0xE6354ed5bC4b393a5Aad09f21c46E101e692d447';
-const yBUSDv3 = '0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE';
-
-const idleDAI = '0x10eC0D497824e342bCB0EDcE00959142aAa766dD';
-const idleUSDC = '0xeB66ACc3d011056B00ea521F8203580C2E5d3991';
-
-const ssCompoundTokenAddress = '0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2';
-const ssYTokenAddress = '0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8';
-const ssBusdTokenAddress = '0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B';
-
-const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
-
-const saiPoolAddress = '0xb7896fce748396EcFC240F5a0d3Cc92ca42D7d84';
-const daiPoolAddress = '0x29fe7D60DdF151E5b52e5FAB4f1325da6b2bD958';
-const usdcPoolAddress = '0x0034Ea9808E620A0EF79261c51AF20614B742B24';
-
-const chaiAddress = '0x06AF07097C9Eeb7fD685c692751D5C66dB49c215';
-
-const aaveAssetAdapterTokens = [
- aDaiAddress,
- aTusdAddress,
- aUsdcAddress,
- aUsdtAddress,
- aSusdAddress,
- aBusdAddress,
- aLendAddress,
- aBatAddress,
- aEthAddress,
- aLinkAddress,
- aKncAddress,
- aRepAddress,
- aMkrAddress,
- aManaAddress,
- aZrxAddress,
- aSnxAddress,
- aWbtcAddress,
-];
-const aaveDebtAdapterTokens = [
- daiAddress,
- tusdAddress,
- usdcAddress,
- usdtAddress,
- susdAddress,
- busdAddress,
- lendAddress,
- batAddress,
- ethAddress,
- linkAddress,
- kncAddress,
- repAddress,
- mkrAddress,
- manaAddress,
- zrxAddress,
- snxAddress,
- wbtcAddress,
-];
-const compoundAssetAdapterTokens = [
- cDAIAddress,
- cBATAddress,
- cETHAddress,
- cREPAddress,
- cSAIAddress,
- cZRXAddress,
- cUSDCAddress,
- cWBTCAddress,
-];
-const compoundDebtAdapterTokens = [
- daiAddress,
- batAddress,
- ethAddress,
- repAddress,
- saiAddress,
- zrxAddress,
- usdcAddress,
- wbtcAddress,
-];
-const curveAdapterTokens = [
- ssCompoundTokenAddress,
- ssYTokenAddress,
- ssBusdTokenAddress,
-];
-const dmmAssetAdapterTokens = [
- mDAIAddress,
- mETHAddress,
- mUSDCAddress,
-];
-const dydxAdapterTokens = [
- wethAddress,
- saiAddress,
- usdcAddress,
- daiAddress,
-];
-const idleAdapterTokens = [
- idleDAI,
- idleUSDC,
-];
-const iearn2AdapterTokens = [
- yDAIv2,
- yUSDCv2,
- yUSDTv2,
- ySUSDv2,
- yTUSDv2,
- yWBTCv2,
-];
-const iearn3AdapterTokens = [
- yDAIv3,
- yUSDCv3,
- yUSDTv3,
- yBUSDv3,
-];
-const dsrAdapterTokens = [
- daiAddress,
-];
-const chaiAdapterTokens = [
- chaiAddress,
-];
-const mcdAssetAdapterTokens = [
- wethAddress,
- batAddress,
-];
-const mcdDebtAdapterTokens = [
- daiAddress,
-];
-const poolTogetherAdapterTokens = [
- saiPoolAddress,
- daiPoolAddress,
- usdcPoolAddress,
-];
-const synthetixAssetAdapterTokens = [
- snxAddress,
-];
-const synthetixDebtAdapterTokens = [
- susdAddress,
-];
-const zrxAdapterTokens = [
- zrxAddress,
-];
-
-let protocolNames = [];
-let metadata = [];
-let adapters = [];
-let tokens = [];
-let tokenAdapters = [];
-
-module.exports = async (deployer, network, accounts) => {
- await deployer.deploy(AaveAssetAdapter, { from: accounts[0] });
- await deployer.deploy(AaveDebtAdapter, { from: accounts[0] });
- adapters.push([AaveAssetAdapter.address, AaveDebtAdapter.address]);
- tokens.push([aaveAssetAdapterTokens, aaveDebtAdapterTokens]);
- protocolNames.push('Aave');
- metadata.push([
- 'Aave',
- 'Decentralized lending & borrowing protocol',
- 'aave.com',
- 'protocol-icons.s3.amazonaws.com/aave.png',
- '0',
- ]);
-
- await deployer.deploy(BalancerAdapter, { from: accounts[0] });
- adapters.push([BalancerAdapter.address]);
- tokens.push([[]]);
- protocolNames.push('Balancer');
- metadata.push([
- 'Balancer',
- 'Non-custodial portfolio manager, liquidity provider, and price sensor',
- 'pools.balancer.exchange',
- 'protocol-icons.s3.amazonaws.com/balancer.png',
- '0',
- ]);
-
- await deployer.deploy(BancorAdapter, { from: accounts[0] });
- adapters.push([BancorAdapter.address]);
- tokens.push([[]]);
- protocolNames.push('Bancor');
- metadata.push([
- 'Bancor',
- 'Automated liquidity protocol',
- 'bancor.network',
- 'protocol-icons.s3.amazonaws.com/bancor.png',
- '0',
- ]);
-
- await deployer.deploy(CompoundAssetAdapter, { from: accounts[0] });
- await deployer.deploy(CompoundDebtAdapter, { from: accounts[0] });
- adapters.push([CompoundAssetAdapter.address, CompoundDebtAdapter.address]);
- tokens.push([compoundAssetAdapterTokens, compoundDebtAdapterTokens]);
- protocolNames.push('Compound');
- metadata.push([
- 'Compound',
- 'Decentralized lending & borrowing protocol',
- 'compound.finance',
- 'protocol-icons.s3.amazonaws.com/compound.png',
- '0',
- ]);
-
- await deployer.deploy(CurveAdapter, { from: accounts[0] });
- adapters.push([CurveAdapter.address]);
- tokens.push([curveAdapterTokens]);
- protocolNames.push('Curve');
- metadata.push([
- 'Curve',
- 'Exchange liquidity pool for stablecoin trading',
- 'curve.fi',
- 'protocol-icons.s3.amazonaws.com/curve.fi.png',
- '0',
- ]);
-
- await deployer.deploy(DmmAssetAdapter, { from: accounts[0] });
- adapters.push(DmmAssetAdapter.address);
- tokens.push(dmmAssetAdapterTokens);
- protocolNames.push('DeFi Money Market');
- metadata.push([
- 'DeFi Money Market',
- 'Earn interest on crypto through revenue-producing real world assets',
- 'defimoneymarket.com',
- 'protocol-icons.s3.amazonaws.com/DMM.png',
- '0',
- ]);
-
- await deployer.deploy(DyDxAssetAdapter, { from: accounts[0] });
- await deployer.deploy(DyDxDebtAdapter, { from: accounts[0] });
- adapters.push([DyDxAssetAdapter.address, DyDxDebtAdapter.address]);
- tokens.push([dydxAdapterTokens, dydxAdapterTokens]);
- protocolNames.push('dYdX');
- metadata.push([
- 'dYdX',
- 'Decentralized trading platform',
- 'dydx.exchange',
- 'protocol-icons.s3.amazonaws.com/dYdX.png',
- '0',
- ]);
-
- await deployer.deploy(IdleAdapter, { from: accounts[0] });
- adapters.push([IdleAdapter.address]);
- tokens.push([idleAdapterTokens]);
- protocolNames.push('Idle');
- metadata.push([
- 'Idle',
- 'Yield aggregator for lending platforms',
- 'idle.finance',
- 'protocol-icons.s3.amazonaws.com/idle.png',
- '0',
- ]);
-
- await deployer.deploy(IearnAdapter, { from: accounts[0] });
- adapters.push([IearnAdapter.address]);
- tokens.push([iearn2AdapterTokens]);
- protocolNames.push('iearn.finance (v2)');
- metadata.push([
- 'iearn.finance (v2)',
- 'Yield aggregator for lending platforms',
- 'iearn.finance',
- 'protocol-icons.s3.amazonaws.com/iearn.png',
- '0',
- ]);
-
- await deployer.deploy(IearnAdapter, { from: accounts[0] });
- adapters.push([IearnAdapter.address]);
- tokens.push([iearn3AdapterTokens]);
- protocolNames.push('iearn.finance (v3)');
- metadata.push([
- 'iearn.finance (v3)',
- 'Yield aggregator for lending platforms',
- 'iearn.finance',
- 'protocol-icons.s3.amazonaws.com/iearn.png',
- '0',
- ]);
-
- await deployer.deploy(ChaiAdapter, { from: accounts[0] });
- adapters.push([ChaiAdapter.address]);
- tokens.push([chaiAdapterTokens]);
- protocolNames.push('Chai');
- metadata.push([
- 'Chai',
- 'A simple ERC20 wrapper over the Dai Savings Protocol',
- 'chai.money',
- 'protocol-icons.s3.amazonaws.com/chai.png',
- '0',
- ]);
-
- await deployer.deploy(DSRAdapter, { from: accounts[0] });
- adapters.push([DSRAdapter.address]);
- tokens.push([dsrAdapterTokens]);
- protocolNames.push('Dai Savings Protocol');
- metadata.push([
- 'Dai Savings Protocol',
- 'Decentralized lending protocol',
- 'makerdao.com',
- 'protocol-icons.s3.amazonaws.com/dai.png',
- '0',
- ]);
-
- await deployer.deploy(MCDAssetAdapter, { from: accounts[0] });
- await deployer.deploy(MCDDebtAdapter, { from: accounts[0] });
- adapters.push([MCDAssetAdapter.address, MCDDebtAdapter.address]);
- tokens.push([mcdAssetAdapterTokens, mcdDebtAdapterTokens]);
- protocolNames.push('Multi-Collateral Dai');
- metadata.push([
- 'Multi-Collateral Dai',
- 'Collateralized loans on Maker',
- 'makerdao.com',
- 'protocol-icons.s3.amazonaws.com/maker.png',
- '0',
- ]);
-
- await deployer.deploy(PoolTogetherAdapter, { from: accounts[0] });
- adapters.push([PoolTogetherAdapter.address]);
- tokens.push([poolTogetherAdapterTokens]);
- protocolNames.push('PoolTogether');
- metadata.push([
- 'PoolTogether',
- 'Decentralized no-loss lottery',
- 'pooltogether.com',
- 'protocol-icons.s3.amazonaws.com/pooltogether.png',
- '0',
- ]);
-
- await deployer.deploy(SynthetixAssetAdapter, { from: accounts[0] });
- await deployer.deploy(SynthetixDebtAdapter, { from: accounts[0] });
- adapters.push([SynthetixAssetAdapter.address, SynthetixDebtAdapter.address]);
- tokens.push([synthetixAssetAdapterTokens, synthetixDebtAdapterTokens]);
- protocolNames.push('Synthetix');
- metadata.push([
- 'Synthetix',
- 'Synthetic assets protocol',
- 'synthetix.io',
- 'protocol-icons.s3.amazonaws.com/synthetix.png',
- '0',
- ]);
-
- await deployer.deploy(TokenSetsAdapter, { from: accounts[0] });
- adapters.push([TokenSetsAdapter.address]);
- tokens.push([[]]);
- protocolNames.push('TokenSets');
- metadata.push([
- 'TokenSets',
- 'Automated asset management strategies',
- 'tokensets.com',
- 'protocol-icons.s3.amazonaws.com/SET.png',
- '0',
- ]);
-
- await deployer.deploy(UniswapV1Adapter, { from: accounts[0] });
- adapters.push([UniswapV1Adapter.address]);
- tokens.push([[]]);
- protocolNames.push('Uniswap V1');
- metadata.push([
- 'Uniswap V1',
- 'Automated liquidity protocol',
- 'uniswap.org',
- 'protocol-icons.s3.amazonaws.com/Uniswap.png',
- '0',
- ]);
-
- await deployer.deploy(ZrxAdapter, { from: accounts[0] });
- adapters.push([ZrxAdapter.address]);
- tokens.push([zrxAdapterTokens]);
- protocolNames.push('0x Staking');
- metadata.push([
- '0x Staking',
- 'Liquidity rewards with ZRX',
- '0x.org/zrx/staking',
- 'protocol-icons.s3.amazonaws.com/0x-staking.png',
- '0',
- ]);
-
- await deployer.deploy(ERC20TokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- ERC20TokenAdapter.address,
- );
- });
- await deployer.deploy(AaveTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- AaveTokenAdapter.address,
- );
- });
- await deployer.deploy(BalancerTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- BalancerTokenAdapter.address,
- );
- });
- await deployer.deploy(BancorTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- BancorTokenAdapter.address,
- );
- });
- await deployer.deploy(CompoundTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- CompoundTokenAdapter.address,
- );
- });
- await deployer.deploy(CurveTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- CurveTokenAdapter.address,
- );
- });
- await deployer.deploy(DmmTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- DmmTokenAdapter.address,
- );
- });
- await deployer.deploy(IdleTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- IdleTokenAdapter.address,
- );
- });
- await deployer.deploy(IearnTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- IearnTokenAdapter.address,
- );
- });
- await deployer.deploy(ChaiTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- ChaiTokenAdapter.address,
- );
- });
- await deployer.deploy(PoolTogetherTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- PoolTogetherTokenAdapter.address,
- );
- });
- await deployer.deploy(TokenSetsTokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- TokenSetsTokenAdapter.address,
- );
- });
- await deployer.deploy(UniswapV1TokenAdapter, { from: accounts[0] })
- .then(() => {
- tokenAdapters.push(
- UniswapV1TokenAdapter.address,
- );
- });
- await AdapterRegistry.at('0x06FE76B2f432fdfEcAEf1a7d4f6C3d41B5861672')
- .then(async (registry) => {
- await registry.contract.methods.addProtocols(
- protocolNames,
- metadata,
- adapters,
- tokens,
- )
- .send({
- from: accounts[0],
- gas: '5000000',
- });
- await registry.contract.methods.addTokenAdapters(
- [
- 'ERC20',
- 'AToken',
- 'Balancer pool token',
- 'CToken',
- 'Curve pool token',
- 'MToken',
- 'IdleToken',
- 'YToken',
- 'Chai token',
- 'PoolTogether pool',
- 'SetToken',
- 'SmartToken',
- 'Uniswap V1 pool token',
- ],
- tokenAdapters,
- )
- .send({
- from: accounts[0],
- gas: '5000000',
- });
- });
-};
diff --git a/migrations_scripts/1_use_registry_and_add_deployed_adapter.js b/migrations_scripts/1_use_registry_and_add_deployed_adapter.js
deleted file mode 100755
index 56913676..00000000
--- a/migrations_scripts/1_use_registry_and_add_deployed_adapter.js
+++ /dev/null
@@ -1,48 +0,0 @@
-const AdapterRegistry = artifacts.require('AdapterRegistry');
-
-let protocolNames = [];
-let metadata = [];
-let adapters = [];
-let tokens = [];
-let tokenAdapters = [];
-
-module.exports = async (deployer, network, accounts) => {
- adapters.push(['']);
- tokens.push([dmmAssetAdapterTokens]);
- protocolNames.push('Initial protocol name');
- metadata.push([
- 'Name',
- 'Description',
- 'WebsiteURL',
- 'IconURL',
- '0',
- ]);
-
- tokenAdapters.push(
- '',
- );
-
- await AdapterRegistry.at('0x06FE76B2f432fdfEcAEf1a7d4f6C3d41B5861672')
- .then(async (registry) => {
- await registry.contract.methods.addProtocols(
- protocolNames,
- metadata,
- adapters,
- tokens,
- )
- .send({
- from: accounts[0],
- gasLimit: '5000000',
- });
- await registry.contract.methods.addTokenAdapters(
- [
- 'Initial token name',
- ],
- tokenAdapters,
- )
- .send({
- from: accounts[0],
- gasLimit: '5000000',
- });
- });
-};
diff --git a/package-lock.json b/package-lock.json
index b9f0b68d..ff18f5b9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,39 +5,35 @@
"requires": true,
"dependencies": {
"@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"requires": {
- "@babel/highlight": "^7.8.3"
+ "@babel/highlight": "^7.10.4"
}
},
"@babel/compat-data": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.6.tgz",
- "integrity": "sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q==",
- "requires": {
- "browserslist": "^4.8.5",
- "invariant": "^2.2.4",
- "semver": "^5.5.0"
- }
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz",
+ "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw=="
},
"@babel/core": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.6.tgz",
- "integrity": "sha512-Sheg7yEJD51YHAvLEV/7Uvw95AeWqYPL3Vk3zGujJKIhJ+8oLw2ALaf3hbucILhKsgSoADOvtKRJuNVdcJkOrg==",
+ "version": "7.9.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz",
+ "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==",
"requires": {
"@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.8.6",
- "@babel/helpers": "^7.8.4",
- "@babel/parser": "^7.8.6",
+ "@babel/generator": "^7.9.6",
+ "@babel/helper-module-transforms": "^7.9.0",
+ "@babel/helpers": "^7.9.6",
+ "@babel/parser": "^7.9.6",
"@babel/template": "^7.8.6",
- "@babel/traverse": "^7.8.6",
- "@babel/types": "^7.8.6",
+ "@babel/traverse": "^7.9.6",
+ "@babel/types": "^7.9.6",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.1",
- "json5": "^2.1.0",
+ "json5": "^2.1.2",
"lodash": "^4.17.13",
"resolve": "^1.3.2",
"semver": "^5.4.1",
@@ -45,308 +41,314 @@
}
},
"@babel/generator": {
- "version": "7.8.8",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
- "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz",
+ "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==",
"requires": {
- "@babel/types": "^7.8.7",
+ "@babel/types": "^7.12.11",
"jsesc": "^2.5.1",
- "lodash": "^4.17.13",
"source-map": "^0.5.0"
}
},
"@babel/helper-annotate-as-pure": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz",
- "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==",
+ "version": "7.12.10",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz",
+ "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==",
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.10"
}
},
"@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz",
- "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+ "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
"requires": {
- "@babel/helper-explode-assignable-expression": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-call-delegate": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz",
- "integrity": "sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ==",
- "requires": {
- "@babel/helper-hoist-variables": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.7"
+ "@babel/helper-explode-assignable-expression": "^7.10.4",
+ "@babel/types": "^7.10.4"
}
},
"@babel/helper-compilation-targets": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz",
- "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz",
+ "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==",
"requires": {
- "@babel/compat-data": "^7.8.6",
- "browserslist": "^4.9.1",
- "invariant": "^2.2.4",
- "levenary": "^1.1.1",
+ "@babel/compat-data": "^7.12.5",
+ "@babel/helper-validator-option": "^7.12.1",
+ "browserslist": "^4.14.5",
"semver": "^5.5.0"
}
},
"@babel/helper-create-regexp-features-plugin": {
- "version": "7.8.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz",
- "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz",
+ "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==",
"requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-regex": "^7.8.3",
- "regexpu-core": "^4.7.0"
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "regexpu-core": "^4.7.1"
}
},
"@babel/helper-define-map": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz",
- "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==",
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+ "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
"requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/types": "^7.8.3",
- "lodash": "^4.17.13"
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/types": "^7.10.5",
+ "lodash": "^4.17.19"
}
},
"@babel/helper-explode-assignable-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz",
- "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz",
+ "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==",
"requires": {
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.1"
}
},
"@babel/helper-function-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
- "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz",
+ "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==",
"requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/helper-get-function-arity": "^7.12.10",
+ "@babel/template": "^7.12.7",
+ "@babel/types": "^7.12.11"
}
},
"@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+ "version": "7.12.10",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz",
+ "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==",
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.10"
}
},
"@babel/helper-hoist-variables": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz",
- "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+ "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.10.4"
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
- "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
+ "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.7"
}
},
"@babel/helper-module-imports": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
- "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
+ "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.5"
}
},
"@babel/helper-module-transforms": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz",
- "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
"requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.6",
- "@babel/helper-simple-access": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/template": "^7.8.6",
- "@babel/types": "^7.8.6",
- "lodash": "^4.17.13"
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
}
},
"@babel/helper-optimise-call-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
- "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+ "version": "7.12.10",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz",
+ "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==",
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.10"
}
},
"@babel/helper-plugin-utils": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
- "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ=="
- },
- "@babel/helper-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
- "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
- "requires": {
- "lodash": "^4.17.13"
- }
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
},
"@babel/helper-remap-async-to-generator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
- "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz",
+ "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==",
"requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-wrap-function": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-wrap-function": "^7.10.4",
+ "@babel/types": "^7.12.1"
}
},
"@babel/helper-replace-supers": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
- "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz",
+ "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==",
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.6",
- "@babel/types": "^7.8.6"
+ "@babel/helper-member-expression-to-functions": "^7.12.7",
+ "@babel/helper-optimise-call-expression": "^7.12.10",
+ "@babel/traverse": "^7.12.10",
+ "@babel/types": "^7.12.11"
}
},
"@babel/helper-simple-access": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
- "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+ "requires": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
+ "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
"requires": {
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.1"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz",
+ "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==",
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.11"
}
},
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz",
+ "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw=="
+ },
"@babel/helper-wrap-function": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
- "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz",
+ "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==",
"requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
}
},
"@babel/helpers": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz",
- "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
+ "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
"requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.4",
- "@babel/types": "^7.8.3"
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
}
},
"@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
- "esutils": "^2.0.2",
"js-tokens": "^4.0.0"
}
},
"@babel/parser": {
- "version": "7.8.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
- "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA=="
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz",
+ "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg=="
},
"@babel/plugin-proposal-async-generator-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
- "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
+ "version": "7.12.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz",
+ "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-remap-async-to-generator": "^7.8.3",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.12.1",
"@babel/plugin-syntax-async-generators": "^7.8.0"
}
},
"@babel/plugin-proposal-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz",
+ "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
+ "@babel/helper-plugin-utils": "^7.10.4",
"@babel/plugin-syntax-dynamic-import": "^7.8.0"
}
},
"@babel/plugin-proposal-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
- "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz",
+ "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
+ "@babel/helper-plugin-utils": "^7.10.4",
"@babel/plugin-syntax-json-strings": "^7.8.0"
}
},
"@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz",
+ "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
+ "@babel/helper-plugin-utils": "^7.10.4",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
}
},
+ "@babel/plugin-proposal-numeric-separator": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz",
+ "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+ "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.0"
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-transform-parameters": "^7.12.1"
}
},
"@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz",
+ "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
+ "@babel/helper-plugin-utils": "^7.10.4",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
}
},
"@babel/plugin-proposal-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz",
+ "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
"@babel/plugin-syntax-optional-chaining": "^7.8.0"
}
},
"@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.8.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz",
- "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz",
+ "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==",
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.8",
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-syntax-async-generators": {
@@ -381,6 +383,14 @@
"@babel/helper-plugin-utils": "^7.8.0"
}
},
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
"@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
@@ -406,310 +416,319 @@
}
},
"@babel/plugin-syntax-top-level-await": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz",
- "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz",
+ "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-arrow-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz",
- "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz",
+ "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-async-to-generator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz",
- "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz",
+ "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==",
"requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-remap-async-to-generator": "^7.8.3"
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.12.1"
}
},
"@babel/plugin-transform-block-scoped-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz",
- "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz",
+ "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz",
- "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==",
+ "version": "7.12.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz",
+ "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "lodash": "^4.17.13"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-classes": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz",
- "integrity": "sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-define-map": "^7.8.3",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.6",
- "@babel/helper-split-export-declaration": "^7.8.3",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz",
+ "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-define-map": "^7.10.4",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.10.4",
"globals": "^11.1.0"
}
},
"@babel/plugin-transform-computed-properties": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz",
- "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz",
+ "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-destructuring": {
- "version": "7.8.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz",
- "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz",
+ "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-dotall-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz",
- "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz",
+ "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==",
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-duplicate-keys": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz",
- "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz",
+ "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-exponentiation-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz",
- "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz",
+ "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==",
"requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-for-of": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz",
- "integrity": "sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz",
+ "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-function-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz",
- "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz",
+ "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==",
"requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz",
- "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz",
+ "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-member-expression-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz",
- "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz",
+ "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-modules-amd": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz",
- "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz",
+ "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==",
"requires": {
- "@babel/helper-module-transforms": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz",
- "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz",
+ "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==",
"requires": {
- "@babel/helper-module-transforms": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-simple-access": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-simple-access": "^7.12.1",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-systemjs": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz",
- "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz",
+ "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==",
"requires": {
- "@babel/helper-hoist-variables": "^7.8.3",
- "@babel/helper-module-transforms": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
+ "@babel/helper-hoist-variables": "^7.10.4",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-umd": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz",
- "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz",
+ "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==",
"requires": {
- "@babel/helper-module-transforms": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz",
- "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz",
+ "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==",
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1"
}
},
"@babel/plugin-transform-new-target": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz",
- "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz",
+ "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-object-super": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz",
- "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz",
+ "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.12.1"
}
},
"@babel/plugin-transform-parameters": {
- "version": "7.8.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz",
- "integrity": "sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz",
+ "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==",
"requires": {
- "@babel/helper-call-delegate": "^7.8.7",
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-property-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz",
- "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz",
+ "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-regenerator": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz",
- "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz",
+ "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==",
"requires": {
"regenerator-transform": "^0.14.2"
}
},
"@babel/plugin-transform-reserved-words": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz",
- "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz",
+ "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-runtime": {
+ "version": "7.12.10",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz",
+ "integrity": "sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-module-imports": "^7.12.5",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "semver": "^5.5.1"
}
},
"@babel/plugin-transform-shorthand-properties": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz",
- "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz",
+ "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz",
- "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz",
+ "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
}
},
"@babel/plugin-transform-sticky-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz",
- "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz",
+ "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-regex": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-template-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz",
- "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz",
+ "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==",
"requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-typeof-symbol": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz",
- "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==",
+ "version": "7.12.10",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz",
+ "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==",
"requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/plugin-transform-unicode-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz",
- "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz",
+ "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==",
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
}
},
"@babel/preset-env": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.6.tgz",
- "integrity": "sha512-M5u8llV9DIVXBFB/ArIpqJuvXpO+ymxcJ6e8ZAmzeK3sQeBNOD1y+rHvHCGG4TlEmsNpIrdecsHGHT8ZCoOSJg==",
+ "version": "7.9.6",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz",
+ "integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==",
"requires": {
- "@babel/compat-data": "^7.8.6",
- "@babel/helper-compilation-targets": "^7.8.6",
+ "@babel/compat-data": "^7.9.6",
+ "@babel/helper-compilation-targets": "^7.9.6",
"@babel/helper-module-imports": "^7.8.3",
"@babel/helper-plugin-utils": "^7.8.3",
"@babel/plugin-proposal-async-generator-functions": "^7.8.3",
"@babel/plugin-proposal-dynamic-import": "^7.8.3",
"@babel/plugin-proposal-json-strings": "^7.8.3",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-proposal-object-rest-spread": "^7.8.3",
+ "@babel/plugin-proposal-numeric-separator": "^7.8.3",
+ "@babel/plugin-proposal-object-rest-spread": "^7.9.6",
"@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
- "@babel/plugin-proposal-optional-chaining": "^7.8.3",
+ "@babel/plugin-proposal-optional-chaining": "^7.9.0",
"@babel/plugin-proposal-unicode-property-regex": "^7.8.3",
"@babel/plugin-syntax-async-generators": "^7.8.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.0",
"@babel/plugin-syntax-json-strings": "^7.8.0",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.0",
"@babel/plugin-syntax-object-rest-spread": "^7.8.0",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
"@babel/plugin-syntax-optional-chaining": "^7.8.0",
@@ -718,26 +737,26 @@
"@babel/plugin-transform-async-to-generator": "^7.8.3",
"@babel/plugin-transform-block-scoped-functions": "^7.8.3",
"@babel/plugin-transform-block-scoping": "^7.8.3",
- "@babel/plugin-transform-classes": "^7.8.6",
+ "@babel/plugin-transform-classes": "^7.9.5",
"@babel/plugin-transform-computed-properties": "^7.8.3",
- "@babel/plugin-transform-destructuring": "^7.8.3",
+ "@babel/plugin-transform-destructuring": "^7.9.5",
"@babel/plugin-transform-dotall-regex": "^7.8.3",
"@babel/plugin-transform-duplicate-keys": "^7.8.3",
"@babel/plugin-transform-exponentiation-operator": "^7.8.3",
- "@babel/plugin-transform-for-of": "^7.8.6",
+ "@babel/plugin-transform-for-of": "^7.9.0",
"@babel/plugin-transform-function-name": "^7.8.3",
"@babel/plugin-transform-literals": "^7.8.3",
"@babel/plugin-transform-member-expression-literals": "^7.8.3",
- "@babel/plugin-transform-modules-amd": "^7.8.3",
- "@babel/plugin-transform-modules-commonjs": "^7.8.3",
- "@babel/plugin-transform-modules-systemjs": "^7.8.3",
- "@babel/plugin-transform-modules-umd": "^7.8.3",
+ "@babel/plugin-transform-modules-amd": "^7.9.6",
+ "@babel/plugin-transform-modules-commonjs": "^7.9.6",
+ "@babel/plugin-transform-modules-systemjs": "^7.9.6",
+ "@babel/plugin-transform-modules-umd": "^7.9.0",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
"@babel/plugin-transform-new-target": "^7.8.3",
"@babel/plugin-transform-object-super": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.8.4",
+ "@babel/plugin-transform-parameters": "^7.9.5",
"@babel/plugin-transform-property-literals": "^7.8.3",
- "@babel/plugin-transform-regenerator": "^7.8.3",
+ "@babel/plugin-transform-regenerator": "^7.8.7",
"@babel/plugin-transform-reserved-words": "^7.8.3",
"@babel/plugin-transform-shorthand-properties": "^7.8.3",
"@babel/plugin-transform-spread": "^7.8.3",
@@ -745,18 +764,31 @@
"@babel/plugin-transform-template-literals": "^7.8.3",
"@babel/plugin-transform-typeof-symbol": "^7.8.4",
"@babel/plugin-transform-unicode-regex": "^7.8.3",
- "@babel/types": "^7.8.6",
- "browserslist": "^4.8.5",
+ "@babel/preset-modules": "^0.1.3",
+ "@babel/types": "^7.9.6",
+ "browserslist": "^4.11.1",
"core-js-compat": "^3.6.2",
"invariant": "^2.2.2",
"levenary": "^1.1.1",
"semver": "^5.5.0"
}
},
+ "@babel/preset-modules": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ }
+ },
"@babel/register": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.8.6.tgz",
- "integrity": "sha512-7IDO93fuRsbyml7bAafBQb3RcBGlCpU4hh5wADA2LJEEcYk92WkwFZ0pHyIi2fb5Auoz1714abETdZKCOxN0CQ==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.9.0.tgz",
+ "integrity": "sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q==",
"requires": {
"find-cache-dir": "^2.0.0",
"lodash": "^4.17.13",
@@ -766,53 +798,46 @@
}
},
"@babel/runtime": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz",
- "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
+ "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
"requires": {
"regenerator-runtime": "^0.13.4"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
}
},
"@babel/template": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
- "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
+ "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
"requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.6",
- "@babel/types": "^7.8.6"
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7"
}
},
"@babel/traverse": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
- "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.8.6",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.8.6",
- "@babel/types": "^7.8.6",
+ "version": "7.12.12",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz",
+ "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==",
+ "requires": {
+ "@babel/code-frame": "^7.12.11",
+ "@babel/generator": "^7.12.11",
+ "@babel/helper-function-name": "^7.12.11",
+ "@babel/helper-split-export-declaration": "^7.12.11",
+ "@babel/parser": "^7.12.11",
+ "@babel/types": "^7.12.12",
"debug": "^4.1.0",
"globals": "^11.1.0",
- "lodash": "^4.17.13"
+ "lodash": "^4.17.19"
}
},
"@babel/types": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
- "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
+ "version": "7.12.12",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz",
+ "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==",
"requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.17.13",
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
@@ -844,171 +869,249 @@
"url-join": "^4.0.0"
},
"dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
- },
"mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "0.0.8"
+ "minimist": "^1.2.5"
}
}
}
},
"@ethersproject/abi": {
- "version": "5.0.0-beta.150",
- "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.150.tgz",
- "integrity": "sha512-nr1MNiuVeCP8aRJQbyUHa56DdxUhwxcMv8MhggyYAm2iWroJ9aW7siAma47HoQxrVxrJwi1H6rqD7vOc+eNl7g==",
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.10.tgz",
+ "integrity": "sha512-cfC3lGgotfxX3SMri4+CisOPwignoj/QGHW9J29spC4R4Qqcnk/SYuVkPFBMdLbvBp3f/pGiVqPNwont0TSXhg==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/address": "^5.0.9",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/constants": "^5.0.8",
+ "@ethersproject/hash": "^5.0.10",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/strings": "^5.0.8"
+ }
+ },
+ "@ethersproject/abstract-provider": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.8.tgz",
+ "integrity": "sha512-fqJXkewcGdi8LogKMgRyzc/Ls2js07yor7+g9KfPs09uPOcQLg7cc34JN+lk34HH9gg2HU0DIA5797ZR8znkfw==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/networks": "^5.0.7",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/transactions": "^5.0.9",
+ "@ethersproject/web": "^5.0.12"
+ }
+ },
+ "@ethersproject/abstract-signer": {
+ "version": "5.0.11",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.11.tgz",
+ "integrity": "sha512-RKOgPSEYafknA62SrD3OCK42AllHE4YBfKYXyQeM+sBP7Nq3X5FpzeoY4uzC43P4wIhmNoTHCKQuwnX7fBqb6Q==",
"dev": true,
"requires": {
- "@ethersproject/address": ">=5.0.0-beta.128",
- "@ethersproject/bignumber": ">=5.0.0-beta.130",
- "@ethersproject/bytes": ">=5.0.0-beta.129",
- "@ethersproject/constants": ">=5.0.0-beta.128",
- "@ethersproject/hash": ">=5.0.0-beta.128",
- "@ethersproject/keccak256": ">=5.0.0-beta.127",
- "@ethersproject/logger": ">=5.0.0-beta.129",
- "@ethersproject/properties": ">=5.0.0-beta.131",
- "@ethersproject/strings": ">=5.0.0-beta.130"
+ "@ethersproject/abstract-provider": "^5.0.8",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7"
}
},
"@ethersproject/address": {
- "version": "5.0.0-beta.134",
- "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.0-beta.134.tgz",
- "integrity": "sha512-FHhUVJTUIg2pXvOOhIt8sB1cQbcwrzZKzf9CPV7JM1auli20nGoYhyMFYGK7u++GXzTMJduIkU1OwlIBupewDw==",
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.9.tgz",
+ "integrity": "sha512-gKkmbZDMyGbVjr8nA5P0md1GgESqSGH7ILIrDidPdNXBl4adqbuA3OAuZx/O2oGpL6PtJ9BDa0kHheZ1ToHU3w==",
"dev": true,
"requires": {
- "@ethersproject/bignumber": ">=5.0.0-beta.130",
- "@ethersproject/bytes": ">=5.0.0-beta.129",
- "@ethersproject/keccak256": ">=5.0.0-beta.127",
- "@ethersproject/logger": ">=5.0.0-beta.129",
- "@ethersproject/rlp": ">=5.0.0-beta.126",
- "bn.js": "^4.4.0"
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/rlp": "^5.0.7"
+ }
+ },
+ "@ethersproject/base64": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.7.tgz",
+ "integrity": "sha512-S5oh5DVfCo06xwJXT8fQC68mvJfgScTl2AXvbYMsHNfIBTDb084Wx4iA9MNlEReOv6HulkS+gyrUM/j3514rSw==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9"
}
},
"@ethersproject/bignumber": {
- "version": "5.0.0-beta.137",
- "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.0-beta.137.tgz",
- "integrity": "sha512-X96uhPzTkw4TSs4ZT8kCAVuJP/j7zi6pL1RO7CfY3f5Alg+cA1Ngpv+XjGQOau1RWrLl+qReGMaJgNxd9U9svw==",
+ "version": "5.0.13",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.13.tgz",
+ "integrity": "sha512-b89bX5li6aK492yuPP5mPgRVgIxxBP7ksaBtKX5QQBsrZTpNOjf/MR4CjcUrAw8g+RQuD6kap9lPjFgY4U1/5A==",
"dev": true,
"requires": {
- "@ethersproject/bytes": ">=5.0.0-beta.129",
- "@ethersproject/logger": ">=5.0.0-beta.129",
- "@ethersproject/properties": ">=5.0.0-beta.131",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
"bn.js": "^4.4.0"
}
},
"@ethersproject/bytes": {
- "version": "5.0.0-beta.137",
- "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.0-beta.137.tgz",
- "integrity": "sha512-uBwchZzGP912Wcani6vM7RLtsnN69Uc9WTLvewsniKrpHpSx0/k33WUcQVosmkwPgUtqflKyGjcIqaea1Z9WHw==",
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.9.tgz",
+ "integrity": "sha512-k+17ZViDtAugC0s7HM6rdsTWEdIYII4RPCDkPEuxKc6i40Bs+m6tjRAtCECX06wKZnrEoR9pjOJRXHJ/VLoOcA==",
"dev": true,
"requires": {
- "@ethersproject/logger": ">=5.0.0-beta.129"
+ "@ethersproject/logger": "^5.0.8"
}
},
"@ethersproject/constants": {
- "version": "5.0.0-beta.133",
- "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.0-beta.133.tgz",
- "integrity": "sha512-VCTpk3AF00mlWQw1vg+fI6qCo0qO5EVWK574t4HNBKW6X748jc9UJPryKUz9JgZ64ZQupyLM92wHilsG/YTpNQ==",
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.8.tgz",
+ "integrity": "sha512-sCc73pFBsl59eDfoQR5OCEZCRv5b0iywadunti6MQIr5lt3XpwxK1Iuzd8XSFO02N9jUifvuZRrt0cY0+NBgTg==",
"dev": true,
"requires": {
- "@ethersproject/bignumber": ">=5.0.0-beta.130"
+ "@ethersproject/bignumber": "^5.0.13"
}
},
"@ethersproject/hash": {
- "version": "5.0.0-beta.133",
- "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.0-beta.133.tgz",
- "integrity": "sha512-tfF11QxFlJCy92rMtUZ0kImchWhlYXkN5Gj5cYfTcCdWEUKwNq1LljDnlrjV2JabO6s5enb8uiUj4RBTo2+Rgw==",
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.10.tgz",
+ "integrity": "sha512-Tf0bvs6YFhw28LuHnhlDWyr0xfcDxSXdwM4TcskeBbmXVSKLv3bJQEEEBFUcRX0fJuslR3gCVySEaSh7vuMx5w==",
"dev": true,
"requires": {
- "@ethersproject/bytes": ">=5.0.0-beta.129",
- "@ethersproject/keccak256": ">=5.0.0-beta.127",
- "@ethersproject/logger": ">=5.0.0-beta.129",
- "@ethersproject/strings": ">=5.0.0-beta.130"
+ "@ethersproject/abstract-signer": "^5.0.10",
+ "@ethersproject/address": "^5.0.9",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/strings": "^5.0.8"
}
},
"@ethersproject/keccak256": {
- "version": "5.0.0-beta.131",
- "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.0-beta.131.tgz",
- "integrity": "sha512-KQnqMwGV0IMOjAr/UTFO8DuLrmN1uaMvcV3zh9hiXhh3rCuY+WXdeUh49w1VQ94kBKmaP0qfGb7z4SdhUWUHjw==",
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.7.tgz",
+ "integrity": "sha512-zpUBmofWvx9PGfc7IICobgFQSgNmTOGTGLUxSYqZzY/T+b4y/2o5eqf/GGmD7qnTGzKQ42YlLNo+LeDP2qe55g==",
"dev": true,
"requires": {
- "@ethersproject/bytes": ">=5.0.0-beta.129",
+ "@ethersproject/bytes": "^5.0.9",
"js-sha3": "0.5.7"
}
},
"@ethersproject/logger": {
- "version": "5.0.0-beta.136",
- "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.0-beta.136.tgz",
- "integrity": "sha512-baWK/4ccsVcyUU20nhp7k+hoRYsiaOfURYlyvQCoUUFKD3mpSRQCH42wxCosZZSCWz4rTHgASLQDdKkBtNVz1w==",
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.8.tgz",
+ "integrity": "sha512-SkJCTaVTnaZ3/ieLF5pVftxGEFX56pTH+f2Slrpv7cU0TNpUZNib84QQdukd++sWUp/S7j5t5NW+WegbXd4U/A==",
"dev": true
},
+ "@ethersproject/networks": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.7.tgz",
+ "integrity": "sha512-dI14QATndIcUgcCBL1c5vUr/YsI5cCHLN81rF7PU+yS7Xgp2/Rzbr9+YqpC6NBXHFUASjh6GpKqsVMpufAL0BQ==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
"@ethersproject/properties": {
- "version": "5.0.0-beta.138",
- "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.0-beta.138.tgz",
- "integrity": "sha512-vLVftNTxonJ0SkkcMcpXHN9pABD84clh+Cz3TV79qvh+lc0MFX3dnYL1JinBdFnqLPXU9vw2LbTrBhwQY8bzCQ==",
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.7.tgz",
+ "integrity": "sha512-812H1Rus2vjw0zbasfDI1GLNPDsoyX1pYqiCgaR1BuyKxUTbwcH1B+214l6VGe1v+F6iEVb7WjIwMjKhb4EUsg==",
"dev": true,
"requires": {
- "@ethersproject/logger": ">=5.0.0-beta.129"
+ "@ethersproject/logger": "^5.0.8"
}
},
"@ethersproject/rlp": {
- "version": "5.0.0-beta.132",
- "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.0-beta.132.tgz",
- "integrity": "sha512-P2oZkSMMazvMB0OaOM9GJnmLzHHSeCKqOp9bPAAY/rb65ICdtNjQMRYhOwinBFabrdV2z5TKWpwA9KIBkI0rTg==",
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.7.tgz",
+ "integrity": "sha512-ulUTVEuV7PT4jJTPpfhRHK57tkLEDEY9XSYJtrSNHOqdwMvH0z7BM2AKIMq4LVDlnu4YZASdKrkFGEIO712V9w==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.8.tgz",
+ "integrity": "sha512-YKxQM45eDa6WAD+s3QZPdm1uW1MutzVuyoepdRRVmMJ8qkk7iOiIhUkZwqKLNxKzEJijt/82ycuOREc9WBNAKg==",
"dev": true,
"requires": {
- "@ethersproject/bytes": ">=5.0.0-beta.129",
- "@ethersproject/logger": ">=5.0.0-beta.129"
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "elliptic": "6.5.3"
}
},
"@ethersproject/strings": {
- "version": "5.0.0-beta.136",
- "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.0-beta.136.tgz",
- "integrity": "sha512-Hb9RvTrgGcOavHvtQZz+AuijB79BO3g1cfF2MeMfCU9ID4j3mbZv/olzDMS2pK9r4aERJpAS94AmlWzCgoY2LQ==",
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.8.tgz",
+ "integrity": "sha512-5IsdXf8tMY8QuHl8vTLnk9ehXDDm6x9FB9S9Og5IA1GYhLe5ZewydXSjlJlsqU2t9HRbfv97OJZV/pX8DVA/Hw==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/constants": "^5.0.8",
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.9.tgz",
+ "integrity": "sha512-0Fu1yhdFBkrbMjenEr+39tmDxuHmaw0pe9Jb18XuKoItj7Z3p7+UzdHLr2S/okvHDHYPbZE5gtANDdQ3ZL1nBA==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/address": "^5.0.9",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/constants": "^5.0.8",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/rlp": "^5.0.7",
+ "@ethersproject/signing-key": "^5.0.8"
+ }
+ },
+ "@ethersproject/web": {
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.12.tgz",
+ "integrity": "sha512-gVxS5iW0bgidZ76kr7LsTxj4uzN5XpCLzvZrLp8TP+4YgxHfCeetFyQkRPgBEAJdNrexdSBayvyJvzGvOq0O8g==",
"dev": true,
"requires": {
- "@ethersproject/bytes": ">=5.0.0-beta.129",
- "@ethersproject/constants": ">=5.0.0-beta.128",
- "@ethersproject/logger": ">=5.0.0-beta.129"
+ "@ethersproject/base64": "^5.0.7",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/strings": "^5.0.8"
}
},
"@nodelib/fs.scandir": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
- "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+ "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
"dev": true,
"requires": {
- "@nodelib/fs.stat": "2.0.3",
+ "@nodelib/fs.stat": "2.0.4",
"run-parallel": "^1.1.9"
}
},
"@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+ "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
"dev": true
},
"@nodelib/fs.walk": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
- "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+ "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
"dev": true,
"requires": {
- "@nodelib/fs.scandir": "2.1.3",
+ "@nodelib/fs.scandir": "2.1.4",
"fastq": "^1.6.0"
}
},
@@ -1032,15 +1135,15 @@
}
},
"@truffle/error": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.7.tgz",
- "integrity": "sha512-UIfVKsXSXocKnn5+RNklUXNoGd/JVj7V8KmC48TQzmjU33HQI86PX0JDS7SpHMHasI3w9X//1q7Lu7nZtj3Zzg==",
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.11.tgz",
+ "integrity": "sha512-ju6TucjlJkfYMmdraYY/IBJaFb+Sa+huhYtOoyOJ+G29KcgytUVnDzKGwC7Kgk6IsxQMm62Mc1E0GZzFbGGipw==",
"dev": true
},
"@truffle/hdwallet-provider": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-1.0.34.tgz",
- "integrity": "sha512-sy7sismdclvzWQmHDjElqPGoU1+ff4w3nODKqBpauacAYpWngu865CrtgRNnETZ1c90zDElU41V6yWrUgKupAQ==",
+ "version": "1.0.35",
+ "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-1.0.35.tgz",
+ "integrity": "sha512-Jn/aAy4A2ulWpVPPBEhXjWIifosfLdjqhMwlEs8PgWLdhf3kOCfKYchqoOYZvMJ+PjO8qQ7q9NyfrQPJHZegrA==",
"requires": {
"any-promise": "^1.3.0",
"bindings": "^1.5.0",
@@ -1049,27 +1152,120 @@
"ethereumjs-tx": "^1.0.0",
"ethereumjs-util": "^6.1.0",
"ethereumjs-wallet": "^0.6.3",
- "source-map-support": "^0.5.16",
+ "source-map-support": "^0.5.19",
"web3": "1.2.1",
"web3-provider-engine": "git+https://github.com/trufflesuite/provider-engine.git#web3-one"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "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"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "web3-provider-engine": {
+ "version": "git+https://github.com/trufflesuite/provider-engine.git#9694f5b4e5500651bd2ff689df8529bb5cf6b96f",
+ "from": "git+https://github.com/trufflesuite/provider-engine.git#web3-one",
+ "requires": {
+ "async": "^2.5.0",
+ "backoff": "^2.5.0",
+ "clone": "^2.0.0",
+ "cross-fetch": "^2.1.0",
+ "eth-block-tracker": "^4.2.0",
+ "eth-json-rpc-filters": "^4.0.2",
+ "eth-json-rpc-infura": "^3.1.0",
+ "eth-json-rpc-middleware": "^4.1.1",
+ "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"
+ },
+ "dependencies": {
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ }
+ }
+ },
+ "ws": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
+ "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
+ "requires": {
+ "async-limiter": "~1.0.0"
+ }
+ }
}
},
"@truffle/interface-adapter": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.3.3.tgz",
- "integrity": "sha512-l3I4WFTfnBSIfG96IOBRtAIE6AHDAxcOUJE7W5zh9hocQwzQlGWc2yEyyTcLa0656TTM8RxaZZ2S/KdHHMvCaw==",
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.18.tgz",
+ "integrity": "sha512-P9JVSYD/CX3V+NgTWu+Bf71sLh8pMwrCpbiYRB93pRw/1H3ZTvt5iDC2MVvVxCs8FkSiy4OZzQK/DJ8+hXAmYw==",
"dev": true,
"requires": {
"bn.js": "^4.11.8",
"ethers": "^4.0.32",
- "lodash": "^4.17.13",
- "web3": "1.2.2"
+ "source-map-support": "^0.5.19",
+ "web3": "1.2.9"
},
"dependencies": {
+ "@ethersproject/abi": {
+ "version": "5.0.0-beta.153",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz",
+ "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/address": ">=5.0.0-beta.128",
+ "@ethersproject/bignumber": ">=5.0.0-beta.130",
+ "@ethersproject/bytes": ">=5.0.0-beta.129",
+ "@ethersproject/constants": ">=5.0.0-beta.128",
+ "@ethersproject/hash": ">=5.0.0-beta.128",
+ "@ethersproject/keccak256": ">=5.0.0-beta.127",
+ "@ethersproject/logger": ">=5.0.0-beta.129",
+ "@ethersproject/properties": ">=5.0.0-beta.131",
+ "@ethersproject/strings": ">=5.0.0-beta.130"
+ }
+ },
"@types/node": {
- "version": "12.12.36",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.36.tgz",
- "integrity": "sha512-hmmypvyO/uTLFYCYu6Hlb3ydeJ11vXRxg8/WJ0E3wvwmPO0y47VqnfmXFVuWlysO0Zyj+je1Y33rQeuYkZ51GQ==",
+ "version": "10.17.51",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz",
+ "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==",
"dev": true
},
"aes-js": {
@@ -1078,15 +1274,13 @@
"integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=",
"dev": true
},
- "eth-lib": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
- "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=",
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "xhr-request-promise": "^0.1.2"
+ "ms": "2.0.0"
}
},
"ethereumjs-tx": {
@@ -1100,14 +1294,14 @@
}
},
"ethers": {
- "version": "4.0.46",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.46.tgz",
- "integrity": "sha512-/dPMzzpInhtiip4hKFvsDiJKeRk64IhyA+Po7CtNXneQFSOCYXg8eBFt+jXbxUQyApgWnWOtYxWdfn9+CvvxDA==",
+ "version": "4.0.48",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz",
+ "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==",
"dev": true,
"requires": {
"aes-js": "3.0.0",
"bn.js": "^4.4.0",
- "elliptic": "6.5.2",
+ "elliptic": "6.5.3",
"hash.js": "1.1.3",
"js-sha3": "0.5.7",
"scrypt-js": "2.0.4",
@@ -1116,6 +1310,12 @@
"xmlhttprequest": "1.8.0"
}
},
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
"hash.js": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
@@ -1126,6 +1326,24 @@
"minimalistic-assert": "^1.0.0"
}
},
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "p-cancelable": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
+ "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
"scrypt-js": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz",
@@ -1138,216 +1356,246 @@
"integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=",
"dev": true
},
- "uuid": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
- "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=",
- "dev": true
- },
- "web3": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz",
- "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==",
+ "swarm-js": {
+ "version": "0.1.40",
+ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz",
+ "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==",
"dev": true,
"requires": {
- "@types/node": "^12.6.1",
- "web3-bzz": "1.2.2",
- "web3-core": "1.2.2",
- "web3-eth": "1.2.2",
- "web3-eth-personal": "1.2.2",
- "web3-net": "1.2.2",
- "web3-shh": "1.2.2",
- "web3-utils": "1.2.2"
- }
- },
- "web3-bzz": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.2.tgz",
- "integrity": "sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA==",
+ "bluebird": "^3.5.0",
+ "buffer": "^5.0.5",
+ "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": "^1.0.1"
+ },
+ "dependencies": {
+ "got": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
+ "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+ "dev": true
+ }
+ }
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ },
+ "uuid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
+ "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=",
+ "dev": true
+ },
+ "web3": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.9.tgz",
+ "integrity": "sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA==",
+ "dev": true,
+ "requires": {
+ "web3-bzz": "1.2.9",
+ "web3-core": "1.2.9",
+ "web3-eth": "1.2.9",
+ "web3-eth-personal": "1.2.9",
+ "web3-net": "1.2.9",
+ "web3-shh": "1.2.9",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-bzz": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.9.tgz",
+ "integrity": "sha512-ogVQr9jHodu9HobARtvUSmWG22cv2EUQzlPeejGWZ7j5h20HX40EDuWyomGY5VclIj5DdLY76Tmq88RTf/6nxA==",
"dev": true,
"requires": {
"@types/node": "^10.12.18",
"got": "9.6.0",
- "swarm-js": "0.1.39",
+ "swarm-js": "^0.1.40",
"underscore": "1.9.1"
- },
- "dependencies": {
- "@types/node": {
- "version": "10.17.20",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.20.tgz",
- "integrity": "sha512-XgDgo6W10SeGEAM0k7FosJpvLCynOTYns4Xk3J5HGrA+UI/bKZ30PGMzOP5Lh2zs4259I71FSYLAtjnx3qhObw==",
- "dev": true
- }
}
},
"web3-core": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.2.tgz",
- "integrity": "sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.9.tgz",
+ "integrity": "sha512-fSYv21IP658Ty2wAuU9iqmW7V+75DOYMVZsDH/c14jcF/1VXnedOcxzxSj3vArsCvXZNe6XC5/wAuGZyQwR9RA==",
"dev": true,
"requires": {
"@types/bn.js": "^4.11.4",
"@types/node": "^12.6.1",
- "web3-core-helpers": "1.2.2",
- "web3-core-method": "1.2.2",
- "web3-core-requestmanager": "1.2.2",
- "web3-utils": "1.2.2"
+ "bignumber.js": "^9.0.0",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-core-requestmanager": "1.2.9",
+ "web3-utils": "1.2.9"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.19.15",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.15.tgz",
+ "integrity": "sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw==",
+ "dev": true
+ }
}
},
"web3-core-helpers": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz",
- "integrity": "sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.9.tgz",
+ "integrity": "sha512-t0WAG3orLCE3lqi77ZoSRNFok3VQWZXTniZigDQjyOJYMAX7BU3F3js8HKbjVnAxlX3tiKoDxI0KBk9F3AxYuw==",
"dev": true,
"requires": {
"underscore": "1.9.1",
- "web3-eth-iban": "1.2.2",
- "web3-utils": "1.2.2"
+ "web3-eth-iban": "1.2.9",
+ "web3-utils": "1.2.9"
}
},
"web3-core-method": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.2.tgz",
- "integrity": "sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.9.tgz",
+ "integrity": "sha512-bjsIoqP3gs7A/gP8+QeLUCyOKJ8bopteCSNbCX36Pxk6TYfYWNuC6hP+2GzUuqdP3xaZNe+XEElQFUNpR3oyAg==",
"dev": true,
"requires": {
+ "@ethersproject/transactions": "^5.0.0-beta.135",
"underscore": "1.9.1",
- "web3-core-helpers": "1.2.2",
- "web3-core-promievent": "1.2.2",
- "web3-core-subscriptions": "1.2.2",
- "web3-utils": "1.2.2"
+ "web3-core-helpers": "1.2.9",
+ "web3-core-promievent": "1.2.9",
+ "web3-core-subscriptions": "1.2.9",
+ "web3-utils": "1.2.9"
}
},
"web3-core-promievent": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz",
- "integrity": "sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz",
+ "integrity": "sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw==",
"dev": true,
"requires": {
- "any-promise": "1.3.0",
"eventemitter3": "3.1.2"
}
},
"web3-core-requestmanager": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz",
- "integrity": "sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz",
+ "integrity": "sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA==",
"dev": true,
"requires": {
"underscore": "1.9.1",
- "web3-core-helpers": "1.2.2",
- "web3-providers-http": "1.2.2",
- "web3-providers-ipc": "1.2.2",
- "web3-providers-ws": "1.2.2"
+ "web3-core-helpers": "1.2.9",
+ "web3-providers-http": "1.2.9",
+ "web3-providers-ipc": "1.2.9",
+ "web3-providers-ws": "1.2.9"
}
},
"web3-core-subscriptions": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz",
- "integrity": "sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz",
+ "integrity": "sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg==",
"dev": true,
"requires": {
"eventemitter3": "3.1.2",
"underscore": "1.9.1",
- "web3-core-helpers": "1.2.2"
+ "web3-core-helpers": "1.2.9"
}
},
"web3-eth": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.2.tgz",
- "integrity": "sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.9.tgz",
+ "integrity": "sha512-sIKO4iE9FEBa/CYUd6GdPd7GXt/wISqxUd8PlIld6+hvMJj02lgO7Z7p5T9mZIJcIZJGvZX81ogx8oJ9yif+Ag==",
"dev": true,
"requires": {
"underscore": "1.9.1",
- "web3-core": "1.2.2",
- "web3-core-helpers": "1.2.2",
- "web3-core-method": "1.2.2",
- "web3-core-subscriptions": "1.2.2",
- "web3-eth-abi": "1.2.2",
- "web3-eth-accounts": "1.2.2",
- "web3-eth-contract": "1.2.2",
- "web3-eth-ens": "1.2.2",
- "web3-eth-iban": "1.2.2",
- "web3-eth-personal": "1.2.2",
- "web3-net": "1.2.2",
- "web3-utils": "1.2.2"
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-core-subscriptions": "1.2.9",
+ "web3-eth-abi": "1.2.9",
+ "web3-eth-accounts": "1.2.9",
+ "web3-eth-contract": "1.2.9",
+ "web3-eth-ens": "1.2.9",
+ "web3-eth-iban": "1.2.9",
+ "web3-eth-personal": "1.2.9",
+ "web3-net": "1.2.9",
+ "web3-utils": "1.2.9"
}
},
"web3-eth-abi": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz",
- "integrity": "sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.9.tgz",
+ "integrity": "sha512-3YwUYbh/DMfDbhMWEebAdjSd5bj3ZQieOjLzWFHU23CaLEqT34sUix1lba+hgUH/EN6A7bKAuKOhR3p0OvTn7Q==",
"dev": true,
"requires": {
- "ethers": "4.0.0-beta.3",
+ "@ethersproject/abi": "5.0.0-beta.153",
"underscore": "1.9.1",
- "web3-utils": "1.2.2"
- },
- "dependencies": {
- "@types/node": {
- "version": "10.17.20",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.20.tgz",
- "integrity": "sha512-XgDgo6W10SeGEAM0k7FosJpvLCynOTYns4Xk3J5HGrA+UI/bKZ30PGMzOP5Lh2zs4259I71FSYLAtjnx3qhObw==",
- "dev": true
- },
- "elliptic": {
- "version": "6.3.3",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz",
- "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=",
- "dev": true,
- "requires": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
- "hash.js": "^1.0.0",
- "inherits": "^2.0.1"
- }
- },
- "ethers": {
- "version": "4.0.0-beta.3",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz",
- "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==",
- "dev": true,
- "requires": {
- "@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"
- }
- },
- "scrypt-js": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz",
- "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=",
- "dev": true
- }
+ "web3-utils": "1.2.9"
}
},
"web3-eth-accounts": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz",
- "integrity": "sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.9.tgz",
+ "integrity": "sha512-jkbDCZoA1qv53mFcRHCinoCsgg8WH+M0YUO1awxmqWXRmCRws1wW0TsuSQ14UThih5Dxolgl+e+aGWxG58LMwg==",
"dev": true,
"requires": {
- "any-promise": "1.3.0",
"crypto-browserify": "3.12.0",
- "eth-lib": "0.2.7",
+ "eth-lib": "^0.2.8",
"ethereumjs-common": "^1.3.2",
"ethereumjs-tx": "^2.1.1",
- "scrypt-shim": "github:web3-js/scrypt-shim",
+ "scrypt-js": "^3.0.1",
"underscore": "1.9.1",
"uuid": "3.3.2",
- "web3-core": "1.2.2",
- "web3-core-helpers": "1.2.2",
- "web3-core-method": "1.2.2",
- "web3-utils": "1.2.2"
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-utils": "1.2.9"
},
"dependencies": {
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ },
+ "scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==",
+ "dev": true
+ },
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
@@ -1357,121 +1605,147 @@
}
},
"web3-eth-contract": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz",
- "integrity": "sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.9.tgz",
+ "integrity": "sha512-PYMvJf7EG/HyssUZa+pXrc8IB06K/YFfWYyW4R7ed3sab+9wWUys1TlWxBCBuiBXOokSAyM6H6P6/cKEx8FT8Q==",
"dev": true,
"requires": {
"@types/bn.js": "^4.11.4",
"underscore": "1.9.1",
- "web3-core": "1.2.2",
- "web3-core-helpers": "1.2.2",
- "web3-core-method": "1.2.2",
- "web3-core-promievent": "1.2.2",
- "web3-core-subscriptions": "1.2.2",
- "web3-eth-abi": "1.2.2",
- "web3-utils": "1.2.2"
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-core-promievent": "1.2.9",
+ "web3-core-subscriptions": "1.2.9",
+ "web3-eth-abi": "1.2.9",
+ "web3-utils": "1.2.9"
}
},
"web3-eth-ens": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz",
- "integrity": "sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.9.tgz",
+ "integrity": "sha512-kG4+ZRgZ8I1WYyOBGI8QVRHfUSbbJjvJAGA1AF/NOW7JXQ+x7gBGeJw6taDWJhSshMoEKWcsgvsiuoG4870YxQ==",
"dev": true,
"requires": {
+ "content-hash": "^2.5.2",
"eth-ens-namehash": "2.0.8",
"underscore": "1.9.1",
- "web3-core": "1.2.2",
- "web3-core-helpers": "1.2.2",
- "web3-core-promievent": "1.2.2",
- "web3-eth-abi": "1.2.2",
- "web3-eth-contract": "1.2.2",
- "web3-utils": "1.2.2"
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-promievent": "1.2.9",
+ "web3-eth-abi": "1.2.9",
+ "web3-eth-contract": "1.2.9",
+ "web3-utils": "1.2.9"
}
},
"web3-eth-iban": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz",
- "integrity": "sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.9.tgz",
+ "integrity": "sha512-RtdVvJE0pyg9dHLy0GzDiqgnLnssSzfz/JYguhC1wsj9+Gnq1M6Diy3NixACWUAp6ty/zafyOaZnNQ+JuH9TjQ==",
"dev": true,
"requires": {
"bn.js": "4.11.8",
- "web3-utils": "1.2.2"
+ "web3-utils": "1.2.9"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+ "dev": true
+ }
}
},
"web3-eth-personal": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz",
- "integrity": "sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.9.tgz",
+ "integrity": "sha512-cFiNrktxZ1C/rIdJFzQTvFn3/0zcsR3a+Jf8Y3KxeQDHszQtosjLWptP7bsUmDwEh4hzh0Cy3KpOxlYBWB8bJQ==",
"dev": true,
"requires": {
"@types/node": "^12.6.1",
- "web3-core": "1.2.2",
- "web3-core-helpers": "1.2.2",
- "web3-core-method": "1.2.2",
- "web3-net": "1.2.2",
- "web3-utils": "1.2.2"
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-net": "1.2.9",
+ "web3-utils": "1.2.9"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.19.15",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.15.tgz",
+ "integrity": "sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw==",
+ "dev": true
+ }
}
},
"web3-net": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.2.tgz",
- "integrity": "sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.9.tgz",
+ "integrity": "sha512-d2mTn8jPlg+SI2hTj2b32Qan6DmtU9ap/IUlJTeQbZQSkTLf0u9suW8Vjwyr4poJYXTurdSshE7OZsPNn30/ZA==",
"dev": true,
"requires": {
- "web3-core": "1.2.2",
- "web3-core-method": "1.2.2",
- "web3-utils": "1.2.2"
+ "web3-core": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-utils": "1.2.9"
}
},
"web3-providers-http": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.2.tgz",
- "integrity": "sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.9.tgz",
+ "integrity": "sha512-F956tCIj60Ttr0UvEHWFIhx+be3He8msoPzyA44/kfzzYoMAsCFRn5cf0zQG6al0znE75g6HlWVSN6s3yAh51A==",
"dev": true,
"requires": {
- "web3-core-helpers": "1.2.2",
+ "web3-core-helpers": "1.2.9",
"xhr2-cookies": "1.1.0"
}
},
"web3-providers-ipc": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz",
- "integrity": "sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.9.tgz",
+ "integrity": "sha512-NQ8QnBleoHA2qTJlqoWu7EJAD/FR5uimf7Ielzk4Z2z+m+6UAuJdJMSuQNj+Umhz9L/Ys6vpS1vHx9NizFl+aQ==",
"dev": true,
"requires": {
"oboe": "2.1.4",
"underscore": "1.9.1",
- "web3-core-helpers": "1.2.2"
+ "web3-core-helpers": "1.2.9"
}
},
"web3-providers-ws": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz",
- "integrity": "sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.9.tgz",
+ "integrity": "sha512-6+UpvINeI//dglZoAKStUXqxDOXJy6Iitv2z3dbgInG4zb8tkYl/VBDL80UjUg3ZvzWG0g7EKY2nRPEpON2TFA==",
"dev": true,
"requires": {
+ "eventemitter3": "^4.0.0",
"underscore": "1.9.1",
- "web3-core-helpers": "1.2.2",
- "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis"
+ "web3-core-helpers": "1.2.9",
+ "websocket": "^1.0.31"
+ },
+ "dependencies": {
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ }
}
},
"web3-shh": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.2.tgz",
- "integrity": "sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.9.tgz",
+ "integrity": "sha512-PWa8b/EaxaMinFaxy6cV0i0EOi2M7a/ST+9k9nhyhCjVa2vzXuNoBNo2IUOmeZ0WP2UQB8ByJ2+p4htlJaDOjA==",
"dev": true,
"requires": {
- "web3-core": "1.2.2",
- "web3-core-method": "1.2.2",
- "web3-core-subscriptions": "1.2.2",
- "web3-net": "1.2.2"
+ "web3-core": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-core-subscriptions": "1.2.9",
+ "web3-net": "1.2.9"
}
},
"web3-utils": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz",
- "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.9.tgz",
+ "integrity": "sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w==",
"dev": true,
"requires": {
"bn.js": "4.11.8",
@@ -1482,124 +1756,83 @@
"randombytes": "^2.1.0",
"underscore": "1.9.1",
"utf8": "3.0.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+ "dev": true
+ },
+ "eth-lib": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
+ "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ }
+ }
+ },
+ "websocket": {
+ "version": "1.0.33",
+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.33.tgz",
+ "integrity": "sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA==",
+ "dev": true,
+ "requires": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.50",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.2",
+ "yaeti": "^0.0.6"
}
}
}
},
"@truffle/provider": {
- "version": "0.1.19",
- "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.1.19.tgz",
- "integrity": "sha512-ke8iQmzW4Y99+8iff8xQcc+mCNU4AkwtaZ/iSpmVD8qpLytw8/DSNCm0RiEz9/+I93Q1zqI4Jnij/rXnkS2Njw==",
- "dev": true,
- "requires": {
- "@truffle/error": "^0.0.7",
- "@truffle/interface-adapter": "^0.3.0",
- "web3": "1.2.1"
- }
- },
- "@types/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
- "dev": true
- },
- "@types/concat-stream": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz",
- "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/events": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
- "dev": true
- },
- "@types/form-data": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
- "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/glob": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
- "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
- "dev": true,
- "requires": {
- "@types/events": "*",
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "@types/minimatch": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
- "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
- "dev": true
- },
- "@types/node": {
- "version": "13.9.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.1.tgz",
- "integrity": "sha512-E6M6N0blf/jiZx8Q3nb0vNaswQeEyn0XlupO+xN6DtJ6r6IT4nXrTry7zhIfYvFCl3/8Cu6WIysmUBKiqV0bqQ=="
- },
- "@types/qs": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.1.tgz",
- "integrity": "sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw==",
- "dev": true
- },
- "@web3-js/scrypt-shim": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz",
- "integrity": "sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw==",
+ "version": "0.2.25",
+ "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.25.tgz",
+ "integrity": "sha512-BohKgT2357c2dYCH2IQwldQ4EJkfsWUClpb3j+kR8ng02vbsyAPe0HMH463I+h+tiDKvL757dBltXpe0DBJusg==",
"dev": true,
"requires": {
- "scryptsy": "^2.1.0",
- "semver": "^6.3.0"
+ "@truffle/error": "^0.0.11",
+ "@truffle/interface-adapter": "^0.4.18",
+ "web3": "1.2.9"
},
"dependencies": {
- "scryptsy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz",
- "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==",
+ "@ethersproject/abi": {
+ "version": "5.0.0-beta.153",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz",
+ "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/address": ">=5.0.0-beta.128",
+ "@ethersproject/bignumber": ">=5.0.0-beta.130",
+ "@ethersproject/bytes": ">=5.0.0-beta.129",
+ "@ethersproject/constants": ">=5.0.0-beta.128",
+ "@ethersproject/hash": ">=5.0.0-beta.128",
+ "@ethersproject/keccak256": ">=5.0.0-beta.127",
+ "@ethersproject/logger": ">=5.0.0-beta.129",
+ "@ethersproject/properties": ">=5.0.0-beta.131",
+ "@ethersproject/strings": ">=5.0.0-beta.130"
+ }
+ },
+ "@types/node": {
+ "version": "10.17.51",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz",
+ "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==",
"dev": true
},
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
"dev": true
- }
- }
- },
- "@web3-js/websocket": {
- "version": "1.0.30",
- "resolved": "https://registry.npmjs.org/@web3-js/websocket/-/websocket-1.0.30.tgz",
- "integrity": "sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA==",
- "dev": true,
- "requires": {
- "debug": "^2.2.0",
- "es5-ext": "^0.10.50",
- "nan": "^2.14.0",
- "typedarray-to-buffer": "^3.1.5",
- "yaeti": "^0.0.6"
- },
- "dependencies": {
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -1609,104 +1842,603 @@
"ms": "2.0.0"
}
},
+ "ethereumjs-tx": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz",
+ "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==",
+ "dev": true,
+ "requires": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
- }
- }
- },
- "abbrev": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
- "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
- "dev": true
- },
- "abstract-leveldown": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz",
- "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==",
- "requires": {
- "xtend": "~4.0.0"
- }
- },
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "acorn": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
- "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
- "dev": true
- },
- "acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
- "dev": true
- },
- "address": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
- "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
- "dev": true
- },
- "aes-js": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
- "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
- },
- "ajv": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
- "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ },
+ "p-cancelable": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
+ "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "swarm-js": {
+ "version": "0.1.40",
+ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz",
+ "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.0",
+ "buffer": "^5.0.5",
+ "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": "^1.0.1"
+ },
+ "dependencies": {
+ "got": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
+ "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ }
+ }
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "dev": true
+ },
+ "web3": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.9.tgz",
+ "integrity": "sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA==",
+ "dev": true,
+ "requires": {
+ "web3-bzz": "1.2.9",
+ "web3-core": "1.2.9",
+ "web3-eth": "1.2.9",
+ "web3-eth-personal": "1.2.9",
+ "web3-net": "1.2.9",
+ "web3-shh": "1.2.9",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-bzz": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.9.tgz",
+ "integrity": "sha512-ogVQr9jHodu9HobARtvUSmWG22cv2EUQzlPeejGWZ7j5h20HX40EDuWyomGY5VclIj5DdLY76Tmq88RTf/6nxA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^10.12.18",
+ "got": "9.6.0",
+ "swarm-js": "^0.1.40",
+ "underscore": "1.9.1"
+ }
+ },
+ "web3-core": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.9.tgz",
+ "integrity": "sha512-fSYv21IP658Ty2wAuU9iqmW7V+75DOYMVZsDH/c14jcF/1VXnedOcxzxSj3vArsCvXZNe6XC5/wAuGZyQwR9RA==",
+ "dev": true,
+ "requires": {
+ "@types/bn.js": "^4.11.4",
+ "@types/node": "^12.6.1",
+ "bignumber.js": "^9.0.0",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-core-requestmanager": "1.2.9",
+ "web3-utils": "1.2.9"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.19.15",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.15.tgz",
+ "integrity": "sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw==",
+ "dev": true
+ }
+ }
+ },
+ "web3-core-helpers": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.9.tgz",
+ "integrity": "sha512-t0WAG3orLCE3lqi77ZoSRNFok3VQWZXTniZigDQjyOJYMAX7BU3F3js8HKbjVnAxlX3tiKoDxI0KBk9F3AxYuw==",
+ "dev": true,
+ "requires": {
+ "underscore": "1.9.1",
+ "web3-eth-iban": "1.2.9",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-core-method": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.9.tgz",
+ "integrity": "sha512-bjsIoqP3gs7A/gP8+QeLUCyOKJ8bopteCSNbCX36Pxk6TYfYWNuC6hP+2GzUuqdP3xaZNe+XEElQFUNpR3oyAg==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/transactions": "^5.0.0-beta.135",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-promievent": "1.2.9",
+ "web3-core-subscriptions": "1.2.9",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-core-promievent": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz",
+ "integrity": "sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "3.1.2"
+ }
+ },
+ "web3-core-requestmanager": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz",
+ "integrity": "sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA==",
+ "dev": true,
+ "requires": {
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.9",
+ "web3-providers-http": "1.2.9",
+ "web3-providers-ipc": "1.2.9",
+ "web3-providers-ws": "1.2.9"
+ }
+ },
+ "web3-core-subscriptions": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz",
+ "integrity": "sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "3.1.2",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.9"
+ }
+ },
+ "web3-eth": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.9.tgz",
+ "integrity": "sha512-sIKO4iE9FEBa/CYUd6GdPd7GXt/wISqxUd8PlIld6+hvMJj02lgO7Z7p5T9mZIJcIZJGvZX81ogx8oJ9yif+Ag==",
+ "dev": true,
+ "requires": {
+ "underscore": "1.9.1",
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-core-subscriptions": "1.2.9",
+ "web3-eth-abi": "1.2.9",
+ "web3-eth-accounts": "1.2.9",
+ "web3-eth-contract": "1.2.9",
+ "web3-eth-ens": "1.2.9",
+ "web3-eth-iban": "1.2.9",
+ "web3-eth-personal": "1.2.9",
+ "web3-net": "1.2.9",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-eth-abi": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.9.tgz",
+ "integrity": "sha512-3YwUYbh/DMfDbhMWEebAdjSd5bj3ZQieOjLzWFHU23CaLEqT34sUix1lba+hgUH/EN6A7bKAuKOhR3p0OvTn7Q==",
+ "dev": true,
+ "requires": {
+ "@ethersproject/abi": "5.0.0-beta.153",
+ "underscore": "1.9.1",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-eth-accounts": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.9.tgz",
+ "integrity": "sha512-jkbDCZoA1qv53mFcRHCinoCsgg8WH+M0YUO1awxmqWXRmCRws1wW0TsuSQ14UThih5Dxolgl+e+aGWxG58LMwg==",
+ "dev": true,
+ "requires": {
+ "crypto-browserify": "3.12.0",
+ "eth-lib": "^0.2.8",
+ "ethereumjs-common": "^1.3.2",
+ "ethereumjs-tx": "^2.1.1",
+ "scrypt-js": "^3.0.1",
+ "underscore": "1.9.1",
+ "uuid": "3.3.2",
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-utils": "1.2.9"
+ },
+ "dependencies": {
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ }
+ }
+ },
+ "web3-eth-contract": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.9.tgz",
+ "integrity": "sha512-PYMvJf7EG/HyssUZa+pXrc8IB06K/YFfWYyW4R7ed3sab+9wWUys1TlWxBCBuiBXOokSAyM6H6P6/cKEx8FT8Q==",
+ "dev": true,
+ "requires": {
+ "@types/bn.js": "^4.11.4",
+ "underscore": "1.9.1",
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-core-promievent": "1.2.9",
+ "web3-core-subscriptions": "1.2.9",
+ "web3-eth-abi": "1.2.9",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-eth-ens": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.9.tgz",
+ "integrity": "sha512-kG4+ZRgZ8I1WYyOBGI8QVRHfUSbbJjvJAGA1AF/NOW7JXQ+x7gBGeJw6taDWJhSshMoEKWcsgvsiuoG4870YxQ==",
+ "dev": true,
+ "requires": {
+ "content-hash": "^2.5.2",
+ "eth-ens-namehash": "2.0.8",
+ "underscore": "1.9.1",
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-promievent": "1.2.9",
+ "web3-eth-abi": "1.2.9",
+ "web3-eth-contract": "1.2.9",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-eth-iban": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.9.tgz",
+ "integrity": "sha512-RtdVvJE0pyg9dHLy0GzDiqgnLnssSzfz/JYguhC1wsj9+Gnq1M6Diy3NixACWUAp6ty/zafyOaZnNQ+JuH9TjQ==",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-eth-personal": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.9.tgz",
+ "integrity": "sha512-cFiNrktxZ1C/rIdJFzQTvFn3/0zcsR3a+Jf8Y3KxeQDHszQtosjLWptP7bsUmDwEh4hzh0Cy3KpOxlYBWB8bJQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^12.6.1",
+ "web3-core": "1.2.9",
+ "web3-core-helpers": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-net": "1.2.9",
+ "web3-utils": "1.2.9"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.19.15",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.15.tgz",
+ "integrity": "sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw==",
+ "dev": true
+ }
+ }
+ },
+ "web3-net": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.9.tgz",
+ "integrity": "sha512-d2mTn8jPlg+SI2hTj2b32Qan6DmtU9ap/IUlJTeQbZQSkTLf0u9suW8Vjwyr4poJYXTurdSshE7OZsPNn30/ZA==",
+ "dev": true,
+ "requires": {
+ "web3-core": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-utils": "1.2.9"
+ }
+ },
+ "web3-providers-http": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.9.tgz",
+ "integrity": "sha512-F956tCIj60Ttr0UvEHWFIhx+be3He8msoPzyA44/kfzzYoMAsCFRn5cf0zQG6al0znE75g6HlWVSN6s3yAh51A==",
+ "dev": true,
+ "requires": {
+ "web3-core-helpers": "1.2.9",
+ "xhr2-cookies": "1.1.0"
+ }
+ },
+ "web3-providers-ipc": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.9.tgz",
+ "integrity": "sha512-NQ8QnBleoHA2qTJlqoWu7EJAD/FR5uimf7Ielzk4Z2z+m+6UAuJdJMSuQNj+Umhz9L/Ys6vpS1vHx9NizFl+aQ==",
+ "dev": true,
+ "requires": {
+ "oboe": "2.1.4",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.9"
+ }
+ },
+ "web3-providers-ws": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.9.tgz",
+ "integrity": "sha512-6+UpvINeI//dglZoAKStUXqxDOXJy6Iitv2z3dbgInG4zb8tkYl/VBDL80UjUg3ZvzWG0g7EKY2nRPEpON2TFA==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "^4.0.0",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.9",
+ "websocket": "^1.0.31"
+ },
+ "dependencies": {
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ }
+ }
+ },
+ "web3-shh": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.9.tgz",
+ "integrity": "sha512-PWa8b/EaxaMinFaxy6cV0i0EOi2M7a/ST+9k9nhyhCjVa2vzXuNoBNo2IUOmeZ0WP2UQB8ByJ2+p4htlJaDOjA==",
+ "dev": true,
+ "requires": {
+ "web3-core": "1.2.9",
+ "web3-core-method": "1.2.9",
+ "web3-core-subscriptions": "1.2.9",
+ "web3-net": "1.2.9"
+ }
+ },
+ "web3-utils": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.9.tgz",
+ "integrity": "sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w==",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "eth-lib": "0.2.7",
+ "ethereum-bloom-filters": "^1.0.6",
+ "ethjs-unit": "0.1.6",
+ "number-to-bn": "1.7.0",
+ "randombytes": "^2.1.0",
+ "underscore": "1.9.1",
+ "utf8": "3.0.0"
+ },
+ "dependencies": {
+ "eth-lib": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
+ "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ }
+ }
+ },
+ "websocket": {
+ "version": "1.0.33",
+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.33.tgz",
+ "integrity": "sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA==",
+ "dev": true,
+ "requires": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.50",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.2",
+ "yaeti": "^0.0.6"
+ }
+ }
}
},
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
- "dev": true,
- "optional": true
- },
- "ansi-colors": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
- "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
- "dev": true
- },
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
- "dev": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ "@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "requires": {
+ "@types/node": "*"
+ }
},
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "@types/concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=",
+ "dev": true,
"requires": {
- "color-convert": "^1.9.0"
+ "@types/node": "*"
}
},
- "ansicolors": {
+ "@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "14.14.22",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz",
+ "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw=="
+ },
+ "@types/pbkdf2": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
+ "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/qs": {
+ "version": "6.9.5",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz",
+ "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==",
+ "dev": true
+ },
+ "@types/secp256k1": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz",
+ "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "abbrev": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+ "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
+ "dev": true
+ },
+ "abstract-leveldown": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz",
+ "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==",
+ "requires": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ },
+ "address": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
+ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
+ "dev": true
+ },
+ "aes-js": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
+ "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true,
+ "optional": true
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+ },
+ "ansi-escapes": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "ansicolors": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
"integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=",
@@ -1724,13 +2456,12 @@
"integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
},
"anymatch": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
- "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
- "dev": true,
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"requires": {
- "micromatch": "^2.1.5",
- "normalize-path": "^2.0.0"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
}
},
"app-module-path": {
@@ -1748,7 +2479,6 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
@@ -1780,13 +2510,15 @@
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"array-includes": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
- "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz",
+ "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.0",
"define-properties": "^1.1.3",
- "es-abstract": "^1.17.0",
+ "es-abstract": "^1.18.0-next.1",
+ "get-intrinsic": "^1.0.1",
"is-string": "^1.0.5"
}
},
@@ -1803,13 +2535,26 @@
"dev": true
},
"array.prototype.flat": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
- "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
+ "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ }
+ },
+ "array.prototype.map": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.3.tgz",
+ "integrity": "sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA==",
+ "requires": {
+ "call-bind": "^1.0.0",
"define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
+ "es-abstract": "^1.18.0-next.1",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "is-string": "^1.0.5"
}
},
"asap": {
@@ -1827,13 +2572,14 @@
}
},
"asn1.js": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
- "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
"requires": {
"bn.js": "^4.0.0",
"inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
}
},
"assert-plus": {
@@ -1847,6 +2593,12 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
+ "ast-parents": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz",
+ "integrity": "sha1-UI/Q8F0MSHddnszaLhdEIyYejdM=",
+ "dev": true
+ },
"astral-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
@@ -1891,15 +2643,20 @@
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"dev": true
},
+ "await-semaphore": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/await-semaphore/-/await-semaphore-0.1.3.tgz",
+ "integrity": "sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q=="
+ },
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
- "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
},
"axios": {
"version": "0.19.2",
@@ -2158,9 +2915,9 @@
}
},
"babel-plugin-dynamic-import-node": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
- "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
"requires": {
"object.assign": "^4.1.0"
}
@@ -2534,9 +3291,9 @@
},
"dependencies": {
"core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
},
"mkdirp": {
"version": "0.5.5",
@@ -2566,9 +3323,9 @@
},
"dependencies": {
"core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
},
"regenerator-runtime": {
"version": "0.11.1",
@@ -2746,9 +3503,9 @@
}
},
"base64-js": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
- "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
"bcrypt-pbkdf": {
"version": "1.0.2",
@@ -2758,12 +3515,17 @@
"tweetnacl": "^0.14.3"
}
},
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "bignumber.js": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
+ "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==",
"dev": true
},
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+ },
"bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
@@ -2788,28 +3550,58 @@
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz",
"integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=",
+ "dev": true,
"requires": {
"safe-buffer": "^5.0.1"
}
},
"bl": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
- "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
+ "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
"requires": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "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"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
}
},
+ "blakejs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz",
+ "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U="
+ },
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"bn.js": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
- "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
},
"body-parser": {
"version": "1.19.0",
@@ -2853,14 +3645,11 @@
}
},
"braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "dev": true,
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"requires": {
- "expand-range": "^1.8.1",
- "preserve": "^0.2.0",
- "repeat-element": "^1.1.2"
+ "fill-range": "^7.0.1"
}
},
"brorand": {
@@ -2908,36 +3697,59 @@
}
},
"browserify-rsa": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
- "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
"requires": {
- "bn.js": "^4.1.0",
+ "bn.js": "^5.0.0",
"randombytes": "^2.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+ "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ=="
+ }
}
},
"browserify-sign": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
- "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
"requires": {
- "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"
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+ "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ=="
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
}
},
"browserslist": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz",
- "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==",
+ "version": "4.16.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz",
+ "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==",
"requires": {
- "caniuse-lite": "^1.0.30001030",
- "electron-to-chromium": "^1.3.363",
- "node-releases": "^1.1.50"
+ "caniuse-lite": "^1.0.30001173",
+ "colorette": "^1.2.1",
+ "electron-to-chromium": "^1.3.634",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.69"
}
},
"bs58": {
@@ -2958,13 +3770,18 @@
"safe-buffer": "^5.1.2"
}
},
+ "btoa": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
+ "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
+ },
"buffer": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
- "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
}
},
"buffer-alloc": {
@@ -3006,6 +3823,15 @@
"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
},
+ "bufferutil": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz",
+ "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==",
+ "dev": true,
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
@@ -3051,9 +3877,9 @@
},
"dependencies": {
"get-stream": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
- "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"requires": {
"pump": "^3.0.0"
}
@@ -3065,6 +3891,15 @@
}
}
},
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
"caller-callsite": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
@@ -3098,15 +3933,14 @@
"dev": true
},
"camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
},
"caniuse-lite": {
- "version": "1.0.30001035",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz",
- "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ=="
+ "version": "1.0.30001179",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz",
+ "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA=="
},
"cardinal": {
"version": "2.1.1",
@@ -3154,53 +3988,50 @@
}
},
"chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+ "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.1.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.4.0"
+ }
+ },
+ "chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ },
+ "cids": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz",
+ "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==",
"dev": true,
"requires": {
- "anymatch": "^1.3.0",
- "async-each": "^1.0.0",
- "fsevents": "^1.0.0",
- "glob-parent": "^2.0.0",
- "inherits": "^2.0.1",
- "is-binary-path": "^1.0.0",
- "is-glob": "^2.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.0.0"
+ "buffer": "^5.5.0",
+ "class-is": "^1.1.0",
+ "multibase": "~0.6.0",
+ "multicodec": "^1.0.0",
+ "multihashes": "~0.4.15"
},
"dependencies": {
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "requires": {
- "is-glob": "^2.0.0"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "multicodec": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz",
+ "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==",
"dev": true,
"requires": {
- "is-extglob": "^1.0.0"
+ "buffer": "^5.6.0",
+ "varint": "^5.0.0"
}
}
}
},
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
"cipher-base": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
@@ -3215,6 +4046,12 @@
"resolved": "https://registry.npmjs.org/circular/-/circular-1.0.5.tgz",
"integrity": "sha1-fad6+Yu96c5LWzWM1Va13e0tMUk="
},
+ "class-is": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz",
+ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==",
+ "dev": true
+ },
"class-utils": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
@@ -3244,19 +4081,6 @@
}
}
},
- "cli-color": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz",
- "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==",
- "requires": {
- "ansi-regex": "^2.1.1",
- "d": "1",
- "es5-ext": "^0.10.46",
- "es6-iterator": "^2.0.3",
- "memoizee": "^0.4.14",
- "timers-ext": "^0.1.5"
- }
- },
"cli-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -3281,65 +4105,66 @@
"integrity": "sha1-a82TsJ+y7RAl0woRVdWZeVSlNRI="
},
"cli-table": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
- "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.4.tgz",
+ "integrity": "sha512-1vinpnX/ZERcmE443i3SZTmU5DF0rPO9DrL4I2iVAllhxzCM9SzPlHnz19fsZB78htkKZvYBvj6SZ6vXnaxmTA==",
"dev": true,
"requires": {
- "colors": "1.0.3"
- }
- },
- "cli-table3": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
- "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
- "dev": true,
- "requires": {
- "colors": "^1.1.2",
- "object-assign": "^4.1.0",
- "string-width": "^2.1.1"
+ "chalk": "^2.4.1",
+ "string-width": "^4.2.0"
},
"dependencies": {
"ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true,
- "optional": true
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
},
"is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"dev": true,
"requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0"
+ "ansi-regex": "^5.0.0"
}
}
}
},
+ "cli-table3": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
+ "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
+ "dev": true,
+ "requires": {
+ "colors": "^1.1.2",
+ "object-assign": "^4.1.0",
+ "string-width": "^2.1.1"
+ }
+ },
"cli-util": {
"version": "1.1.27",
"resolved": "https://registry.npmjs.org/cli-util/-/cli-util-1.1.27.tgz",
@@ -3349,51 +4174,42 @@
}
},
"cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
"dev": true
},
"cliui": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
- "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
- "dev": true,
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
"requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
},
"dependencies": {
"ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"requires": {
+ "emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
+ "strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
- "ansi-regex": "^3.0.0"
+ "ansi-regex": "^4.1.0"
}
}
}
@@ -3446,10 +4262,15 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
+ "colorette": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw=="
+ },
"colors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
- "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true
},
"combined-stream": {
@@ -3461,12 +4282,9 @@
}
},
"commander": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
- "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
- "requires": {
- "graceful-readlink": ">= 1.0.0"
- }
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
"commondir": {
"version": "1.0.1",
@@ -3493,12 +4311,36 @@
"inherits": "^2.0.3",
"readable-stream": "^2.2.2",
"typedarray": "^0.0.6"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "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"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
}
},
"confusing-browser-globals": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
- "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==",
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz",
+ "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==",
"dev": true
},
"contains-path": {
@@ -3515,6 +4357,17 @@
"safe-buffer": "5.1.2"
}
},
+ "content-hash": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz",
+ "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==",
+ "dev": true,
+ "requires": {
+ "cids": "^0.7.1",
+ "multicodec": "^0.5.5",
+ "multihashes": "^0.4.15"
+ }
+ },
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
@@ -3550,16 +4403,16 @@
"dev": true
},
"core-js": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
- "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw=="
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
+ "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
},
"core-js-compat": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz",
- "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==",
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz",
+ "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==",
"requires": {
- "browserslist": "^4.8.3",
+ "browserslist": "^4.16.1",
"semver": "7.0.0"
},
"dependencies": {
@@ -3625,12 +4478,12 @@
}
},
"create-ecdh": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
- "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
"requires": {
"bn.js": "^4.1.0",
- "elliptic": "^6.0.0"
+ "elliptic": "^6.5.3"
}
},
"create-hash": {
@@ -3678,6 +4531,17 @@
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
+ },
+ "dependencies": {
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
}
},
"crypt": {
@@ -3728,18 +4592,17 @@
"dev": true
},
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
},
"decode-uri-component": {
"version": "0.2.0",
@@ -4025,9 +4888,9 @@
}
},
"diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
},
"diffie-hellman": {
"version": "5.0.3",
@@ -4087,6 +4950,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz",
"integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=",
+ "dev": true,
"requires": {
"browserify-aes": "^1.0.6",
"create-hash": "^1.1.2",
@@ -4113,14 +4977,14 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
- "version": "1.3.376",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz",
- "integrity": "sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw=="
+ "version": "1.3.645",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.645.tgz",
+ "integrity": "sha512-T7mYop3aDpRHIQaUYcmzmh6j9MAe560n6ukqjJMbVC6bVTau7dSpvB18bcsBPPtOSe10cKxhJFtlbEzLa0LL1g=="
},
"elliptic": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
- "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==",
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+ "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
"requires": {
"bn.js": "^4.4.0",
"brorand": "^1.0.1",
@@ -4132,10 +4996,9 @@
}
},
"emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
},
"encodeurl": {
"version": "1.0.2",
@@ -4143,11 +5006,21 @@
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"encoding": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
"requires": {
- "iconv-lite": "~0.4.13"
+ "iconv-lite": "^0.6.2"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+ "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ }
+ }
}
},
"end-of-stream": {
@@ -4165,9 +5038,9 @@
"dev": true
},
"errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
"requires": {
"prr": "~1.0.1"
}
@@ -4182,21 +5055,66 @@
}
},
"es-abstract": {
- "version": "1.17.4",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
- "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
+ "version": "1.18.0-next.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz",
+ "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==",
"requires": {
+ "call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2",
"has": "^1.0.3",
"has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.1",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.9.0",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
+ "object.assign": "^4.1.2",
+ "string.prototype.trimend": "^1.0.3",
+ "string.prototype.trimstart": "^1.0.3"
+ },
+ "dependencies": {
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
+ "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
+ }
+ }
+ },
+ "es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
+ },
+ "es-get-iterator": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
+ "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.0",
+ "has-symbols": "^1.0.1",
+ "is-arguments": "^1.1.0",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.5",
+ "isarray": "^2.0.5"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ }
}
},
"es-to-primitive": {
@@ -4238,16 +5156,10 @@
"ext": "^1.1.2"
}
},
- "es6-weak-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
- "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.46",
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.1"
- }
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
},
"escape-html": {
"version": "1.0.3",
@@ -4284,6 +5196,36 @@
"integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
"dev": true
},
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
"source-map": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
@@ -4293,26 +5235,35 @@
"requires": {
"amdefine": ">=0.0.4"
}
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
}
}
},
"eslint": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
- "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.0.0.tgz",
+ "integrity": "sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"ajv": "^6.10.0",
- "chalk": "^2.1.0",
- "cross-spawn": "^6.0.5",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"eslint-scope": "^5.0.0",
- "eslint-utils": "^1.4.3",
+ "eslint-utils": "^2.0.0",
"eslint-visitor-keys": "^1.1.0",
- "espree": "^6.1.2",
- "esquery": "^1.0.1",
+ "espree": "^7.0.0",
+ "esquery": "^1.2.0",
"esutils": "^2.0.2",
"file-entry-cache": "^5.0.1",
"functional-red-black-tree": "^1.0.1",
@@ -4325,28 +5276,72 @@
"is-glob": "^4.0.0",
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
+ "levn": "^0.4.1",
"lodash": "^4.17.14",
"minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
"natural-compare": "^1.4.0",
- "optionator": "^0.8.3",
+ "optionator": "^0.9.1",
"progress": "^2.0.0",
- "regexpp": "^2.0.1",
- "semver": "^6.1.2",
- "strip-ansi": "^5.2.0",
- "strip-json-comments": "^3.0.1",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
"table": "^5.2.3",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
"ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
"globals": {
"version": "12.4.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
@@ -4356,53 +5351,83 @@
"type-fest": "^0.8.1"
}
},
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
"dev": true,
"requires": {
- "minimist": "0.0.8"
+ "lru-cache": "^6.0.0"
}
},
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
"strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
+ "ansi-regex": "^5.0.0"
}
- }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"eslint-config-airbnb-base": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz",
- "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==",
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz",
+ "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==",
"dev": true,
"requires": {
- "confusing-browser-globals": "^1.0.7",
+ "confusing-browser-globals": "^1.0.9",
"object.assign": "^4.1.0",
- "object.entries": "^1.1.0"
+ "object.entries": "^1.1.1"
}
},
"eslint-import-resolver-node": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz",
- "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==",
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+ "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
"dev": true,
"requires": {
"debug": "^2.6.9",
@@ -4427,9 +5452,9 @@
}
},
"eslint-module-utils": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz",
- "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+ "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
"dev": true,
"requires": {
"debug": "^2.6.9",
@@ -4506,9 +5531,9 @@
}
},
"eslint-plugin-import": {
- "version": "2.20.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz",
- "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==",
+ "version": "2.20.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz",
+ "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==",
"dev": true,
"requires": {
"array-includes": "^3.0.3",
@@ -4553,63 +5578,78 @@
}
},
"eslint-scope": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
- "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
+ "esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
"eslint-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
- "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
},
"eslint-visitor-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
- "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
},
"espree": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
- "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
- "acorn": "^7.1.1",
- "acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.1.0"
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
}
},
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
"esquery": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz",
- "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+ "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
"dev": true,
"requires": {
- "estraverse": "^4.0.0"
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
}
},
"esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
- "estraverse": "^4.1.0"
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
}
},
"estraverse": {
@@ -4629,37 +5669,22 @@
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
"eth-block-tracker": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz",
- "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz",
+ "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==",
"requires": {
+ "@babel/plugin-transform-runtime": "^7.5.5",
+ "@babel/runtime": "^7.5.5",
"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"
+ "json-rpc-random-id": "^1.0.1",
+ "pify": "^3.0.0",
+ "safe-event-emitter": "^1.0.1"
},
"dependencies": {
- "ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
- "requires": {
- "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"
- }
- },
"pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
}
}
},
@@ -4701,41 +5726,10 @@
"integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=",
"dev": true
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "binary-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
- "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
- "dev": true
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "ansi-colors": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
"dev": true
},
"chokidar": {
@@ -4754,23 +5748,6 @@
"readdirp": "~3.2.0"
}
},
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true
- },
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
@@ -4780,21 +5757,36 @@
"ms": "^2.1.1"
}
},
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true
},
+ "ethereumjs-util": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz",
+ "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==",
+ "dev": true,
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "ethjs-util": "0.1.6",
+ "keccak": "^2.0.0",
+ "rlp": "^2.2.3",
+ "secp256k1": "^3.0.1"
+ }
+ },
"ethers": {
- "version": "4.0.46",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.46.tgz",
- "integrity": "sha512-/dPMzzpInhtiip4hKFvsDiJKeRk64IhyA+Po7CtNXneQFSOCYXg8eBFt+jXbxUQyApgWnWOtYxWdfn9+CvvxDA==",
+ "version": "4.0.48",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz",
+ "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==",
"dev": true,
"requires": {
"aes-js": "3.0.0",
"bn.js": "^4.4.0",
- "elliptic": "6.5.2",
+ "elliptic": "6.5.3",
"hash.js": "1.1.3",
"js-sha3": "0.5.7",
"scrypt-js": "2.0.4",
@@ -4803,28 +5795,6 @@
"xmlhttprequest": "1.8.0"
}
},
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "fsevents": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
- "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
- "dev": true,
- "optional": true
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
- },
"glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
@@ -4849,46 +5819,50 @@
"minimalistic-assert": "^1.0.0"
}
},
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
},
- "is-binary-path": {
+ "keccak": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz",
+ "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==",
"dev": true,
"requires": {
- "binary-extensions": "^2.0.0"
+ "bindings": "^1.5.0",
+ "inherits": "^2.0.4",
+ "nan": "^2.14.0",
+ "safe-buffer": "^5.2.0"
}
},
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
+ "log-symbols": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
+ "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2"
+ }
},
"mkdirp": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
- "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
"minimist": "^1.2.5"
}
},
"mocha": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.1.tgz",
- "integrity": "sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz",
+ "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==",
"dev": true,
"requires": {
"ansi-colors": "3.2.3",
@@ -4904,7 +5878,7 @@
"js-yaml": "3.13.1",
"log-symbols": "3.0.0",
"minimatch": "3.0.4",
- "mkdirp": "0.5.3",
+ "mkdirp": "0.5.5",
"ms": "2.1.1",
"node-environment-flags": "1.0.6",
"object.assign": "4.1.0",
@@ -4923,11 +5897,17 @@
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true
},
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
},
"readdirp": {
"version": "3.2.0",
@@ -4938,10 +5918,10 @@
"picomatch": "^2.0.4"
}
},
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
},
"scrypt-js": {
@@ -4950,32 +5930,28 @@
"integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==",
"dev": true
},
+ "secp256k1": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz",
+ "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==",
+ "dev": true,
+ "requires": {
+ "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.5.2",
+ "nan": "^2.14.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
"setimmediate": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz",
"integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=",
"dev": true
},
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
@@ -4991,116 +5967,202 @@
"has-flag": "^3.0.0"
}
},
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
"uuid": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
"integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=",
"dev": true
},
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
- "dev": true
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^3.0.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^13.1.2"
+ "isexe": "^2.0.0"
}
},
- "yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "yargs-unparser": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
+ "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
"dev": true,
"requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
+ "flat": "^4.1.0",
+ "lodash": "^4.17.15",
+ "yargs": "^13.3.0"
}
}
}
},
- "eth-json-rpc-infura": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz",
- "integrity": "sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==",
+ "eth-json-rpc-errors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz",
+ "integrity": "sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg==",
"requires": {
- "cross-fetch": "^2.1.1",
- "eth-json-rpc-middleware": "^1.5.0",
- "json-rpc-engine": "^3.4.0",
- "json-rpc-error": "^2.0.0"
+ "fast-safe-stringify": "^2.0.6"
}
},
- "eth-json-rpc-middleware": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz",
- "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==",
+ "eth-json-rpc-filters": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.1.tgz",
+ "integrity": "sha512-tPfohezq8mSmwa47xvq6PGzBDLZ0njWJMB1J+OPuv+n+1WkWDlf3l3tqJXpq96RxhrzK2q7wiweRS5aGIzpq4Q==",
"requires": {
- "async": "^2.5.0",
+ "await-semaphore": "^0.1.3",
+ "eth-json-rpc-middleware": "^6.0.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"
+ "json-rpc-engine": "^5.3.0",
+ "lodash.flatmap": "^4.5.0",
+ "safe-event-emitter": "^1.0.1"
},
"dependencies": {
+ "eth-json-rpc-middleware": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz",
+ "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==",
+ "requires": {
+ "btoa": "^1.2.1",
+ "clone": "^2.1.1",
+ "eth-query": "^2.1.2",
+ "eth-rpc-errors": "^3.0.0",
+ "eth-sig-util": "^1.4.2",
+ "ethereumjs-util": "^5.1.2",
+ "json-rpc-engine": "^5.3.0",
+ "json-stable-stringify": "^1.0.1",
+ "node-fetch": "^2.6.1",
+ "pify": "^3.0.0",
+ "safe-event-emitter": "^1.0.1"
+ }
+ },
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
}
- }
- }
- },
- "eth-lib": {
+ },
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ }
+ }
+ },
+ "eth-json-rpc-infura": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz",
+ "integrity": "sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==",
+ "requires": {
+ "cross-fetch": "^2.1.1",
+ "eth-json-rpc-middleware": "^1.5.0",
+ "json-rpc-engine": "^3.4.0",
+ "json-rpc-error": "^2.0.0"
+ },
+ "dependencies": {
+ "eth-json-rpc-middleware": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz",
+ "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==",
+ "requires": {
+ "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"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "json-rpc-engine": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz",
+ "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==",
+ "requires": {
+ "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"
+ }
+ }
+ }
+ },
+ "eth-json-rpc-middleware": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz",
+ "integrity": "sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A==",
+ "requires": {
+ "btoa": "^1.2.1",
+ "clone": "^2.1.1",
+ "eth-json-rpc-errors": "^1.0.1",
+ "eth-query": "^2.1.2",
+ "eth-sig-util": "^1.4.2",
+ "ethereumjs-block": "^1.6.0",
+ "ethereumjs-tx": "^1.3.7",
+ "ethereumjs-util": "^5.1.2",
+ "ethereumjs-vm": "^2.6.0",
+ "fetch-ponyfill": "^4.0.0",
+ "json-rpc-engine": "^5.1.3",
+ "json-stable-stringify": "^1.0.1",
+ "pify": "^3.0.0",
+ "safe-event-emitter": "^1.0.1"
+ },
+ "dependencies": {
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ }
+ }
+ },
+ "eth-lib": {
"version": "0.1.29",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz",
"integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==",
@@ -5122,6 +6184,14 @@
"xtend": "^4.0.1"
}
},
+ "eth-rpc-errors": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz",
+ "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==",
+ "requires": {
+ "fast-safe-stringify": "^2.0.6"
+ }
+ },
"eth-sig-util": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz",
@@ -5132,17 +6202,17 @@
},
"dependencies": {
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
}
}
}
@@ -5165,25 +6235,25 @@
},
"dependencies": {
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
}
}
}
},
"ethereum-bloom-filters": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz",
- "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.9.tgz",
+ "integrity": "sha512-GiK/RQkAkcVaEdxKVkPcG07PQ5vD7v2MFSHgZmBJSfMzNRHimntdBithsHAT89tAXnIpzVDWt8iaCD1DvkaxGg==",
"dev": true,
"requires": {
"js-sha3": "^0.8.0"
@@ -5202,13 +6272,35 @@
"resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz",
"integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8="
},
+ "ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "requires": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
"ethereum-protocol": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz",
"integrity": "sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg=="
},
"ethereumjs-abi": {
- "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b",
+ "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#1ce6a1d64235fabe2aaf827fd606def55693508f",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": {
"bn.js": "^4.11.8",
@@ -5226,17 +6318,17 @@
},
"dependencies": {
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
}
}
}
@@ -5259,25 +6351,25 @@
"integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA=="
},
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
}
}
}
},
"ethereumjs-common": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz",
- "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ=="
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz",
+ "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA=="
},
"ethereumjs-tx": {
"version": "1.3.7",
@@ -5289,51 +6381,33 @@
},
"dependencies": {
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
}
}
}
},
"ethereumjs-util": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz",
- "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
"requires": {
"@types/bn.js": "^4.11.3",
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "0.1.6",
- "keccak": "^2.0.0",
- "rlp": "^2.2.3",
- "secp256k1": "^3.0.1"
- },
- "dependencies": {
- "keccak": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz",
- "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==",
- "requires": {
- "bindings": "^1.5.0",
- "inherits": "^2.0.4",
- "nan": "^2.14.0",
- "safe-buffer": "^5.2.0"
- }
- },
- "safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
- }
+ "rlp": "^2.2.3"
}
},
"ethereumjs-vm": {
@@ -5367,17 +6441,17 @@
},
"dependencies": {
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
}
}
}
@@ -5394,17 +6468,17 @@
}
},
"ethereumjs-wallet": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz",
- "integrity": "sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w==",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz",
+ "integrity": "sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==",
"requires": {
"aes-js": "^3.1.1",
"bs58check": "^2.1.2",
+ "ethereum-cryptography": "^0.1.3",
"ethereumjs-util": "^6.0.0",
- "hdkey": "^1.1.0",
"randombytes": "^2.0.6",
"safe-buffer": "^5.1.2",
- "scrypt.js": "^0.3.0",
+ "scryptsy": "^1.2.1",
"utf8": "^3.0.0",
"uuid": "^3.3.2"
}
@@ -5427,9 +6501,9 @@
},
"dependencies": {
"@types/node": {
- "version": "10.17.20",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.20.tgz",
- "integrity": "sha512-XgDgo6W10SeGEAM0k7FosJpvLCynOTYns4Xk3J5HGrA+UI/bKZ30PGMzOP5Lh2zs4259I71FSYLAtjnx3qhObw=="
+ "version": "10.17.51",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz",
+ "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg=="
},
"aes-js": {
"version": "3.0.0",
@@ -5456,6 +6530,11 @@
"minimalistic-assert": "^1.0.0"
}
},
+ "scrypt-js": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz",
+ "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q="
+ },
"setimmediate": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz",
@@ -5526,342 +6605,751 @@
"json-schema-traverse": "^0.3.0"
}
},
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^2.1.5",
+ "normalize-path": "^2.0.0"
+ }
},
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
"dev": true
},
- "fast-deep-equal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
- "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
"dev": true
},
- "json-schema-traverse": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
- "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
"dev": true
- }
- }
- },
- "event-emitter": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
- "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
- "requires": {
- "d": "1",
- "es5-ext": "~0.10.14"
- }
- },
- "eventemitter3": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
- "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
- },
- "events": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
- "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg=="
- },
- "evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "dev": true,
- "requires": {
- "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"
- }
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "dev": true,
- "requires": {
- "is-posix-bracket": "^0.1.0"
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "dev": true,
- "requires": {
- "fill-range": "^2.1.0"
- }
- },
- "express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
- "requires": {
- "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"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
},
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "ext": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
- "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
- "requires": {
- "type": "^2.0.0"
- },
- "dependencies": {
- "type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
- "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
"requires": {
- "is-plain-object": "^2.0.4"
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
}
- }
- }
- },
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dev": true,
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true,
- "requires": {
- "is-extglob": "^1.0.0"
- },
- "dependencies": {
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
- "fake-merkle-patricia-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz",
- "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=",
- "requires": {
- "checkpoint-store": "^1.1.0"
- }
- },
- "fast-deep-equal": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
- "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
- },
- "fast-diff": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
- "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz",
- "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
- },
- "dependencies": {
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"dev": true,
"requires": {
- "fill-range": "^7.0.1"
+ "anymatch": "^1.3.0",
+ "async-each": "^1.0.0",
+ "fsevents": "^1.0.0",
+ "glob-parent": "^2.0.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^2.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0"
}
},
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
- "to-regex-range": "^5.0.1"
+ "ms": "2.0.0"
}
},
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true
},
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
"dev": true,
"requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
}
},
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
"dev": true,
"requires": {
- "is-number": "^7.0.0"
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^2.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^1.0.0"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
}
}
}
},
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "eventemitter3": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+ "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
},
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
+ "events": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+ "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg=="
},
- "fastq": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz",
- "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==",
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"dev": true,
"requires": {
- "reusify": "^1.0.4"
+ "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"
}
},
- "fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
"requires": {
- "pend": "~1.2.0"
+ "is-posix-bracket": "^0.1.0"
}
},
- "fetch-ponyfill": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz",
- "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=",
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
"requires": {
- "node-fetch": "~1.7.1"
+ "fill-range": "^2.1.0"
},
"dependencies": {
- "node-fetch": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
- "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+ "fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "dev": true,
"requires": {
- "encoding": "^0.1.11",
- "is-stream": "^1.0.1"
+ "is-number": "^2.1.0",
+ "isobject": "^2.0.0",
+ "randomatic": "^3.0.0",
+ "repeat-element": "^1.1.2",
+ "repeat-string": "^1.5.2"
}
- }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ }
+ }
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "ext": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
+ "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
+ "requires": {
+ "type": "^2.0.0"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz",
+ "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA=="
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^1.0.0"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "fake-merkle-patricia-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz",
+ "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=",
+ "requires": {
+ "checkpoint-store": "^1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
+ "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ },
+ "dependencies": {
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fast-safe-stringify": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
+ },
+ "fastq": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
+ "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "fetch-ponyfill": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz",
+ "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=",
+ "requires": {
+ "node-fetch": "~1.7.1"
+ },
+ "dependencies": {
+ "node-fetch": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+ "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+ "requires": {
+ "encoding": "^0.1.11",
+ "is-stream": "^1.0.1"
+ }
+ }
}
},
"figures": {
@@ -5899,16 +7387,11 @@
"dev": true
},
"fill-range": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
- "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
- "dev": true,
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"requires": {
- "is-number": "^2.1.0",
- "isobject": "^2.0.0",
- "randomatic": "^3.0.0",
- "repeat-element": "^1.1.2",
- "repeat-string": "^1.5.2"
+ "to-regex-range": "^5.0.1"
}
},
"finalhandler": {
@@ -5959,20 +7442,11 @@
}
},
"flat": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
- "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
- "dev": true,
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
+ "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
"requires": {
"is-buffer": "~2.0.3"
- },
- "dependencies": {
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
- "dev": true
- }
}
},
"flat-cache": {
@@ -5987,9 +7461,9 @@
}
},
"flatted": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
- "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
"dev": true
},
"follow-redirects": {
@@ -6107,1499 +7581,1061 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"fsevents": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz",
- "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+ },
+ "ganache-cli": {
+ "version": "6.12.2",
+ "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.12.2.tgz",
+ "integrity": "sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw==",
"dev": true,
- "optional": true,
"requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1",
- "node-pre-gyp": "*"
+ "ethereumjs-util": "6.2.1",
+ "source-map-support": "0.5.12",
+ "yargs": "13.2.4"
},
"dependencies": {
- "abbrev": {
- "version": "1.1.1",
+ "@types/bn.js": {
+ "version": "4.11.6",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "@types/node": "*"
+ }
},
- "ansi-regex": {
- "version": "2.1.1",
+ "@types/node": {
+ "version": "14.11.2",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "aproba": {
- "version": "1.2.0",
+ "@types/pbkdf2": {
+ "version": "3.1.0",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "@types/node": "*"
+ }
},
- "are-we-there-yet": {
- "version": "1.1.5",
+ "@types/secp256k1": {
+ "version": "4.0.1",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
+ "@types/node": "*"
}
},
- "balanced-match": {
- "version": "1.0.0",
+ "ansi-regex": {
+ "version": "4.1.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "brace-expansion": {
- "version": "1.1.11",
+ "ansi-styles": {
+ "version": "3.2.1",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "color-convert": "^1.9.0"
}
},
- "chownr": {
- "version": "1.1.3",
+ "base-x": {
+ "version": "3.0.8",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
},
- "code-point-at": {
+ "blakejs": {
"version": "1.1.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "concat-map": {
- "version": "0.0.1",
+ "bn.js": {
+ "version": "4.11.9",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "console-control-strings": {
+ "brorand": {
"version": "1.1.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "core-util-is": {
- "version": "1.0.2",
+ "browserify-aes": {
+ "version": "1.2.0",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "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"
+ }
},
- "debug": {
- "version": "3.2.6",
+ "bs58": {
+ "version": "4.0.1",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "ms": "^2.1.1"
+ "base-x": "^3.0.2"
}
},
- "deep-extend": {
- "version": "0.6.0",
+ "bs58check": {
+ "version": "2.1.2",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
},
- "delegates": {
- "version": "1.0.0",
+ "buffer-from": {
+ "version": "1.1.1",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "detect-libc": {
+ "buffer-xor": {
"version": "1.0.3",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "fs-minipass": {
- "version": "1.2.7",
+ "camelcase": {
+ "version": "5.3.1",
"bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minipass": "^2.6.0"
- }
+ "dev": true
},
- "fs.realpath": {
- "version": "1.0.0",
+ "cipher-base": {
+ "version": "1.0.4",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
},
- "gauge": {
- "version": "2.7.4",
+ "cliui": {
+ "version": "5.0.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
}
},
- "glob": {
- "version": "7.1.6",
+ "color-convert": {
+ "version": "1.9.3",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "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"
+ "color-name": "1.1.3"
}
},
- "has-unicode": {
- "version": "2.0.1",
+ "color-name": {
+ "version": "1.1.3",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "iconv-lite": {
- "version": "0.4.24",
+ "create-hash": {
+ "version": "1.2.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
}
},
- "ignore-walk": {
- "version": "3.0.3",
+ "create-hmac": {
+ "version": "1.1.7",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "minimatch": "^3.0.4"
+ "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"
}
},
- "inflight": {
- "version": "1.0.6",
+ "cross-spawn": {
+ "version": "6.0.5",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
}
},
- "inherits": {
- "version": "2.0.4",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ini": {
- "version": "1.3.5",
+ "decamelize": {
+ "version": "1.2.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "is-fullwidth-code-point": {
- "version": "1.0.0",
+ "elliptic": {
+ "version": "6.5.3",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "number-is-nan": "^1.0.0"
+ "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"
}
},
- "isarray": {
- "version": "1.0.0",
+ "emoji-regex": {
+ "version": "7.0.3",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "minimatch": {
- "version": "3.0.4",
+ "end-of-stream": {
+ "version": "1.4.4",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "brace-expansion": "^1.1.7"
+ "once": "^1.4.0"
}
},
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "minipass": {
- "version": "2.9.0",
+ "ethereum-cryptography": {
+ "version": "0.1.3",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
"safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
}
},
- "minizlib": {
- "version": "1.3.3",
+ "ethereumjs-util": {
+ "version": "6.2.1",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "minipass": "^2.9.0"
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
}
},
- "mkdirp": {
- "version": "0.5.1",
+ "ethjs-util": {
+ "version": "0.1.6",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "minimist": "0.0.8"
+ "is-hex-prefixed": "1.0.0",
+ "strip-hex-prefix": "1.0.0"
}
},
- "ms": {
- "version": "2.1.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "needle": {
- "version": "2.4.0",
+ "evp_bytestokey": {
+ "version": "1.0.3",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "debug": "^3.2.6",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
}
},
- "node-pre-gyp": {
- "version": "0.14.0",
+ "execa": {
+ "version": "1.0.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4.4.2"
+ "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"
}
},
- "nopt": {
- "version": "4.0.1",
+ "find-up": {
+ "version": "3.0.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
+ "locate-path": "^3.0.0"
}
},
- "npm-bundled": {
- "version": "1.1.1",
+ "get-caller-file": {
+ "version": "2.0.5",
"bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "npm-normalize-package-bin": "^1.0.1"
- }
+ "dev": true
},
- "npm-normalize-package-bin": {
- "version": "1.0.1",
+ "get-stream": {
+ "version": "4.1.0",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "pump": "^3.0.0"
+ }
},
- "npm-packlist": {
- "version": "1.4.7",
+ "hash-base": {
+ "version": "3.1.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1"
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
}
},
- "npmlog": {
- "version": "4.1.2",
+ "hash.js": {
+ "version": "1.1.7",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
}
},
- "number-is-nan": {
+ "hmac-drbg": {
"version": "1.0.1",
"bundled": true,
"dev": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "optional": true,
"requires": {
- "wrappy": "1"
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
}
},
- "os-homedir": {
- "version": "1.0.2",
+ "inherits": {
+ "version": "2.0.4",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "os-tmpdir": {
- "version": "1.0.2",
+ "invert-kv": {
+ "version": "2.0.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "osenv": {
- "version": "0.1.5",
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "is-hex-prefixed": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "keccak": {
+ "version": "3.0.1",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
}
},
- "path-is-absolute": {
- "version": "1.0.1",
+ "lcid": {
+ "version": "2.0.0",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "invert-kv": "^2.0.0"
+ }
},
- "process-nextick-args": {
- "version": "2.0.1",
+ "locate-path": {
+ "version": "3.0.0",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
},
- "rc": {
- "version": "1.2.8",
+ "map-age-cleaner": {
+ "version": "0.1.3",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
+ "p-defer": "^1.0.0"
}
},
- "readable-stream": {
- "version": "2.3.6",
+ "md5.js": {
+ "version": "1.3.5",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "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"
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
}
},
- "rimraf": {
- "version": "2.7.1",
+ "mem": {
+ "version": "4.3.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "glob": "^7.1.3"
+ "map-age-cleaner": "^0.1.1",
+ "mimic-fn": "^2.0.0",
+ "p-is-promise": "^2.0.0"
}
},
- "safe-buffer": {
- "version": "5.1.2",
+ "mimic-fn": {
+ "version": "2.1.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "safer-buffer": {
- "version": "2.1.2",
+ "minimalistic-assert": {
+ "version": "1.0.1",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "sax": {
- "version": "1.2.4",
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "semver": {
- "version": "5.7.1",
+ "nice-try": {
+ "version": "1.0.5",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "set-blocking": {
- "version": "2.0.0",
+ "node-addon-api": {
+ "version": "2.0.2",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "signal-exit": {
- "version": "3.0.2",
+ "node-gyp-build": {
+ "version": "4.2.3",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "string-width": {
- "version": "1.0.2",
+ "npm-run-path": {
+ "version": "2.0.2",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
+ "path-key": "^2.0.0"
}
},
- "string_decoder": {
- "version": "1.1.1",
+ "once": {
+ "version": "1.4.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "safe-buffer": "~5.1.0"
+ "wrappy": "1"
}
},
- "strip-ansi": {
- "version": "3.0.1",
+ "os-locale": {
+ "version": "3.1.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "ansi-regex": "^2.0.0"
+ "execa": "^1.0.0",
+ "lcid": "^2.0.0",
+ "mem": "^4.0.0"
}
},
- "strip-json-comments": {
- "version": "2.0.1",
+ "p-defer": {
+ "version": "1.0.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "tar": {
- "version": "4.4.13",
+ "p-finally": {
+ "version": "1.0.0",
"bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "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"
- }
+ "dev": true
},
- "util-deprecate": {
- "version": "1.0.2",
+ "p-is-promise": {
+ "version": "2.1.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
- "wide-align": {
- "version": "1.1.3",
+ "p-limit": {
+ "version": "2.3.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "string-width": "^1.0.2 || 2"
+ "p-try": "^2.0.0"
}
},
- "wrappy": {
- "version": "1.0.2",
+ "p-locate": {
+ "version": "3.0.0",
"bundled": true,
"dev": true,
- "optional": true
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
},
- "yallist": {
- "version": "3.1.1",
+ "p-try": {
+ "version": "2.2.0",
"bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
- },
- "ganache-cli": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.9.1.tgz",
- "integrity": "sha512-VPBumkNUZzXDRQwVOby5YyQpd5t1clkr06xMgB28lZdEIn5ht1GMwUskOTFOAxdkQ4J12IWP0gdeacVRGowqbA==",
- "dev": true,
- "requires": {
- "ethereumjs-util": "6.1.0",
- "source-map-support": "0.5.12",
- "yargs": "13.2.4"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
"bundled": true,
"dev": true
},
- "ansi-styles": {
- "version": "3.2.1",
+ "path-key": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "pbkdf2": {
+ "version": "3.1.1",
"bundled": true,
"dev": true,
"requires": {
- "color-convert": "^1.9.0"
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
}
},
- "bindings": {
- "version": "1.5.0",
+ "pump": {
+ "version": "3.0.0",
"bundled": true,
"dev": true,
"requires": {
- "file-uri-to-path": "1.0.0"
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
- "bip66": {
- "version": "1.1.5",
+ "randombytes": {
+ "version": "2.1.0",
"bundled": true,
"dev": true,
"requires": {
- "safe-buffer": "^5.0.1"
+ "safe-buffer": "^5.1.0"
}
},
- "bn.js": {
- "version": "4.11.8",
+ "readable-stream": {
+ "version": "3.6.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
"bundled": true,
"dev": true
},
- "brorand": {
- "version": "1.1.0",
+ "require-main-filename": {
+ "version": "2.0.0",
"bundled": true,
"dev": true
},
- "browserify-aes": {
- "version": "1.2.0",
+ "ripemd160": {
+ "version": "2.0.2",
"bundled": true,
"dev": true,
"requires": {
- "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"
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
}
},
- "buffer-from": {
- "version": "1.1.1",
+ "rlp": {
+ "version": "2.2.6",
"bundled": true,
- "dev": true
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.11.1"
+ }
},
- "buffer-xor": {
- "version": "1.0.3",
+ "safe-buffer": {
+ "version": "5.2.1",
"bundled": true,
"dev": true
},
- "camelcase": {
- "version": "5.3.1",
+ "scrypt-js": {
+ "version": "3.0.1",
"bundled": true,
"dev": true
},
- "cipher-base": {
- "version": "1.0.4",
+ "secp256k1": {
+ "version": "4.0.2",
"bundled": true,
"dev": true,
"requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
+ "elliptic": "^6.5.2",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
}
},
- "cliui": {
- "version": "5.0.0",
+ "semver": {
+ "version": "5.7.1",
"bundled": true,
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
+ "dev": true
},
- "color-convert": {
- "version": "1.9.3",
- "bundled": true,
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
+ "set-blocking": {
+ "version": "2.0.0",
"bundled": true,
"dev": true
},
- "create-hash": {
- "version": "1.2.0",
+ "setimmediate": {
+ "version": "1.0.5",
"bundled": true,
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
+ "dev": true
},
- "create-hmac": {
- "version": "1.1.7",
+ "sha.js": {
+ "version": "2.4.11",
"bundled": true,
"dev": true,
"requires": {
- "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-spawn": {
- "version": "6.0.5",
- "bundled": true,
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
+ "safe-buffer": "^5.0.1"
}
},
- "decamelize": {
+ "shebang-command": {
"version": "1.2.0",
"bundled": true,
- "dev": true
- },
- "drbg.js": {
- "version": "1.0.1",
- "bundled": true,
"dev": true,
"requires": {
- "browserify-aes": "^1.0.6",
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4"
+ "shebang-regex": "^1.0.0"
}
},
- "elliptic": {
- "version": "6.5.0",
+ "shebang-regex": {
+ "version": "1.0.0",
"bundled": true,
- "dev": true,
- "requires": {
- "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"
- }
+ "dev": true
},
- "emoji-regex": {
- "version": "7.0.3",
+ "signal-exit": {
+ "version": "3.0.3",
"bundled": true,
"dev": true
},
- "end-of-stream": {
- "version": "1.4.1",
+ "source-map": {
+ "version": "0.6.1",
"bundled": true,
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
+ "dev": true
},
- "ethereumjs-util": {
- "version": "6.1.0",
+ "source-map-support": {
+ "version": "0.5.12",
"bundled": true,
"dev": true,
"requires": {
- "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"
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
}
},
- "ethjs-util": {
- "version": "0.1.6",
+ "string-width": {
+ "version": "3.1.0",
"bundled": true,
"dev": true,
"requires": {
- "is-hex-prefixed": "1.0.0",
- "strip-hex-prefix": "1.0.0"
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
}
},
- "evp_bytestokey": {
- "version": "1.0.3",
+ "string_decoder": {
+ "version": "1.3.0",
"bundled": true,
"dev": true,
"requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
+ "safe-buffer": "~5.2.0"
}
},
- "execa": {
- "version": "1.0.0",
+ "strip-ansi": {
+ "version": "5.2.0",
"bundled": true,
"dev": true,
"requires": {
- "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"
+ "ansi-regex": "^4.1.0"
}
},
- "file-uri-to-path": {
+ "strip-eof": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
- "find-up": {
- "version": "3.0.0",
+ "strip-hex-prefix": {
+ "version": "1.0.0",
"bundled": true,
"dev": true,
"requires": {
- "locate-path": "^3.0.0"
+ "is-hex-prefixed": "1.0.0"
}
},
- "get-caller-file": {
- "version": "2.0.5",
+ "util-deprecate": {
+ "version": "1.0.2",
"bundled": true,
"dev": true
},
- "get-stream": {
- "version": "4.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "hash-base": {
- "version": "3.0.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "hash.js": {
- "version": "1.1.7",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "hmac-drbg": {
- "version": "1.0.1",
+ "which": {
+ "version": "1.3.1",
"bundled": true,
"dev": true,
"requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
+ "isexe": "^2.0.0"
}
},
- "inherits": {
- "version": "2.0.4",
- "bundled": true,
- "dev": true
- },
- "invert-kv": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "is-hex-prefixed": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "is-stream": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "isexe": {
+ "which-module": {
"version": "2.0.0",
"bundled": true,
"dev": true
},
- "keccak": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "bindings": "^1.2.1",
- "inherits": "^2.0.3",
- "nan": "^2.2.1",
- "safe-buffer": "^5.1.0"
- }
- },
- "lcid": {
- "version": "2.0.0",
+ "wrap-ansi": {
+ "version": "5.1.0",
"bundled": true,
"dev": true,
"requires": {
- "invert-kv": "^2.0.0"
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
}
},
- "locate-path": {
- "version": "3.0.0",
+ "wrappy": {
+ "version": "1.0.2",
"bundled": true,
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
+ "dev": true
},
- "map-age-cleaner": {
- "version": "0.1.3",
+ "y18n": {
+ "version": "4.0.0",
"bundled": true,
- "dev": true,
- "requires": {
- "p-defer": "^1.0.0"
- }
+ "dev": true
},
- "md5.js": {
- "version": "1.3.5",
+ "yargs": {
+ "version": "13.2.4",
"bundled": true,
"dev": true,
"requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
+ "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"
}
},
- "mem": {
- "version": "4.3.0",
+ "yargs-parser": {
+ "version": "13.1.2",
"bundled": true,
"dev": true,
"requires": {
- "map-age-cleaner": "^0.1.1",
- "mimic-fn": "^2.0.0",
- "p-is-promise": "^2.0.0"
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
}
- },
- "mimic-fn": {
- "version": "2.1.0",
- "bundled": true,
- "dev": true
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "nan": {
- "version": "2.14.0",
- "bundled": true,
- "dev": true
- },
- "nice-try": {
- "version": "1.0.5",
- "bundled": true,
- "dev": true
- },
- "npm-run-path": {
- "version": "2.0.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-locale": {
- "version": "3.1.0",
- "bundled": true,
+ }
+ }
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.0.tgz",
+ "integrity": "sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "ghost-testrpc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz",
+ "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "node-emoji": "^1.10.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "requires": {
+ "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-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "^2.0.0",
+ "is-glob": "^2.0.0"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
"requires": {
- "execa": "^1.0.0",
- "lcid": "^2.0.0",
- "mem": "^4.0.0"
+ "is-glob": "^2.0.0"
}
},
- "p-defer": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "p-finally": {
+ "is-extglob": {
"version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "p-is-promise": {
- "version": "2.1.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
"dev": true
},
- "p-limit": {
- "version": "2.2.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "bundled": true,
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
- "p-limit": "^2.0.0"
+ "is-extglob": "^1.0.0"
}
- },
- "p-try": {
- "version": "2.2.0",
- "bundled": true,
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "bundled": true,
- "dev": true
- },
- "path-key": {
- "version": "2.0.1",
- "bundled": true,
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "requires": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "^3.0.0"
+ }
+ },
+ "global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
- "pump": {
- "version": "3.0.0",
- "bundled": true,
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
+ "isexe": "^2.0.0"
}
- },
- "require-directory": {
- "version": "2.1.1",
- "bundled": true,
+ }
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+ },
+ "globby": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+ "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.0.3",
+ "glob": "^7.1.3",
+ "ignore": "^5.1.1",
+ "merge2": "^1.2.3",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
},
- "require-main-filename": {
- "version": "2.0.0",
- "bundled": true,
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
- },
- "ripemd160": {
- "version": "2.0.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "rlp": {
- "version": "2.2.3",
- "bundled": true,
- "dev": true,
- "requires": {
- "bn.js": "^4.11.1",
- "safe-buffer": "^5.1.1"
- }
- },
- "safe-buffer": {
- "version": "5.2.0",
- "bundled": true,
- "dev": true
- },
- "secp256k1": {
- "version": "3.7.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "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"
- }
- },
- "semver": {
- "version": "5.7.0",
- "bundled": true,
- "dev": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "sha.js": {
- "version": "2.4.11",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "bundled": true,
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.12",
- "bundled": true,
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "string-width": {
- "version": "3.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "strip-hex-prefix": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "is-hex-prefixed": "1.0.0"
- }
- },
- "which": {
- "version": "1.3.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "y18n": {
- "version": "4.0.0",
- "bundled": true,
- "dev": true
- },
- "yargs": {
- "version": "13.2.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "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-parser": {
- "version": "13.1.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
}
}
},
- "gensync": {
- "version": "1.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
- "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
+ "got": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+ "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+ "requires": {
+ "@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"
+ }
},
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
- "dev": true
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
- "get-port": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
- "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=",
- "dev": true
+ "growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
},
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "handlebars": {
+ "version": "4.7.6",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
+ "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
+ "dev": true,
"requires": {
- "pump": "^3.0.0"
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.0",
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4",
+ "wordwrap": "^1.0.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
}
},
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"requires": {
- "assert-plus": "^1.0.0"
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
}
},
- "ghost-testrpc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz",
- "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==",
- "dev": true,
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
- "chalk": "^2.4.2",
- "node-emoji": "^1.10.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "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-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "dev": true,
- "requires": {
- "glob-parent": "^2.0.0",
- "is-glob": "^2.0.0"
- },
- "dependencies": {
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "requires": {
- "is-glob": "^2.0.0"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "^1.0.0"
- }
- }
- }
- },
- "glob-parent": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
- "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "global": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
- "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
- "requires": {
- "min-document": "^2.19.0",
- "process": "~0.5.1"
- }
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- }
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
- },
- "globby": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
- "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
- "dev": true,
- "requires": {
- "@types/glob": "^7.1.1",
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
- "slash": "^3.0.0"
- },
- "dependencies": {
- "ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- }
- }
- },
- "got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "requires": {
- "@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"
- }
- },
- "graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
- },
- "graceful-readlink": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
- },
- "growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
- },
- "handlebars": {
- "version": "4.7.6",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
- "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.0",
- "source-map": "^0.6.1",
- "uglify-js": "^3.1.4",
- "wordwrap": "^1.0.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
- },
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
- "function-bind": "^1.1.1"
+ "function-bind": "^1.1.1"
}
},
"has-ansi": {
@@ -7662,6 +8698,12 @@
"kind-of": "^4.0.0"
},
"dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
@@ -7694,12 +8736,20 @@
}
},
"hash-base": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
- "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
"requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
}
},
"hash.js": {
@@ -7711,20 +8761,10 @@
"minimalistic-assert": "^1.0.1"
}
},
- "hdkey": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.2.tgz",
- "integrity": "sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ==",
- "requires": {
- "bs58check": "^2.1.2",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
- }
- },
"he": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
- "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
},
"hmac-drbg": {
"version": "1.0.1",
@@ -7802,9 +8842,9 @@
},
"dependencies": {
"@types/node": {
- "version": "10.17.19",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz",
- "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==",
+ "version": "10.17.51",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz",
+ "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==",
"dev": true
}
}
@@ -7843,9 +8883,9 @@
}
},
"ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"ignore": {
"version": "4.0.6",
@@ -7854,14 +8894,14 @@
"dev": true
},
"immediate": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz",
- "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw="
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
+ "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q=="
},
"import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
- "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
@@ -7889,27 +8929,27 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"inquirer": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
- "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
+ "version": "7.3.3",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+ "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
"dev": true,
"requires": {
"ansi-escapes": "^4.2.1",
- "chalk": "^3.0.0",
+ "chalk": "^4.1.0",
"cli-cursor": "^3.1.0",
- "cli-width": "^2.0.0",
+ "cli-width": "^3.0.0",
"external-editor": "^3.0.3",
"figures": "^3.0.0",
- "lodash": "^4.17.15",
+ "lodash": "^4.17.19",
"mute-stream": "0.0.8",
"run-async": "^2.4.0",
- "rxjs": "^6.5.3",
+ "rxjs": "^6.6.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0",
"through": "^2.3.6"
@@ -7931,19 +8971,18 @@
"dev": true
},
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -7965,12 +9004,35 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -7981,9 +9043,9 @@
}
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -7998,9 +9060,9 @@
}
},
"interpret": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
- "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true
},
"invariant": {
@@ -8032,9 +9094,12 @@
}
},
"is-arguments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
- "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA=="
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+ "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+ "requires": {
+ "call-bind": "^1.0.0"
+ }
},
"is-arrayish": {
"version": "0.2.1",
@@ -8043,24 +9108,30 @@
"dev": true
},
"is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "dev": true,
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"requires": {
- "binary-extensions": "^1.0.0"
+ "binary-extensions": "^2.0.0"
}
},
"is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
},
"is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q=="
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
+ },
+ "is-core-module": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+ "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+ "requires": {
+ "has": "^1.0.3"
+ }
},
"is-data-descriptor": {
"version": "0.1.4",
@@ -8125,8 +9196,7 @@
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
},
"is-finite": {
"version": "1.1.0",
@@ -8139,21 +9209,19 @@
"integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw="
},
"is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
},
"is-function": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz",
- "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU="
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
},
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
@@ -8163,24 +9231,30 @@
"resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
"integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ="
},
+ "is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg=="
+ },
"is-natural-number": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
"integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg="
},
+ "is-negative-zero": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
+ },
"is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"is-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
- "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
+ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA=="
},
"is-plain-obj": {
"version": "1.1.0",
@@ -8216,11 +9290,6 @@
"integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
"dev": true
},
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
"is-regex": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
@@ -8234,6 +9303,11 @@
"resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
"integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
},
+ "is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g=="
+ },
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -8242,8 +9316,7 @@
"is-string": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
- "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
- "dev": true
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
},
"is-symbol": {
"version": "1.0.3",
@@ -8272,8 +9345,7 @@
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
},
"isobject": {
"version": "2.1.0",
@@ -8298,6 +9370,20 @@
"is-object": "^1.0.1"
}
},
+ "iterate-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz",
+ "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw=="
+ },
+ "iterate-value": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz",
+ "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==",
+ "requires": {
+ "es-get-iterator": "^1.0.2",
+ "iterate-iterator": "^1.0.1"
+ }
+ },
"js-sha3": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
@@ -8315,10 +9401,9 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "dev": true,
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -8346,15 +9431,11 @@
"dev": true
},
"json-rpc-engine": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz",
- "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==",
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz",
+ "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==",
"requires": {
- "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",
+ "eth-rpc-errors": "^3.0.0",
"safe-event-emitter": "^1.0.1"
}
},
@@ -8401,11 +9482,11 @@
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"json5": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
- "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
"requires": {
- "minimist": "^1.2.0"
+ "minimist": "^1.2.5"
}
},
"jsonfile": {
@@ -8422,9 +9503,9 @@
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
},
"jsonschema": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.6.tgz",
- "integrity": "sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz",
+ "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==",
"dev": true
},
"jsprim": {
@@ -8439,14 +9520,12 @@
}
},
"keccak": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz",
- "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz",
+ "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==",
"requires": {
- "bindings": "^1.2.1",
- "inherits": "^2.0.3",
- "nan": "^2.2.1",
- "safe-buffer": "^5.1.0"
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
}
},
"keyv": {
@@ -8464,6 +9543,14 @@
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ }
}
},
"lcid": {
@@ -8602,13 +9689,13 @@
}
},
"levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
}
},
"load-json-file": {
@@ -8641,9 +9728,14 @@
}
},
"lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+ },
+ "lodash.flatmap": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz",
+ "integrity": "sha1-74y/QI9uSCaGYzRTBcaswLd4cC4="
},
"lodash.toarray": {
"version": "4.4.0",
@@ -8652,12 +9744,56 @@
"dev": true
},
"log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
"requires": {
- "chalk": "^2.4.2"
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"loose-envify": {
@@ -8674,31 +9810,22 @@
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
},
"lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
+ "yallist": "^4.0.0"
},
"dependencies": {
"yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
},
- "lru-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
- "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
- "requires": {
- "es5-ext": "~0.10.2"
- }
- },
"ltgt": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
@@ -8821,30 +9948,15 @@
}
}
},
- "memoizee": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
- "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.45",
- "es6-weak-map": "^2.0.2",
- "event-emitter": "^0.3.5",
- "is-promise": "^2.1",
- "lru-queue": "0.1",
- "next-tick": "1",
- "timers-ext": "^0.1.5"
- }
- },
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
"merkle-patricia-tree": {
@@ -8868,17 +9980,39 @@
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
},
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "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"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
}
}
}
@@ -8909,6 +10043,17 @@
"regex-cache": "^0.4.2"
},
"dependencies": {
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "^1.8.1",
+ "preserve": "^0.2.0",
+ "repeat-element": "^1.1.2"
+ }
+ },
"is-extglob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
@@ -8923,6 +10068,15 @@
"requires": {
"is-extglob": "^1.0.0"
}
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
}
}
},
@@ -8941,16 +10095,16 @@
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
- "version": "1.43.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
- "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
+ "version": "1.45.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+ "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
},
"mime-types": {
- "version": "2.1.26",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
- "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+ "version": "2.1.28",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
+ "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
"requires": {
- "mime-db": "1.43.0"
+ "mime-db": "1.45.0"
}
},
"mimic-fn": {
@@ -9047,87 +10201,166 @@
}
},
"mocha": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
- "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz",
+ "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==",
"requires": {
+ "ansi-colors": "4.1.1",
"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",
+ "chokidar": "3.4.2",
+ "debug": "4.1.1",
+ "diff": "4.0.2",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.1.6",
"growl": "1.10.5",
- "he": "1.1.1",
+ "he": "1.2.0",
+ "js-yaml": "3.14.0",
+ "log-symbols": "4.0.0",
"minimatch": "3.0.4",
- "mkdirp": "0.5.1",
- "supports-color": "5.4.0"
+ "ms": "2.1.2",
+ "object.assign": "4.1.0",
+ "promise.allsettled": "1.0.2",
+ "serialize-javascript": "4.0.0",
+ "strip-json-comments": "3.0.1",
+ "supports-color": "7.1.0",
+ "which": "2.0.2",
+ "wide-align": "1.1.3",
+ "workerpool": "6.0.0",
+ "yargs": "13.3.2",
+ "yargs-parser": "13.1.2",
+ "yargs-unparser": "1.6.1"
},
"dependencies": {
- "commander": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
- "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
- },
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
},
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"requires": {
- "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"
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
}
},
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"requires": {
- "minimist": "0.0.8"
+ "p-locate": "^5.0.0"
}
},
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
},
"supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "^4.0.0"
}
}
}
},
"mock-fs": {
- "version": "4.11.0",
- "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.11.0.tgz",
- "integrity": "sha512-Yp4o3/ZA15wsXqJTT+R+9w2AYIkD1i80Lds47wDbuUhOvQvm+O2EfjFZSz0pMgZZSPHRhGxgcd2+GL4+jZMtdw=="
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.13.0.tgz",
+ "integrity": "sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA=="
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
+ "multibase": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz",
+ "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==",
+ "dev": true,
+ "requires": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ },
+ "multicodec": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz",
+ "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==",
+ "dev": true,
+ "requires": {
+ "varint": "^5.0.0"
+ }
+ },
+ "multihashes": {
+ "version": "0.4.21",
+ "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz",
+ "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==",
+ "dev": true,
+ "requires": {
+ "buffer": "^5.5.0",
+ "multibase": "^0.7.0",
+ "varint": "^5.0.0"
+ },
+ "dependencies": {
+ "multibase": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz",
+ "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==",
+ "dev": true,
+ "requires": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ }
+ }
+ },
"mute-stream": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
@@ -9135,9 +10368,9 @@
"dev": true
},
"nan": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
- "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
+ "version": "2.14.2",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
+ "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
},
"nano-json-stream-parser": {
"version": "0.1.2",
@@ -9195,9 +10428,9 @@
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"neo-async": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
- "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
"next-tick": {
@@ -9211,6 +10444,11 @@
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
+ "node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+ },
"node-emoji": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz",
@@ -9235,25 +10473,20 @@
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
"integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U="
},
+ "node-gyp-build": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
+ "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
+ },
"node-modules-regexp": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
"integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA="
},
"node-releases": {
- "version": "1.1.52",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz",
- "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==",
- "requires": {
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
+ "version": "1.1.70",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz",
+ "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw=="
},
"nopt": {
"version": "3.0.6",
@@ -9277,13 +10510,9 @@
}
},
"normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
},
"normalize-url": {
"version": "4.5.0",
@@ -9359,32 +10588,12 @@
"integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
},
"object-is": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
- "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz",
+ "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==",
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
- "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- }
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
}
},
"object-keys": {
@@ -9410,36 +10619,37 @@
}
},
"object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
"requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
}
},
"object.entries": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz",
- "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz",
+ "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.0",
"define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
+ "es-abstract": "^1.18.0-next.1",
"has": "^1.0.3"
}
},
"object.getownpropertydescriptors": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
- "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz",
+ "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.0",
"define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
+ "es-abstract": "^1.18.0-next.1"
}
},
"object.omit": {
@@ -9470,14 +10680,14 @@
}
},
"object.values": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
- "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz",
+ "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.0",
"define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
+ "es-abstract": "^1.18.0-next.1",
"has": "^1.0.3"
}
},
@@ -9506,26 +10716,26 @@
}
},
"onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
"requires": {
"mimic-fn": "^2.1.0"
}
},
"optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"dev": true,
"requires": {
- "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"
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
}
},
"original-require": {
@@ -9580,7 +10790,32 @@
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
"dev": true
- }
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ }
}
},
"os-tmpdir": {
@@ -9599,9 +10834,9 @@
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
},
"p-limit": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
- "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"requires": {
"p-try": "^2.0.0"
}
@@ -9637,13 +10872,12 @@
}
},
"parse-asn1": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
- "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
"requires": {
- "asn1.js": "^4.0.0",
+ "asn1.js": "^5.2.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"
@@ -9759,9 +10993,9 @@
}
},
"pbkdf2": {
- "version": "3.0.17",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
- "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+ "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
"requires": {
"create-hash": "^1.1.2",
"create-hmac": "^1.1.4",
@@ -9787,10 +11021,9 @@
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"picomatch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
- "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
- "dev": true
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
},
"pify": {
"version": "4.0.1",
@@ -9838,9 +11071,9 @@
"integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw="
},
"prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
"prepend-http": {
@@ -9867,9 +11100,9 @@
"integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
},
"process": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
- "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8="
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
},
"process-nextick-args": {
"version": "2.0.1",
@@ -9900,6 +11133,51 @@
"set-immediate-shim": "^1.0.1"
}
},
+ "promise.allsettled": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz",
+ "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==",
+ "requires": {
+ "array.prototype.map": "^1.0.1",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "iterate-value": "^1.0.0"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
+ "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
+ }
+ }
+ },
"proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
@@ -9921,9 +11199,9 @@
"dev": true
},
"psl": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
- "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ=="
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
},
"public-encrypt": {
"version": "4.0.3",
@@ -10102,498 +11380,199 @@
}
},
"readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"requires": {
- "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"
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
}
},
"readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+ "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "^1.1.6"
+ }
+ },
+ "recursive-readdir": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
+ "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "redeyed": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
+ "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
+ "dev": true,
+ "requires": {
+ "esprima": "~4.0.0"
+ }
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "regenerate-unicode-properties": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+ "requires": {
+ "regenerate": "^1.4.0"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+ },
+ "regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "requires": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "^0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regexp.prototype.flags": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+ "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+ "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+ "requires": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.2.0",
+ "regjsgen": "^0.5.1",
+ "regjsparser": "^0.6.4",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.2.0"
+ }
+ },
+ "regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
+ },
+ "regjsparser": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.6.tgz",
+ "integrity": "sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ==",
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+ }
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "req-cwd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz",
+ "integrity": "sha1-1AgrTURZgDZkD7c93qAe1T20nrw=",
+ "dev": true,
+ "requires": {
+ "req-from": "^2.0.0"
+ }
+ },
+ "req-from": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz",
+ "integrity": "sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
+ "resolve-from": "^3.0.0"
},
"dependencies": {
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
"dev": true
}
}
},
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "dev": true,
- "requires": {
- "resolve": "^1.1.6"
- }
- },
- "recursive-readdir": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
- "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
- "dev": true,
- "requires": {
- "minimatch": "3.0.4"
- }
- },
- "redeyed": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
- "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
- "dev": true,
- "requires": {
- "esprima": "~4.0.0"
- }
- },
- "regenerate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
- "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
- },
- "regenerate-unicode-properties": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
- "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
- "requires": {
- "regenerate": "^1.4.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "regenerator-transform": {
- "version": "0.14.3",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.3.tgz",
- "integrity": "sha512-zXHNKJspmONxBViAb3ZUmFoFPnTBs3zFhCEZJiwp/gkNzxVbTqNJVjYKx6Qk1tQ1P4XLf4TbH9+KBB7wGoAaUw==",
- "requires": {
- "@babel/runtime": "^7.8.4",
- "private": "^0.1.8"
- }
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "dev": true,
- "requires": {
- "is-equal-shallow": "^0.1.3"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexp.prototype.flags": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
- "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
- "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
- "dev": true
- },
- "regexpu-core": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
- "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
- "requires": {
- "regenerate": "^1.4.0",
- "regenerate-unicode-properties": "^8.2.0",
- "regjsgen": "^0.5.1",
- "regjsparser": "^0.6.4",
- "unicode-match-property-ecmascript": "^1.0.4",
- "unicode-match-property-value-ecmascript": "^1.2.0"
- }
- },
- "regjsgen": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
- "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg=="
- },
- "regjsparser": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
- "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
- }
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
- "dev": true
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "requires": {
- "is-finite": "^1.0.0"
- }
- },
- "req-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz",
- "integrity": "sha1-1AgrTURZgDZkD7c93qAe1T20nrw=",
- "dev": true,
- "requires": {
- "req-from": "^2.0.0"
- }
- },
- "req-from": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz",
- "integrity": "sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA=",
- "dev": true,
- "requires": {
- "resolve-from": "^3.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
- "dev": true
- }
- }
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
@@ -10625,33 +11604,33 @@
}
},
"request-promise": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.5.tgz",
- "integrity": "sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg==",
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz",
+ "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==",
"dev": true,
"requires": {
"bluebird": "^3.5.0",
- "request-promise-core": "1.1.3",
+ "request-promise-core": "1.1.4",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
}
},
"request-promise-core": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
- "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+ "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
"dev": true,
"requires": {
- "lodash": "^4.17.15"
+ "lodash": "^4.17.19"
}
},
"request-promise-native": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz",
- "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+ "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
"dev": true,
"requires": {
- "request-promise-core": "1.1.3",
+ "request-promise-core": "1.1.4",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
}
@@ -10659,20 +11638,19 @@
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
},
"require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
},
"resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+ "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
"requires": {
+ "is-core-module": "^2.1.0",
"path-parse": "^1.0.6"
}
},
@@ -10745,26 +11723,23 @@
}
},
"rlp": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz",
- "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==",
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz",
+ "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==",
"requires": {
"bn.js": "^4.11.1"
}
},
"run-async": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
- "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
- "dev": true,
- "requires": {
- "is-promise": "^2.1.0"
- }
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true
},
"run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
"dev": true
},
"rustbn.js": {
@@ -10773,9 +11748,9 @@
"integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA=="
},
"rxjs": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
- "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+ "version": "6.6.3",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
+ "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
@@ -10884,54 +11859,22 @@
"requires": {
"has-flag": "^1.0.0"
}
- }
- }
- },
- "scrypt": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz",
- "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=",
- "optional": true,
- "requires": {
- "nan": "^2.0.8"
- }
- },
- "scrypt-js": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz",
- "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q="
- },
- "scrypt-shim": {
- "version": "github:web3-js/scrypt-shim#be5e616323a8b5e568788bf94d03c1b8410eac54",
- "from": "github:web3-js/scrypt-shim",
- "dev": true,
- "requires": {
- "scryptsy": "^2.1.0",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "scryptsy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz",
- "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==",
- "dev": true
},
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
}
}
},
- "scrypt.js": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.3.0.tgz",
- "integrity": "sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A==",
- "requires": {
- "scrypt": "^6.0.2",
- "scryptsy": "^1.2.1"
- }
+ "scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
},
"scryptsy": {
"version": "1.2.1",
@@ -10942,26 +11885,21 @@
}
},
"secp256k1": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz",
- "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz",
+ "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==",
"requires": {
- "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.5.2",
- "nan": "^2.14.0",
- "safe-buffer": "^5.1.2"
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
}
},
"seek-bzip": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
- "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
+ "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
"requires": {
- "commander": "~2.8.1"
+ "commander": "^2.8.1"
}
},
"semaphore": {
@@ -11016,6 +11954,14 @@
}
}
},
+ "serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
"serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
@@ -11042,8 +11988,7 @@
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
"set-immediate-shim": {
"version": "1.0.1",
@@ -11070,1558 +12015,609 @@
"requires": {
"is-extendable": "^0.1.0"
}
- }
- }
- },
- "setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
- },
- "sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "sha1": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
- "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=",
- "dev": true,
- "requires": {
- "charenc": ">= 0.0.1",
- "crypt": ">= 0.0.1"
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "dev": true,
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
- },
- "shelljs": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz",
- "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==",
- "dev": true,
- "requires": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- }
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "dev": true
- },
- "simple-concat": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
- "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
- },
- "simple-get": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
- "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
- "requires": {
- "decompress-response": "^3.3.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
- }
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
- },
- "slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- },
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- }
- }
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dev": true,
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "dev": true,
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dev": true,
- "requires": {
- "kind-of": "^3.2.0"
- }
- },
- "sol-digger": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz",
- "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=",
- "dev": true
- },
- "sol-explore": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz",
- "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=",
- "dev": true
- },
- "sol-merger": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/sol-merger/-/sol-merger-2.0.1.tgz",
- "integrity": "sha512-oab9qSiD+P+xZ0DKgxeYTggKAp+JWaVk849I0tL2oZtl+fEgiefu6wvOdTahwVwCWT+DYR0fiXeQ3Ee87je5Hw==",
- "requires": {
- "cli-color": "^1.4.0",
- "commander": "^4.0.1",
- "debug": "^4.1.1",
- "fs-extra": "^8.0.1",
- "glob": "^7.1.2",
- "solidity-parser-antlr": "^0.4.11",
- "strip-json-comments": "^3.0.1"
- },
- "dependencies": {
- "commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
- },
- "fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- }
- }
- },
- "solhint": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/solhint/-/solhint-2.3.1.tgz",
- "integrity": "sha512-wP/G+Dqj8LNWlCI9Mt6XiQRWQfZwv1rkZe/V+HKtip5SAZJVvp144PdH28KE45ZvR99Hhrp/Mujt74fSmXsFiw==",
- "dev": true,
- "requires": {
- "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",
- "prettier": "^1.14.3",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "acorn": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
- "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
- "dev": true
- },
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "dev": true,
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "commander": {
- "version": "2.18.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz",
- "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==",
- "dev": true
- },
- "eslint": {
- "version": "5.16.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
- "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
- "dev": true,
- "requires": {
- "@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"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
- }
- },
- "eslint-scope": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
- "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "espree": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
- "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
- "dev": true,
- "requires": {
- "acorn": "^6.0.7",
- "acorn-jsx": "^5.0.0",
- "eslint-visitor-keys": "^1.0.0"
- }
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "inquirer": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
- "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
- "dev": true
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "dev": true,
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "dev": true,
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
- }
- }
- },
- "solidity-coverage": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.4.tgz",
- "integrity": "sha512-eaYjKLJK7n+uAN9Xrm2kDujXOkxxBbHfNrjK+ZabU1DR4QWSVQiwDDF2JLciN943kkZdd2JOzJGp32NxCbdCWA==",
- "dev": true,
- "requires": {
- "@solidity-parser/parser": "^0.5.2",
- "@truffle/provider": "^0.1.17",
- "chalk": "^2.4.2",
- "death": "^1.1.0",
- "detect-port": "^1.3.0",
- "fs-extra": "^8.1.0",
- "ganache-cli": "6.9.0",
- "ghost-testrpc": "^0.0.2",
- "global-modules": "^2.0.0",
- "globby": "^10.0.1",
- "jsonschema": "^1.2.4",
- "lodash": "^4.17.15",
- "node-emoji": "^1.10.0",
- "pify": "^4.0.1",
- "recursive-readdir": "^2.2.2",
- "sc-istanbul": "^0.4.5",
- "shelljs": "^0.8.3",
- "web3": "1.2.6"
- },
- "dependencies": {
- "@types/node": {
- "version": "12.12.36",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.36.tgz",
- "integrity": "sha512-hmmypvyO/uTLFYCYu6Hlb3ydeJ11vXRxg8/WJ0E3wvwmPO0y47VqnfmXFVuWlysO0Zyj+je1Y33rQeuYkZ51GQ==",
- "dev": true
- },
- "eth-lib": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
- "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=",
- "dev": true,
- "requires": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "xhr-request-promise": "^0.1.2"
- }
- },
- "ethereumjs-tx": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz",
- "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==",
- "dev": true,
- "requires": {
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-util": "^6.0.0"
- }
- },
- "fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "ganache-cli": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.9.0.tgz",
- "integrity": "sha512-ZdL6kPrApXF/O+f6uU431OJcwxMk69H3KPDSHHrMP82ZvZRNpDHbR+rVv7XX/YUeoQ5q6nZ2AFiGiFAVn9pfzA==",
- "dev": true,
- "requires": {
- "ethereumjs-util": "6.1.0",
- "source-map-support": "0.5.12",
- "yargs": "13.2.4"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "bundled": true,
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "bindings": {
- "version": "1.5.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "file-uri-to-path": "1.0.0"
- }
- },
- "bip66": {
- "version": "1.1.5",
- "bundled": true,
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "bn.js": {
- "version": "4.11.8",
- "bundled": true,
- "dev": true
- },
- "brorand": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "browserify-aes": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "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"
- }
- },
- "buffer-from": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true
- },
- "buffer-xor": {
- "version": "1.0.3",
- "bundled": true,
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "bundled": true,
- "dev": true
- },
- "cipher-base": {
- "version": "1.0.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "cliui": {
- "version": "5.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "bundled": true,
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "bundled": true,
- "dev": true
- },
- "create-hash": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "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": {
- "version": "1.1.7",
- "bundled": true,
- "dev": true,
- "requires": {
- "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-spawn": {
- "version": "6.0.5",
- "bundled": true,
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true
- },
- "drbg.js": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "browserify-aes": "^1.0.6",
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4"
- }
- },
- "elliptic": {
- "version": "6.5.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "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": {
- "version": "7.0.3",
- "bundled": true,
- "dev": true
- },
- "end-of-stream": {
- "version": "1.4.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- },
- "ethereumjs-util": {
- "version": "6.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "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"
- }
- },
- "ethjs-util": {
- "version": "0.1.6",
- "bundled": true,
- "dev": true,
- "requires": {
- "is-hex-prefixed": "1.0.0",
- "strip-hex-prefix": "1.0.0"
- }
- },
- "evp_bytestokey": {
- "version": "1.0.3",
- "bundled": true,
- "dev": true,
- "requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "execa": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "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"
- }
- },
- "file-uri-to-path": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "find-up": {
- "version": "3.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "get-caller-file": {
- "version": "2.0.5",
- "bundled": true,
- "dev": true
- },
- "get-stream": {
- "version": "4.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "hash-base": {
- "version": "3.0.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "hash.js": {
- "version": "1.1.7",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "hmac-drbg": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "bundled": true,
- "dev": true
- },
- "invert-kv": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "is-hex-prefixed": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "is-stream": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "keccak": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "bindings": "^1.2.1",
- "inherits": "^2.0.3",
- "nan": "^2.2.1",
- "safe-buffer": "^5.1.0"
- }
- },
- "lcid": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "invert-kv": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "map-age-cleaner": {
- "version": "0.1.3",
- "bundled": true,
- "dev": true,
- "requires": {
- "p-defer": "^1.0.0"
- }
- },
- "md5.js": {
- "version": "1.3.5",
- "bundled": true,
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "mem": {
- "version": "4.3.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "map-age-cleaner": "^0.1.1",
- "mimic-fn": "^2.0.0",
- "p-is-promise": "^2.0.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "bundled": true,
- "dev": true
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "nan": {
- "version": "2.14.0",
- "bundled": true,
- "dev": true
- },
- "nice-try": {
- "version": "1.0.5",
- "bundled": true,
- "dev": true
- },
- "npm-run-path": {
- "version": "2.0.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-locale": {
- "version": "3.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "execa": "^1.0.0",
- "lcid": "^2.0.0",
- "mem": "^4.0.0"
- }
- },
- "p-defer": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "p-finally": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "p-is-promise": {
- "version": "2.1.0",
- "bundled": true,
- "dev": true
- },
- "p-limit": {
- "version": "2.2.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "bundled": true,
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "bundled": true,
- "dev": true
- },
- "path-key": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true
- },
- "pump": {
- "version": "3.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "bundled": true,
- "dev": true
- },
- "require-main-filename": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "ripemd160": {
- "version": "2.0.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "rlp": {
- "version": "2.2.3",
- "bundled": true,
- "dev": true,
- "requires": {
- "bn.js": "^4.11.1",
- "safe-buffer": "^5.1.1"
- }
- },
- "safe-buffer": {
- "version": "5.2.0",
- "bundled": true,
- "dev": true
- },
- "secp256k1": {
- "version": "3.7.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "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"
- }
- },
- "semver": {
- "version": "5.7.0",
- "bundled": true,
- "dev": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "sha.js": {
- "version": "2.4.11",
- "bundled": true,
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "bundled": true,
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.12",
- "bundled": true,
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "string-width": {
- "version": "3.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "strip-hex-prefix": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "is-hex-prefixed": "1.0.0"
- }
- },
- "which": {
- "version": "1.3.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "y18n": {
- "version": "4.0.0",
- "bundled": true,
- "dev": true
- },
- "yargs": {
- "version": "13.2.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "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-parser": {
- "version": "13.1.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
+ }
+ }
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "sha1": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
+ "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=",
+ "dev": true,
+ "requires": {
+ "charenc": ">= 0.0.1",
+ "crypt": ">= 0.0.1"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "shelljs": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
+ "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
+ },
+ "simple-get": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
+ "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
+ "requires": {
+ "decompress-response": "^3.3.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+ },
+ "slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
}
},
- "uuid": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
- "dev": true
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
},
- "web3": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.6.tgz",
- "integrity": "sha512-tpu9fLIComgxGrFsD8LUtA4s4aCZk7px8UfcdEy6kS2uDi/ZfR07KJqpXZMij7Jvlq+cQrTAhsPSiBVvoMaivA==",
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "@types/node": "^12.6.1",
- "web3-bzz": "1.2.6",
- "web3-core": "1.2.6",
- "web3-eth": "1.2.6",
- "web3-eth-personal": "1.2.6",
- "web3-net": "1.2.6",
- "web3-shh": "1.2.6",
- "web3-utils": "1.2.6"
+ "is-extendable": "^0.1.0"
}
},
- "web3-bzz": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.6.tgz",
- "integrity": "sha512-9NiHLlxdI1XeFtbPJAmi2jnnIHVF+GNy517wvOS72P7ZfuJTPwZaSNXfT01vWgPPE9R96/uAHDWHOg+T4WaDQQ==",
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "@types/node": "^10.12.18",
- "got": "9.6.0",
- "swarm-js": "0.1.39",
- "underscore": "1.9.1"
- },
- "dependencies": {
- "@types/node": {
- "version": "10.17.20",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.20.tgz",
- "integrity": "sha512-XgDgo6W10SeGEAM0k7FosJpvLCynOTYns4Xk3J5HGrA+UI/bKZ30PGMzOP5Lh2zs4259I71FSYLAtjnx3qhObw==",
- "dev": true
- }
+ "is-descriptor": "^1.0.0"
}
},
- "web3-core": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.6.tgz",
- "integrity": "sha512-y/QNBFtr5cIR8vxebnotbjWJpOnO8LDYEAzZjeRRUJh2ijmhjoYk7dSNx9ExgC0UCfNFRoNCa9dGRu/GAxwRlw==",
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "@types/bn.js": "^4.11.4",
- "@types/node": "^12.6.1",
- "web3-core-helpers": "1.2.6",
- "web3-core-method": "1.2.6",
- "web3-core-requestmanager": "1.2.6",
- "web3-utils": "1.2.6"
+ "kind-of": "^6.0.0"
}
},
- "web3-core-helpers": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.6.tgz",
- "integrity": "sha512-gYKWmC2HmO7RcDzpo4L1K8EIoy5L8iubNDuTC6q69UxczwqKF/Io0kbK/1Z10Av++NlzOSiuyGp2gc4t4UOsDw==",
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "underscore": "1.9.1",
- "web3-eth-iban": "1.2.6",
- "web3-utils": "1.2.6"
+ "kind-of": "^6.0.0"
}
},
- "web3-core-method": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.6.tgz",
- "integrity": "sha512-r2dzyPEonqkBg7Mugq5dknhV5PGaZTHBZlS/C+aMxNyQs3T3eaAsCTqlQDitwNUh/sUcYPEGF0Vo7ahYK4k91g==",
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ }
+ },
+ "sol-digger": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz",
+ "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=",
+ "dev": true
+ },
+ "sol-explore": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz",
+ "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=",
+ "dev": true
+ },
+ "solhint": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.2.tgz",
+ "integrity": "sha512-8tHCkIAk1axLLG6Qu2WIH3GgNABonj9eAWejJbov3o3ujkZQRNHeHU1cC4/Dmjsh3Om7UzFFeADUHu2i7ZJeiw==",
+ "dev": true,
+ "requires": {
+ "@solidity-parser/parser": "^0.8.2",
+ "ajv": "^6.6.1",
+ "antlr4": "4.7.1",
+ "ast-parents": "0.0.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",
+ "prettier": "^1.14.3",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "@solidity-parser/parser": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.8.2.tgz",
+ "integrity": "sha512-8LySx3qrNXPgB5JiULfG10O3V7QTxI/TLzSw5hFQhXWSkVxZBAv4rZQ0sYgLEbc8g3L2lmnujj1hKul38Eu5NQ==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"dev": true,
"requires": {
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.6",
- "web3-core-promievent": "1.2.6",
- "web3-core-subscriptions": "1.2.6",
- "web3-utils": "1.2.6"
+ "restore-cursor": "^2.0.0"
}
},
- "web3-core-promievent": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.6.tgz",
- "integrity": "sha512-km72kJef/qtQNiSjDJJVHIZvoVOm6ytW3FCYnOcCs7RIkviAb5JYlPiye0o4pJOLzCXYID7DK7Q9bhY8qWb1lw==",
+ "cli-width": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
+ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.18.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz",
+ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
+ "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
"dev": true,
"requires": {
- "any-promise": "1.3.0",
- "eventemitter3": "3.1.2"
+ "@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"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
}
},
- "web3-core-requestmanager": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.6.tgz",
- "integrity": "sha512-QU2cbsj9Dm0r6om40oSwk8Oqbp3wTa08tXuMpSmeOTkGZ3EMHJ1/4LiJ8shwg1AvPMrKVU0Nri6+uBNCdReZ+g==",
+ "eslint-scope": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+ "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
"dev": true,
"requires": {
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.6",
- "web3-providers-http": "1.2.6",
- "web3-providers-ipc": "1.2.6",
- "web3-providers-ws": "1.2.6"
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
}
},
- "web3-core-subscriptions": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.6.tgz",
- "integrity": "sha512-M0PzRrP2Ct13x3wPulFtc5kENH4UtnPxO9YxkfQlX2WRKENWjt4Rfq+BCVGYEk3rTutDfWrjfzjmqMRvXqEY5Q==",
+ "eslint-utils": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+ "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
"dev": true,
"requires": {
- "eventemitter3": "3.1.2",
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.6"
+ "eslint-visitor-keys": "^1.1.0"
}
},
- "web3-eth": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.6.tgz",
- "integrity": "sha512-ROWlDPzh4QX6tlGGGlAK6X4kA2n0/cNj/4kb0nNVWkRouGmYO0R8k6s47YxYHvGiXt0s0++FUUv5vAbWovtUQw==",
+ "espree": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
+ "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
"dev": true,
"requires": {
- "underscore": "1.9.1",
- "web3-core": "1.2.6",
- "web3-core-helpers": "1.2.6",
- "web3-core-method": "1.2.6",
- "web3-core-subscriptions": "1.2.6",
- "web3-eth-abi": "1.2.6",
- "web3-eth-accounts": "1.2.6",
- "web3-eth-contract": "1.2.6",
- "web3-eth-ens": "1.2.6",
- "web3-eth-iban": "1.2.6",
- "web3-eth-personal": "1.2.6",
- "web3-net": "1.2.6",
- "web3-utils": "1.2.6"
+ "acorn": "^6.0.7",
+ "acorn-jsx": "^5.0.0",
+ "eslint-visitor-keys": "^1.0.0"
}
},
- "web3-eth-abi": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz",
- "integrity": "sha512-w9GAyyikn8nSifSDZxAvU9fxtQSX+W2xQWMmrtTXmBGCaE4/ywKOSPAO78gq8AoU4Wq5yqVGKZLLbfpt7/sHlA==",
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
"dev": true,
"requires": {
- "ethers": "4.0.0-beta.3",
- "underscore": "1.9.1",
- "web3-utils": "1.2.6"
+ "escape-string-regexp": "^1.0.5"
}
},
- "web3-eth-accounts": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.6.tgz",
- "integrity": "sha512-cDVtonHRgzqi/ZHOOf8kfCQWFEipcfQNAMzXIaKZwc0UUD9mgSI5oJrN45a89Ze+E6Lz9m77cDG5Ax9zscSkcw==",
+ "inquirer": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
+ "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
"dev": true,
"requires": {
- "@web3-js/scrypt-shim": "^0.1.0",
- "any-promise": "1.3.0",
- "crypto-browserify": "3.12.0",
- "eth-lib": "^0.2.8",
- "ethereumjs-common": "^1.3.2",
- "ethereumjs-tx": "^2.1.1",
- "underscore": "1.9.1",
- "uuid": "3.3.2",
- "web3-core": "1.2.6",
- "web3-core-helpers": "1.2.6",
- "web3-core-method": "1.2.6",
- "web3-utils": "1.2.6"
+ "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"
},
"dependencies": {
- "eth-lib": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
- "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "xhr-request-promise": "^0.1.2"
+ "ansi-regex": "^4.1.0"
}
}
}
},
- "web3-eth-contract": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.6.tgz",
- "integrity": "sha512-ak4xbHIhWgsbdPCkSN+HnQc1SH4c856y7Ly+S57J/DQVzhFZemK5HvWdpwadJrQTcHET3ZeId1vq3kmW7UYodw==",
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"dev": true,
"requires": {
- "@types/bn.js": "^4.11.4",
- "underscore": "1.9.1",
- "web3-core": "1.2.6",
- "web3-core-helpers": "1.2.6",
- "web3-core-method": "1.2.6",
- "web3-core-promievent": "1.2.6",
- "web3-core-subscriptions": "1.2.6",
- "web3-eth-abi": "1.2.6",
- "web3-utils": "1.2.6"
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
}
},
- "web3-eth-ens": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.6.tgz",
- "integrity": "sha512-8UEqt6fqR/dji/jBGPFAyBs16OJjwi0t2dPWXPyGXmty/fH+osnXwWXE4HRUyj4xuafiM5P1YkXMsPhKEadjiw==",
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "eth-ens-namehash": "2.0.8",
- "underscore": "1.9.1",
- "web3-core": "1.2.6",
- "web3-core-helpers": "1.2.6",
- "web3-core-promievent": "1.2.6",
- "web3-eth-abi": "1.2.6",
- "web3-eth-contract": "1.2.6",
- "web3-utils": "1.2.6"
+ "minimist": "^1.2.5"
}
},
- "web3-eth-iban": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.6.tgz",
- "integrity": "sha512-TPMc3BW9Iso7H+9w+ytbqHK9wgOmtocyCD3PaAe5Eie50KQ/j7ThA60dGJnxItVo6yyRv5pZAYxPVob9x/fJlg==",
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "web3-utils": "1.2.6"
+ "mimic-fn": "^1.0.0"
}
},
- "web3-eth-personal": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.6.tgz",
- "integrity": "sha512-T2NUkh1plY8d7wePXSoHnaiKOd8dLNFaQfgBl9JHU6S7IJrG9jnYD9bVxLEgRUfHs9gKf9tQpDf7AcPFdq/A8g==",
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
"dev": true,
"requires": {
- "@types/node": "^12.6.1",
- "web3-core": "1.2.6",
- "web3-core-helpers": "1.2.6",
- "web3-core-method": "1.2.6",
- "web3-net": "1.2.6",
- "web3-utils": "1.2.6"
+ "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"
}
},
- "web3-net": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.6.tgz",
- "integrity": "sha512-hsNHAPddrhgjWLmbESW0KxJi2GnthPcow0Sqpnf4oB6+/+ZnQHU9OsIyHb83bnC1OmunrK2vf9Ye2mLPdFIu3A==",
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "regexpp": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
"dev": true,
"requires": {
- "web3-core": "1.2.6",
- "web3-core-method": "1.2.6",
- "web3-utils": "1.2.6"
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
}
},
- "web3-providers-http": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.6.tgz",
- "integrity": "sha512-2+SaFCspb5f82QKuHB3nEPQOF9iSWxRf7c18fHtmnLNVkfG9SwLN1zh67bYn3tZGUdOI3gj8aX4Uhfpwx9Ezpw==",
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
- "web3-core-helpers": "1.2.6",
- "xhr2-cookies": "1.1.0"
+ "ansi-regex": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ }
}
},
- "web3-providers-ipc": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.6.tgz",
- "integrity": "sha512-b0Es+/GTZyk5FG3SgUDW+2/mBwJAXWt5LuppODptiOas8bB2khLjG6+Gm1K4uwOb+1NJGPt5mZZ8Wi7vibtQ+A==",
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
"dev": true,
"requires": {
- "oboe": "2.1.4",
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.6"
+ "prelude-ls": "~1.1.2"
+ }
+ }
+ }
+ },
+ "solidity-coverage": {
+ "version": "0.7.14",
+ "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.14.tgz",
+ "integrity": "sha512-2X9oNtu4yBbtDXtVe2tc9vYHtwON6QRqNvVylKdkhcJgAdCzP/OkJy9fWcWH/g3fnNCIOFssHoe0LPGZ2ppMZg==",
+ "dev": true,
+ "requires": {
+ "@solidity-parser/parser": "^0.11.0",
+ "@truffle/provider": "^0.2.24",
+ "chalk": "^2.4.2",
+ "death": "^1.1.0",
+ "detect-port": "^1.3.0",
+ "fs-extra": "^8.1.0",
+ "ganache-cli": "^6.11.0",
+ "ghost-testrpc": "^0.0.2",
+ "global-modules": "^2.0.0",
+ "globby": "^10.0.1",
+ "jsonschema": "^1.2.4",
+ "lodash": "^4.17.15",
+ "node-emoji": "^1.10.0",
+ "pify": "^4.0.1",
+ "recursive-readdir": "^2.2.2",
+ "sc-istanbul": "^0.4.5",
+ "semver": "^7.3.4",
+ "shelljs": "^0.8.3",
+ "web3-utils": "^1.3.0"
+ },
+ "dependencies": {
+ "@solidity-parser/parser": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.11.1.tgz",
+ "integrity": "sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ==",
+ "dev": true
+ },
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
}
},
- "web3-providers-ws": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.6.tgz",
- "integrity": "sha512-20waSYX+gb5M5yKhug5FIwxBBvkKzlJH7sK6XEgdOx6BZ9YYamLmvg9wcRVtnSZO8hV/3cWenO/tRtTrHVvIgQ==",
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"requires": {
- "@web3-js/websocket": "^1.0.29",
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.6"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
}
},
- "web3-shh": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.6.tgz",
- "integrity": "sha512-rouWyOOM6YMbLQd65grpj8BBezQfgNeRRX+cGyW4xsn6Xgu+B73Zvr6OtA/ftJwwa9bqHGpnLrrLMeWyy4YLUw==",
+ "semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
"dev": true,
"requires": {
- "web3-core": "1.2.6",
- "web3-core-method": "1.2.6",
- "web3-core-subscriptions": "1.2.6",
- "web3-net": "1.2.6"
+ "lru-cache": "^6.0.0"
}
},
"web3-utils": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.6.tgz",
- "integrity": "sha512-8/HnqG/l7dGmKMgEL9JeKPTtjScxOePTzopv5aaKFExPfaBrYRkgoMqhoowCiAl/s16QaTn4DoIF1QC4YsT7Mg==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.3.tgz",
+ "integrity": "sha512-ZwpdqEcBBzqRgXUbCj+kyu1jFnsDauURSQ79yVqgnTKSI4C3s0Qjpp4WLThV+LKhCKR5GZtBTkgGHeiq0FT88A==",
"dev": true,
"requires": {
- "bn.js": "4.11.8",
- "eth-lib": "0.2.7",
+ "bn.js": "^4.11.9",
+ "eth-lib": "0.2.8",
"ethereum-bloom-filters": "^1.0.6",
"ethjs-unit": "0.1.6",
"number-to-bn": "1.7.0",
@@ -12632,11 +12628,6 @@
}
}
},
- "solidity-parser-antlr": {
- "version": "0.4.11",
- "resolved": "https://registry.npmjs.org/solidity-parser-antlr/-/solidity-parser-antlr-0.4.11.tgz",
- "integrity": "sha512-4jtxasNGmyC0midtjH/lTFPZYvTTUMy6agYcF+HoMnzW8+cqo3piFrINb4ZCzpPW+7tTVFCGa5ubP34zOzeuMg=="
- },
"solium-plugin-security": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/solium-plugin-security/-/solium-plugin-security-0.1.1.tgz",
@@ -12654,12 +12645,35 @@
"yargs": "^10.0.3"
},
"dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
"browser-stdout": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
"integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
"dev": true
},
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.1.1",
+ "strip-ansi": "^4.0.0",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
"commander": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
@@ -12681,6 +12695,21 @@
"integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
"dev": true
},
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
"glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
@@ -12707,6 +12736,31 @@
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
},
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
@@ -12746,6 +12800,45 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
"supports-color": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
@@ -12754,6 +12847,79 @@
"requires": {
"has-flag": "^2.0.0"
}
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ }
+ }
+ },
+ "y18n": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "10.1.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz",
+ "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==",
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "decamelize": "^1.1.1",
+ "find-up": "^2.1.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^2.0.0",
+ "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",
+ "yargs-parser": "^8.1.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz",
+ "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0"
+ }
}
}
},
@@ -12776,9 +12942,9 @@
}
},
"source-map-support": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
- "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -12798,9 +12964,9 @@
"dev": true
},
"spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
@@ -12808,15 +12974,15 @@
}
},
"spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
"dev": true
},
"spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
@@ -12824,9 +12990,9 @@
}
},
"spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
+ "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
"dev": true
},
"split-string": {
@@ -12841,8 +13007,7 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"sshpk": {
"version": "1.16.1",
@@ -12898,67 +13063,70 @@
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
},
"string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
},
"dependencies": {
"ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
- "ansi-regex": "^5.0.0"
+ "ansi-regex": "^3.0.0"
}
}
}
},
"string.prototype.trim": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz",
- "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.3.tgz",
+ "integrity": "sha512-16IL9pIBA5asNOSukPfxX2W68BaBvxyiRK16H3RA/lWW9BDosh+w7f+LhomPHpXJ82QEe7w7/rY/S1CV97raLg==",
"requires": {
+ "call-bind": "^1.0.0",
"define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1"
+ "es-abstract": "^1.18.0-next.1"
}
},
- "string.prototype.trimleft": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
- "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+ "string.prototype.trimend": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
+ "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==",
"requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
}
},
- "string.prototype.trimright": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
- "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+ "string.prototype.trimstart": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz",
+ "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==",
"requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
}
},
"string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"requires": {
- "safe-buffer": "~5.1.0"
+ "safe-buffer": "~5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
}
},
"strip-ansi": {
@@ -13131,18 +13299,6 @@
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
@@ -13166,9 +13322,9 @@
}
},
"tape": {
- "version": "4.13.2",
- "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.2.tgz",
- "integrity": "sha512-waWwC/OqYVE9TS6r1IynlP2sEdk4Lfo6jazlgkuNkPTHIbuG2BTABIaKdlQWwPeB6Oo4ksZ1j33Yt0NTOAlYMQ==",
+ "version": "4.13.3",
+ "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz",
+ "integrity": "sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==",
"requires": {
"deep-equal": "~1.1.1",
"defined": "~1.0.0",
@@ -13179,12 +13335,22 @@
"has": "~1.0.3",
"inherits": "~2.0.4",
"is-regex": "~1.0.5",
- "minimist": "~1.2.0",
+ "minimist": "~1.2.5",
"object-inspect": "~1.7.0",
- "resolve": "~1.15.1",
+ "resolve": "~1.17.0",
"resumer": "~0.0.0",
"string.prototype.trim": "~1.2.1",
"through": "~2.3.8"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ }
}
},
"tar": {
@@ -13223,6 +13389,30 @@
"readable-stream": "^2.3.0",
"to-buffer": "^1.1.1",
"xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "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"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
}
},
"text-table": {
@@ -13251,9 +13441,9 @@
},
"dependencies": {
"@types/node": {
- "version": "8.10.60",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.60.tgz",
- "integrity": "sha512-YjPbypHFuiOV0bTgeF07HpEEqhmHaZqYNSdCKeBJa+yFoQ/7BC+FpJcwmi34xUIIRVFktnUyP1dPU8U0612GOg==",
+ "version": "8.10.66",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==",
"dev": true
}
}
@@ -13270,6 +13460,30 @@
"requires": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "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"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
}
},
"timed-out": {
@@ -13277,15 +13491,6 @@
"resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
"integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
},
- "timers-ext": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
- "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
- "requires": {
- "es5-ext": "~0.10.46",
- "next-tick": "1"
- }
- },
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -13332,24 +13537,11 @@
}
},
"to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- }
+ "is-number": "^7.0.0"
}
},
"toidentifier": {
@@ -13372,25 +13564,24 @@
"integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
},
"truffle": {
- "version": "5.1.22",
- "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.1.22.tgz",
- "integrity": "sha512-E1Kz7b2y1ApxytKmEDL04Xdmz+zEjTqWNTbp0DLFh928yzxL47xzDmuZyinx4pPNrt9vnnhoHMHqeh36IFkK1Q==",
+ "version": "5.1.63",
+ "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.1.63.tgz",
+ "integrity": "sha512-gqji8h0nnZ8AGaFqLaRCVECdP2k52H/V1TtjO9v4oLwSfXo5iO1V2+9yBo2NaQQZc3q6vSgZXlcIFEoneKAswQ==",
"requires": {
"app-module-path": "^2.2.0",
- "mocha": "5.2.0",
+ "mocha": "8.1.2",
"original-require": "1.0.1"
}
},
"truffle-plugin-verify": {
- "version": "0.3.10",
- "resolved": "https://registry.npmjs.org/truffle-plugin-verify/-/truffle-plugin-verify-0.3.10.tgz",
- "integrity": "sha512-axkqEA7phQHY8CNDOWmhwjy/wPwo6/VhBE1b9pwaE6MqRMEKFW3ph8AzBI8Z7PUoR6rjmH5uSXqTPggjTOgv2w==",
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/truffle-plugin-verify/-/truffle-plugin-verify-0.5.4.tgz",
+ "integrity": "sha512-cFqhypLZ3C/71jh9muVWm37pKd+I1AHr/hu+h7Y3GEKaMFu5YoQ97mj/0AnrY4MO8pgoaghSqkCPiIj/xXCaoA==",
"requires": {
"axios": "0.19.2",
"cli-logger": "0.5.40",
"delay": "4.3.0",
- "querystring": "0.2.0",
- "sol-merger": "2.0.1"
+ "querystring": "0.2.0"
}
},
"ts-essentials": {
@@ -13400,30 +13591,22 @@
"dev": true
},
"ts-node": {
- "version": "8.6.2",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
- "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
+ "version": "8.10.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
+ "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
"dev": true,
"requires": {
"arg": "^4.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
- "source-map-support": "^0.5.6",
+ "source-map-support": "^0.5.17",
"yn": "3.1.1"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- }
}
},
"tslib": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
- "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
"tunnel-agent": {
@@ -13445,12 +13628,12 @@
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
},
"type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"requires": {
- "prelude-ls": "~1.1.2"
+ "prelude-ls": "^1.2.1"
}
},
"type-fest": {
@@ -13482,23 +13665,11 @@
}
},
"uglify-js": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz",
- "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==",
+ "version": "3.12.5",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.5.tgz",
+ "integrity": "sha512-SgpgScL4T7Hj/w/GexjnBHi3Ien9WS1Rpfg5y91WXMj9SY997ZCQU76mH4TpLwwfmMvoOU8wiaRkIf6NaH3mtg==",
"dev": true,
- "optional": true,
- "requires": {
- "commander": "~2.20.3"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true,
- "optional": true
- }
- }
+ "optional": true
},
"ultron": {
"version": "1.1.1",
@@ -13506,9 +13677,9 @@
"integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
},
"unbzip2-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.1.tgz",
- "integrity": "sha512-sgDYfSDPMsA4Hr2/w7vOlrJBlwzmyakk1+hW8ObLvxSp0LA36LcL2XItGvOT3OSblohSdevMuT8FQjLsqyy4sA==",
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+ "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
"requires": {
"buffer": "^5.2.1",
"through": "^2.3.8"
@@ -13617,9 +13788,9 @@
}
},
"uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"requires": {
"punycode": "^2.1.0"
}
@@ -13660,6 +13831,15 @@
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true
},
+ "utf-8-validate": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz",
+ "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==",
+ "dev": true,
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
"utf8": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
@@ -13681,9 +13861,9 @@
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"v8-compile-cache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
- "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
"dev": true
},
"validate-npm-package-license": {
@@ -13696,6 +13876,12 @@
"spdx-expression-parse": "^3.0.0"
}
},
+ "varint": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
+ "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==",
+ "dev": true
+ },
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -13911,6 +14097,13 @@
"requires": {
"bn.js": "4.11.8",
"web3-utils": "1.2.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+ }
}
},
"web3-eth-personal": {
@@ -13936,21 +14129,24 @@
}
},
"web3-provider-engine": {
- "version": "git+https://github.com/trufflesuite/provider-engine.git#3538c60bc4836b73ccae1ac3f64c8fed8ef19c1a",
- "from": "git+https://github.com/trufflesuite/provider-engine.git#web3-one",
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.1.tgz",
+ "integrity": "sha512-/Eglt2aocXMBiDj7Se/lyZnNDaHBaoJlaUfbP5HkLJQC/HlGbR+3/W+dINirlJDhh7b54DzgykqY7ksaU5QgTg==",
"requires": {
"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-block-tracker": "^4.4.2",
+ "eth-json-rpc-filters": "^4.2.1",
+ "eth-json-rpc-infura": "^5.1.0",
+ "eth-json-rpc-middleware": "^6.0.0",
+ "eth-rpc-errors": "^3.0.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",
@@ -13961,18 +14157,79 @@
"xtend": "^4.0.1"
},
"dependencies": {
+ "eth-json-rpc-infura": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz",
+ "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==",
+ "requires": {
+ "eth-json-rpc-middleware": "^6.0.0",
+ "eth-rpc-errors": "^3.0.0",
+ "json-rpc-engine": "^5.3.0",
+ "node-fetch": "^2.6.0"
+ }
+ },
+ "eth-json-rpc-middleware": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz",
+ "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==",
+ "requires": {
+ "btoa": "^1.2.1",
+ "clone": "^2.1.1",
+ "eth-query": "^2.1.2",
+ "eth-rpc-errors": "^3.0.0",
+ "eth-sig-util": "^1.4.2",
+ "ethereumjs-util": "^5.1.2",
+ "json-rpc-engine": "^5.3.0",
+ "json-stable-stringify": "^1.0.1",
+ "node-fetch": "^2.6.1",
+ "pify": "^3.0.0",
+ "safe-event-emitter": "^1.0.1"
+ }
+ },
"ethereumjs-util": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
- "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
"ethjs-util": "^0.1.3",
- "keccak": "^1.0.2",
"rlp": "^2.0.0",
- "safe-buffer": "^5.1.1",
- "secp256k1": "^3.0.1"
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "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"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
}
},
"ws": {
@@ -14039,6 +14296,11 @@
"utf8": "3.0.0"
},
"dependencies": {
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+ },
"eth-lib": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
@@ -14052,7 +14314,7 @@
}
},
"websocket": {
- "version": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e",
+ "version": "github:web3-js/WebSocket-Node#ef5ea2f41daf4a2113b80c9223df884b4d56c400",
"from": "github:web3-js/WebSocket-Node#polyfill/globalThis",
"requires": {
"debug": "^2.2.0",
@@ -14083,10 +14345,9 @@
"integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
},
"which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"requires": {
"isexe": "^2.0.0"
}
@@ -14094,49 +14355,14 @@
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
"wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "dev": true,
"requires": {
"string-width": "^1.0.2 || 2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
}
},
"word-wrap": {
@@ -14151,34 +14377,42 @@
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
"dev": true
},
+ "workerpool": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz",
+ "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA=="
+ },
"wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dev": true,
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
"requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
},
"dependencies": {
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"requires": {
- "number-is-nan": "^1.0.0"
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
}
},
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
+ "ansi-regex": "^4.1.0"
}
}
}
@@ -14197,19 +14431,13 @@
"mkdirp": "^0.5.1"
},
"dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
- },
"mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "0.0.8"
+ "minimist": "^1.2.5"
}
}
}
@@ -14225,11 +14453,11 @@
}
},
"xhr": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz",
- "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
+ "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
"requires": {
- "global": "~4.3.0",
+ "global": "~4.4.0",
"is-function": "^1.0.1",
"parse-headers": "^2.0.0",
"xtend": "^4.0.0"
@@ -14276,10 +14504,9 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
},
"y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
- "dev": true
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
},
"yaeti": {
"version": "0.0.6",
@@ -14292,173 +14519,77 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"yargs": {
- "version": "10.1.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz",
- "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==",
- "dev": true,
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
"requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.1.1",
- "find-up": "^2.1.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^2.0.0",
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
+ "require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
+ "string-width": "^3.0.0",
"which-module": "^2.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^8.1.0"
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
},
"dependencies": {
"ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"requires": {
+ "emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
+ "strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
- "ansi-regex": "^3.0.0"
+ "ansi-regex": "^4.1.0"
}
}
}
},
"yargs-parser": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz",
- "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==",
- "dev": true,
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
"requires": {
- "camelcase": "^4.1.0"
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
}
},
"yargs-unparser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
- "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
- "dev": true,
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz",
+ "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==",
"requires": {
+ "camelcase": "^5.3.1",
+ "decamelize": "^1.2.0",
"flat": "^4.1.0",
- "lodash": "^4.17.15",
- "yargs": "^13.3.0"
+ "is-plain-obj": "^1.1.0",
+ "yargs": "^14.2.3"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
@@ -14469,35 +14600,17 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
},
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
- "dev": true
- },
"yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
+ "version": "14.2.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
+ "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
"requires": {
"cliui": "^5.0.0",
+ "decamelize": "^1.2.0",
"find-up": "^3.0.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
@@ -14506,14 +14619,13 @@
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
- "yargs-parser": "^13.1.2"
+ "yargs-parser": "^15.0.1"
}
},
"yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "dev": true,
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
+ "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
@@ -14535,6 +14647,11 @@
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
}
}
}
diff --git a/package.json b/package.json
index d89e5065..117fcacd 100755
--- a/package.json
+++ b/package.json
@@ -15,30 +15,31 @@
"lint:solhint": "npx solhint \"./contracts/**/*.sol\"",
"lint:ethlint": "npx ethlint --dir contracts/",
"lint:eslint": "eslint .",
- "lint": "npm run lint:solhint && npm run lint:ethlint && npm run lint:eslint"
+ "lint": "npm run lint:solhint && npm run lint:eslint"
},
"author": "",
"license": "ISC",
"dependencies": {
- "@babel/core": "7.8.6",
- "@babel/preset-env": "7.8.6",
- "@babel/register": "7.8.6",
- "@truffle/hdwallet-provider": "1.0.34",
- "core-js": "3.6.4",
+ "@babel/core": "7.9.6",
+ "@babel/preset-env": "7.9.6",
+ "@babel/register": "7.9.0",
+ "@truffle/hdwallet-provider": "1.0.35",
+ "core-js": "3.6.5",
"dotenv": "8.2.0",
"regenerator-runtime": "0.13.5",
- "truffle": "5.1.22",
- "truffle-plugin-verify": "0.3.10"
+ "truffle": "5.1.63",
+ "truffle-plugin-verify": "0.5.4",
+ "web3-provider-engine": "16.0.1"
},
"devDependencies": {
"@codechecks/client": "0.1.10",
- "eslint": "6.8.0",
- "eslint-config-airbnb-base": "14.0.0",
- "eslint-plugin-import": "2.20.1",
+ "eslint": "7.0.0",
+ "eslint-config-airbnb-base": "14.1.0",
+ "eslint-plugin-import": "2.20.2",
"eth-gas-reporter": "0.2.17",
"ethlint": "1.2.5",
- "ganache-cli": "6.9.1",
- "solhint": "2.3.1",
- "solidity-coverage": "0.7.4"
+ "ganache-cli": "6.12.2",
+ "solhint": "3.3.2",
+ "solidity-coverage": "0.7.14"
}
}
diff --git a/test/AaveAssetAdapter.js b/test/AaveAssetAdapter.js
index 799c3c5d..c1d63f10 100755
--- a/test/AaveAssetAdapter.js
+++ b/test/AaveAssetAdapter.js
@@ -1,9 +1,9 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./AaveAssetAdapter');
-const TokenAdapter = artifacts.require('./AaveTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AaveAssetAdapter');
+const TokenAdapter = artifacts.require('AaveTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('AaveAssetAdapter', () => {
const aDAIAddress = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d';
diff --git a/test/AaveDebtAdapter.js b/test/AaveDebtAdapter.js
index 8a3146ee..d76c89d3 100755
--- a/test/AaveDebtAdapter.js
+++ b/test/AaveDebtAdapter.js
@@ -1,8 +1,8 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./AaveDebtAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AaveDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('AaveDebtAdapter', () => {
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
diff --git a/test/AaveStakingAdapter.js b/test/AaveStakingAdapter.js
new file mode 100755
index 00000000..6c2393d8
--- /dev/null
+++ b/test/AaveStakingAdapter.js
@@ -0,0 +1,68 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AaveStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('AaveStakingAdapter', () => {
+ const aaveAddress = '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9';
+ // Random address with positive balances
+ const testAddress = '0x953ef149ca90fa1e3518c56178cba0346d8047bf';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Aave Safety Module'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ aaveAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/AaveUniswapAssetAdapter.js b/test/AaveUniswapAssetAdapter.js
new file mode 100644
index 00000000..79349aa1
--- /dev/null
+++ b/test/AaveUniswapAssetAdapter.js
@@ -0,0 +1,112 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AaveUniswapAssetAdapter');
+const TokenAdapter = artifacts.require('AaveTokenAdapter');
+const AUniswapTokenAdapter = artifacts.require('AaveUniswapTokenAdapter');
+const UniswapV1TokenAdapter = artifacts.require('UniswapV1TokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('AaveUniswapAssetAdapter', () => {
+ const aUniDAIAddress = '0xBbBb7F2aC04484F7F04A2C2C16f20479791BbB44';
+ const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let aUniswapTokenAdapterAddress;
+ let uniswapV1TokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const dai = [
+ daiAddress,
+ 'Dai Stablecoin',
+ 'DAI',
+ '18',
+ ];
+ const eth = [
+ ethAddress,
+ 'Ether',
+ 'ETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await AUniswapTokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ aUniswapTokenAdapterAddress = result.address;
+ });
+ await UniswapV1TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ uniswapV1TokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Aave • Uniswap Market'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ aUniDAIAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ [
+ 'ERC20',
+ 'AToken',
+ 'Uniswap V1 pool token',
+ 'AToken Uniswap Market',
+ ],
+ [
+ erc20TokenAdapterAddress,
+ tokenAdapterAddress,
+ uniswapV1TokenAdapterAddress,
+ aUniswapTokenAdapterAddress,
+ ],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[1]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, eth);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[1].metadata, dai);
+ });
+ });
+});
diff --git a/test/AaveUniswapDebtAdapter.js b/test/AaveUniswapDebtAdapter.js
new file mode 100644
index 00000000..9ca08b14
--- /dev/null
+++ b/test/AaveUniswapDebtAdapter.js
@@ -0,0 +1,74 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AaveUniswapDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('AaveUniswapDebtAdapter', () => {
+ const usdtAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const usdt = [
+ usdtAddress,
+ 'Tether USD',
+ 'USDT',
+ '6',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Aave • Uniswap Market'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ usdtAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, usdt);
+ });
+ });
+});
diff --git a/test/AdapterRegistry.js b/test/AdapterRegistry.js
index 91755b5e..770a3b99 100755
--- a/test/AdapterRegistry.js
+++ b/test/AdapterRegistry.js
@@ -1,8 +1,8 @@
import expectRevert from './helpers/expectRevert';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./MockAdapter');
-const TokenAdapter = artifacts.require('./MockTokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MockAdapter');
+const TokenAdapter = artifacts.require('MockTokenAdapter');
const ZERO = '0x0000000000000000000000000000000000000000';
const ONE = '0x1111111111111111111111111111111111111111';
diff --git a/test/AdapterRegistryDeployed.js b/test/AdapterRegistryDeployed.js
index 18702d47..96da0558 100755
--- a/test/AdapterRegistryDeployed.js
+++ b/test/AdapterRegistryDeployed.js
@@ -1,4 +1,4 @@
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
contract.skip('AdapterRegistry deployed', () => {
let adapterRegistry;
@@ -22,14 +22,23 @@ contract.skip('AdapterRegistry deployed', () => {
'TokenSets',
'Synthetix',
'PoolTogether',
+ 'PieDAO',
+ 'mStable',
'Multi-Collateral Dai',
+ 'Maker Governance',
'Dai Savings Protocol',
'Chai',
+ 'KyberDAO',
'iearn.finance (v3)',
'iearn.finance (v2)',
- 'Idle',
+ 'Idle • Risk-Adjusted',
+ 'Idle • Best-Yield',
+ 'Gnosis Protocol',
'dYdX',
'DeFi Money Market',
+ 'DDEX • Spot',
+ 'DDEX • Margin',
+ 'DDEX • Lending',
'Curve',
'Compound',
'Bancor',
@@ -48,6 +57,9 @@ contract.skip('AdapterRegistry deployed', () => {
'SmartToken',
'SetToken',
'PoolTogether pool',
+ 'PieDAO Pie Token',
+ 'Chi Token',
+ 'Masset',
'Chai token',
'YToken',
'IdleToken',
diff --git a/test/AdelStakingAdapter.js b/test/AdelStakingAdapter.js
new file mode 100644
index 00000000..1173d3fb
--- /dev/null
+++ b/test/AdelStakingAdapter.js
@@ -0,0 +1,75 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AdelStakingAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('AdelAdapter', () => {
+ const adelAddress = '0x94d863173EE77439E4292284fF13fAD54b3BA182';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ const adel = [
+ adelAddress,
+ 'Akropolis Delphi',
+ 'ADEL',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['adel'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ adelAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, adel);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/AkroStakingAdapter.js b/test/AkroStakingAdapter.js
new file mode 100644
index 00000000..6275d915
--- /dev/null
+++ b/test/AkroStakingAdapter.js
@@ -0,0 +1,75 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AkroStakingAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('AkroAdapter', () => {
+ const akroAddress = '0x8Ab7404063Ec4DBcfd4598215992DC3F8EC853d7';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ const akro = [
+ akroAddress,
+ 'Akropolis',
+ 'AKRO',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['akro'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ akroAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, akro);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/AlphaHomoraTokenAdapter.js b/test/AlphaHomoraTokenAdapter.js
new file mode 100755
index 00000000..e798775a
--- /dev/null
+++ b/test/AlphaHomoraTokenAdapter.js
@@ -0,0 +1,40 @@
+const TokenAdapter = artifacts.require('AlphaHomoraTokenAdapter');
+
+contract('AlphaHomoraTokenAdapter', () => {
+ const ibETHAddress = '0x67B66C99D3Eb37Fa76Aa3Ed1ff33E8e39F0b9c7A';
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+
+ let accounts;
+ let tokenAdapter;
+ const ibETH = [
+ ibETHAddress,
+ 'Interest Bearing ETH',
+ 'ibETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapter = result.contract;
+ });
+ });
+
+ it('should return correct components', async () => {
+ await tokenAdapter.methods['getComponents(address)'](ibETHAddress)
+ .call()
+ .then((result) => {
+ assert.equal(result[0][0], ethAddress);
+ });
+ });
+
+ it('should return correct metadata', async () => {
+ await tokenAdapter.methods['getMetadata(address)'](ibETHAddress)
+ .call()
+ .then((result) => {
+ assert.deepEqual(result, ibETH);
+ });
+ });
+});
diff --git a/test/AmpleforthAdapter.js b/test/AmpleforthAdapter.js
new file mode 100644
index 00000000..44031845
--- /dev/null
+++ b/test/AmpleforthAdapter.js
@@ -0,0 +1,77 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AmpleforthAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('AmpleforthAdapter', () => {
+ const amplAddress = '0xD46bA6D942050d489DBd938a2C909A5d5039A161';
+ const amplUniAddress = '0xc5be99A02C6857f9Eac67BbCE58DF5572498F40c';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const amplUni = [
+ amplUniAddress,
+ 'Uniswap V2',
+ 'UNI-V2',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Synthetix'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ amplAddress,
+ amplUniAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, amplUni);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/AragonStakingAdapter.js b/test/AragonStakingAdapter.js
new file mode 100644
index 00000000..f13e27d0
--- /dev/null
+++ b/test/AragonStakingAdapter.js
@@ -0,0 +1,85 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('AragonStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('AragonStakingAdapter', () => {
+ const antAddress = '0x960b236A07cf122663c4303350609A66A7B288C0';
+ const uniAntWethAddress = '0xfa19de406e8F5b9100E4dD5CaD8a503a6d686Efe';
+ // Random address with positive balance
+ const testAddress = '0xbeC73ba0817403cd11C11bE891D671EA30443562';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const ant = [
+ antAddress,
+ 'Aragon Network Token',
+ 'ANT',
+ '18',
+ ];
+ const uniAntWeth = [
+ uniAntWethAddress,
+ 'Uniswap V2',
+ 'UNI-V2',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Aragon'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ antAddress,
+ uniAntWethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, ant);
+ assert.deepEqual(result[0].adapterBalances[0].balances[1].base.metadata, uniAntWeth);
+ });
+ });
+});
diff --git a/test/BalancerAdapter.js b/test/BalancerAdapter.js
index e0ba778d..41861ead 100755
--- a/test/BalancerAdapter.js
+++ b/test/BalancerAdapter.js
@@ -1,10 +1,10 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./BalancerAdapter');
-const TokenAdapter = artifacts.require('./BalancerTokenAdapter');
-const CompoundTokenAdapter = artifacts.require('./CompoundTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('BalancerAdapter');
+const TokenAdapter = artifacts.require('BalancerTokenAdapter');
+const CompoundTokenAdapter = artifacts.require('CompoundTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('BalancerAdapter', () => {
const wethDai3070PoolAddress = '0x53b89CE35928dda346c574D9105A5479CB87231c';
diff --git a/test/BancorAdapter.js b/test/BancorAdapter.js
index 54c63a2b..1bd49f65 100755
--- a/test/BancorAdapter.js
+++ b/test/BancorAdapter.js
@@ -1,14 +1,14 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./BancorAdapter');
-const TokenAdapter = artifacts.require('./BancorTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('BancorAdapter');
+const TokenAdapter = artifacts.require('BancorTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
-contract('BalancerAdapter', () => {
+contract('BancorAdapter', () => {
const bntBethPoolAddress = '0xb1CD6e4153B2a390Cf00A6556b0fC1458C4A5533';
const bntAddress = '0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C';
- const bethAddress = '0xc0829421C1d260BD3cB3E0F06cfE2D52db2cE315';
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
let accounts;
@@ -29,8 +29,8 @@ contract('BalancerAdapter', () => {
'18',
];
const beth = [
- bethAddress,
- 'Ether Token',
+ ethAddress,
+ 'Ether',
'ETH',
'18',
];
diff --git a/test/BancorLiquidityProtectionAdapter.js b/test/BancorLiquidityProtectionAdapter.js
new file mode 100755
index 00000000..0d50ba17
--- /dev/null
+++ b/test/BancorLiquidityProtectionAdapter.js
@@ -0,0 +1,34 @@
+const ProtocolAdapter = artifacts.require('BancorLiquidityProtectionAdapter');
+
+contract('BancorLiquidityProtectionAdapter', () => {
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const bntAddress = '0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let protocolAdapterContract;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ });
+
+ it('should return correct balances for bnt', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](bntAddress, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+
+ it('should return correct balances for eth', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](ethAddress, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+});
diff --git a/test/BancorLockedTokensAdapter.js b/test/BancorLockedTokensAdapter.js
new file mode 100755
index 00000000..dabf86ba
--- /dev/null
+++ b/test/BancorLockedTokensAdapter.js
@@ -0,0 +1,25 @@
+const ProtocolAdapter = artifacts.require('BancorLiquidityProtectionAdapter');
+
+contract('BancorLockedTokensAdapter', () => {
+ const bntAddress = '0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let protocolAdapterContract;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](bntAddress, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+});
diff --git a/test/BancorV2Adapter.js b/test/BancorV2Adapter.js
new file mode 100755
index 00000000..ae0a1e59
--- /dev/null
+++ b/test/BancorV2Adapter.js
@@ -0,0 +1,93 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('BancorV2Adapter');
+const TokenAdapter = artifacts.require('BancorV2TokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('BancorAdapter', () => {
+ const linkBntPool1Address = '0x7b5b7c0534cd37fd7B637b46D9e9CdD3D7e3acD9';
+ const linkAddress = '0x514910771AF9Ca656af840dff83E8264EcF986CA';
+ // Random address with linkBntPool1 tokens
+ const testAddress = '0xC10FA265ce69337EB0eCf7B02d652E8d28b61A17';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const linkBntPool1 = [
+ linkBntPool1Address,
+ 'LINK / BNT Liquidity Pool1',
+ 'LINKBNT1',
+ '18',
+ ];
+ const link = [
+ linkAddress,
+ 'ChainLink Token',
+ 'LINK',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Bancor V2'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ linkBntPool1Address,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'SmartToken V2'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ assert.deepEqual(
+ result[0].adapterBalances[0].balances[0].base.metadata,
+ linkBntPool1,
+ );
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, link);
+ });
+ });
+});
diff --git a/test/BerezkaTokenAdapter.js b/test/BerezkaTokenAdapter.js
new file mode 100644
index 00000000..08b21d67
--- /dev/null
+++ b/test/BerezkaTokenAdapter.js
@@ -0,0 +1,111 @@
+const AdapterRegistry = artifacts.require('./AdapterRegistry.sol');
+const BerezkaTokenAdapter = artifacts.require('./BerezkaTokenAdapter.sol');
+const BerezkaTokenAdapterGovernance = artifacts.require('./BerezkaTokenAdapterGovernance.sol');
+const BerezkaTokenAdapterStakingGovernance = artifacts.require('./BerezkaTokenAdapterStakingGovernance.sol');
+
+const FLEX_TOKEN = '0x0D7DeA5922535087078dd3D7c554EA9f2655d4cB';
+const FLEX_VAULTS = [
+ '0xf8a8d25049ebfaf36cf1dd7ff51ebd0777fc9b32',
+ '0xc6f7cB66f28954D1EB265d3aE3E24FF20D45d433',
+];
+
+const dai = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+const uniswapPool = '0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852';
+const uniswapPool2 = '0xbb2b8038a1640196fbe3e38816f3e67cba72d940';
+const uniswapProtocolAdapterAddress = '0x4EdBac5c8cb92878DD3fd165e43bBb8472f34c3f';
+const uniswapTokenAdapterAddress = '0xdaF03192B788deEb47beA62769f65e514c5da708';
+const erc20TokenAdapterAddress = '0x85609AfE45eE16e52aCB33b8AD103531fC959647';
+const uniswapStakingAdapterAddress = '0x2cf372984a2e3c8b2a021d0889b65d590f00d646';
+
+contract('BerezkaTokenAdapter', () => {
+ it('...should return corrent amount of tokens when called via adapter registry', async () => {
+ const adapterRegistry = await AdapterRegistry.new({ gas: '6000000' });
+ // Add Curve adapter
+ //
+ await adapterRegistry.addProtocols(
+ ['Uniswap V2'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ uniswapProtocolAdapterAddress,
+ ]],
+ [[[
+ uniswapPool,
+ uniswapPool2,
+ ]]],
+ );
+
+ await adapterRegistry.addTokenAdapters(
+ ['ERC20', 'Uniswap V2 pool token'],
+ [erc20TokenAdapterAddress, uniswapTokenAdapterAddress],
+ );
+
+ // Deploy governance
+ //
+ const governance = await BerezkaTokenAdapterGovernance.new([], []);
+ const stakingGovernance = await BerezkaTokenAdapterStakingGovernance.new([]);
+
+ // Add Flex token
+ //
+ await governance.setProductVaults(FLEX_TOKEN, FLEX_VAULTS);
+ // Add curve token to governance
+ //
+ await governance.addTokens('Uniswap V2 pool token', [uniswapPool, uniswapPool2]);
+ await governance.addTokens('ERC20', [dai]);
+
+ // Deploy berezka adapter with governance
+ //
+ const berezkaTokenAdapter = await BerezkaTokenAdapter.new(
+ governance.address,
+ stakingGovernance.address,
+ );
+ await adapterRegistry.addTokenAdapters(
+ ['Berezka DAO'],
+ [berezkaTokenAdapter.address],
+ );
+
+ // Call adapter to get token balances
+ //
+ const result = await adapterRegistry.getFinalFullTokenBalance('Berezka DAO', FLEX_TOKEN);
+
+ // Expect it to return split balances and Eth.
+ // It should also NOT contain 'raw' token (i.e.) uniswapPool address
+ //
+ const data = JSON.parse(JSON.stringify(result, true, 2));
+ const parts = data[1];
+ const tokens = parts.map((part) => part[0][0]);
+
+ console.log(JSON.stringify(parts));
+
+ expect(tokens).to.contain('0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'); // ETH
+ expect(tokens).to.contain('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'); // WETH
+ expect(tokens).to.contain('0xdAC17F958D2ee523a2206206994597C13D831ec7'); // USDT
+ expect(tokens).to.contain(dai); // DAI
+
+ // Uniswap pool is devided by it's parts
+ //
+ expect(tokens).to.not.contain(uniswapPool);
+ expect(tokens).to.not.contain(uniswapPool2);
+
+ // Add Uniswap staking to governance
+ //
+ await stakingGovernance.addStakings([uniswapStakingAdapterAddress]);
+
+ // Get balances after enabling staking
+ //
+ const result2 = await adapterRegistry.getFinalFullTokenBalance('Berezka DAO', FLEX_TOKEN);
+
+ const data2 = JSON.parse(JSON.stringify(result2, true, 2));
+ const parts2 = data2[1];
+
+ console.log(JSON.stringify(parts2));
+
+ // Expect to have more WETH after enabling staking
+ expect(Number.parseInt(parts[3][1], 10)).to.lt(Number.parseInt(parts2[3][1], 10));
+ });
+});
diff --git a/test/BzxAssetAdapter.js b/test/BzxAssetAdapter.js
new file mode 100755
index 00000000..298de705
--- /dev/null
+++ b/test/BzxAssetAdapter.js
@@ -0,0 +1,135 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('BzxAssetAdapter');
+const TokenAdapter = artifacts.require('BzxTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('BzxAssetAdapter', () => {
+ const iDaiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const iEthAddress = '0xb983e01458529665007ff7e0cddecdb74b967eb6';
+ const iUSDCAddress = '0x32e4c68b3a4a813b710595aeba7f6b7604ab9c15';
+ const iWBTCAddress = '0x2ffa85f655752fb2acb210287c60b9ef335f5b6e';
+ const iLENDAddress = '0xab45bf58c6482b87da85d6688c4d9640e093be98';
+ const iKNCAddress = '0x687642347a9282be8fd809d8309910a3f984ac5a';
+ const iMKRAddress = '0x9189c499727f88f8ecc7dc4eea22c828e6aac015';
+ const iLINKAddress = '0x463538705e7d22aa7f03ebf8ab09b067e1001b54';
+ const iYFIAddress = '0x7f3fe9d492a9a60aebb06d82cba23c6f32cad10b';
+ const iUSDTAddress = '0x7e9997a38a439b2be7ed9c9c4628391d3e055d48';
+
+ // const bzxDaiAddress = '0x6b175474e89094c44da98b954eedeac495271d0f';
+ // const bzxEthAddress = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2';
+ const bzxUSDCAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
+ // const bzxWBTCAddress = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599';
+ // const bzxLENDAddress = '0x80fB784B7eD66730e8b1DBd9820aFD29931aab03';
+ // const bzxKNCAddress = '0xdd974d5c2e2928dea5f71b9825b8b646686bd200';
+ // const bzxMKRAddress = '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2';
+ const bzxLINKAddress = '0x514910771AF9Ca656af840dff83E8264EcF986CA';
+ // const bzxYFIAddress = '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e';
+ const bzxUSDTAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
+
+ const testAddress = '0x52ad87832400485de7e7dc965d8ad890f4e82699';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ // const dai = [
+ // bzxDaiAddress,
+ // 'Dai Stablecoin',
+ // 'DAI',
+ // '18',
+ // ];
+
+ const usdc = [
+ bzxUSDCAddress,
+ 'USD Coin',
+ 'USDC',
+ '6',
+ ];
+
+ const link = [
+ bzxLINKAddress,
+ 'ChainLink Token',
+ 'LINK',
+ '18',
+ ];
+
+ const usdt = [
+ bzxUSDTAddress,
+ 'Tether USD',
+ 'USDT',
+ '6',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['bZx'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ iDaiAddress,
+ iEthAddress,
+ iUSDCAddress,
+ iWBTCAddress,
+ iLENDAddress,
+ iKNCAddress,
+ iMKRAddress,
+ iLINKAddress,
+ iYFIAddress,
+ iUSDTAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'iToken'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[1].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[2].underlying[0]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, usdc);
+ assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[0].metadata, link);
+ assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[0].metadata, usdt);
+ });
+ });
+});
diff --git a/test/BzxDebtAdapter.js b/test/BzxDebtAdapter.js
new file mode 100755
index 00000000..c9f23a9b
--- /dev/null
+++ b/test/BzxDebtAdapter.js
@@ -0,0 +1,74 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('BzxDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('BzxDebtAdapter', () => {
+ const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const testAddress = '0x7a22E7a4d912231f9c0FB6760c59Ab560188360b';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const dai = [
+ daiAddress,
+ 'Dai Stablecoin',
+ 'DAI',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['bZx'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ daiAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, dai);
+ });
+ });
+});
diff --git a/test/ChaiAdapter.js b/test/ChaiAdapter.js
index 245d2af9..d3fe29e0 100755
--- a/test/ChaiAdapter.js
+++ b/test/ChaiAdapter.js
@@ -1,9 +1,9 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./ChaiAdapter');
-const TokenAdapter = artifacts.require('./ChaiTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('ChaiAdapter');
+const TokenAdapter = artifacts.require('ChaiTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('ChaiAdapter', () => {
const chaiAddress = '0x06AF07097C9Eeb7fD685c692751D5C66dB49c215';
diff --git a/test/ChiAdapter.js b/test/ChiAdapter.js
new file mode 100755
index 00000000..188513eb
--- /dev/null
+++ b/test/ChiAdapter.js
@@ -0,0 +1,89 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('ChiAdapter');
+const TokenAdapter = artifacts.require('ChiTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('ChiAdapter', () => {
+ const chiAddress = '0x0000000000004946c0e9F43F4Dee607b0eF1fA1c';
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const chi = [
+ chiAddress,
+ 'Chi Gastoken by 1inch',
+ 'CHI',
+ '0',
+ ];
+ const eth = [
+ ethAddress,
+ 'Ether',
+ 'ETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Chi'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ chiAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'Chi token'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, chi);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, eth);
+ });
+ });
+});
diff --git a/test/CompoundAssetAdapter.js b/test/CompoundAssetAdapter.js
index d6e62e1c..00a91e91 100755
--- a/test/CompoundAssetAdapter.js
+++ b/test/CompoundAssetAdapter.js
@@ -1,9 +1,9 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./CompoundAssetAdapter');
-const TokenAdapter = artifacts.require('./CompoundTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CompoundAssetAdapter');
+const TokenAdapter = artifacts.require('CompoundTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('CompoundAssetAdapter', () => {
const cDAIAddress = '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643';
@@ -15,7 +15,6 @@ contract('CompoundAssetAdapter', () => {
const cUSDCAddress = '0x39AA39c021dfbaE8faC545936693aC917d5E7563';
const cWBTCAddress = '0xC11b1268C1A384e55C48c2391d8d480264A3A7F4';
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
- const repAddress = '0x1985365e9f78359a9B6AD760e32412f4a445E862';
const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
@@ -24,12 +23,6 @@ contract('CompoundAssetAdapter', () => {
let protocolAdapterAddress;
let tokenAdapterAddress;
let erc20TokenAdapterAddress;
- const rep = [
- repAddress,
- 'Reputation',
- 'REP',
- '18',
- ];
const dai = [
daiAddress,
'Dai Stablecoin',
@@ -102,11 +95,10 @@ contract('CompoundAssetAdapter', () => {
await adapterRegistry.methods['getBalances(address)'](testAddress)
.call()
.then((result) => {
- displayToken(result[0].adapterBalances[0].balances[3].underlying[0]);
- displayToken(result[0].adapterBalances[0].balances[4].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[1].underlying[0]);
assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, dai);
- assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[0].metadata, rep);
- assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[0].metadata, usdc);
+ assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[0].metadata, usdc);
});
});
});
diff --git a/test/CompoundDebtAdapter.js b/test/CompoundDebtAdapter.js
index 32a0e068..424fc97b 100755
--- a/test/CompoundDebtAdapter.js
+++ b/test/CompoundDebtAdapter.js
@@ -1,8 +1,8 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./CompoundDebtAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CompoundDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('CompoundDebtAdapter', () => {
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
diff --git a/test/CompoundGovernanceAdapter.js b/test/CompoundGovernanceAdapter.js
new file mode 100644
index 00000000..a2963466
--- /dev/null
+++ b/test/CompoundGovernanceAdapter.js
@@ -0,0 +1,75 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CompoundGovernanceAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('CompoundGovernanceAdapter', () => {
+ const compAddress = '0xc00e94Cb662C3520282E6f5717214004A7f26888';
+ const testAddress = '0xA218A8346454c982912Cf6d14c714663C2d510D8';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ const comp = [
+ compAddress,
+ 'Compound',
+ 'COMP',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Compound Governance'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ compAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, comp);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/CreamAssetAdapter.js b/test/CreamAssetAdapter.js
new file mode 100755
index 00000000..6a65ba39
--- /dev/null
+++ b/test/CreamAssetAdapter.js
@@ -0,0 +1,75 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CreamAssetAdapter');
+const TokenAdapter = artifacts.require('CompoundTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('CreamAssetAdapter', () => {
+ const crUsdcAddress = '0x44fbeBd2F576670a6C33f6Fc0B00aA8c5753b322';
+ // Random address with positive balance
+ const testAddress = '0x020cA66C30beC2c4Fe3861a94E4DB4A498A35872';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Cream'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ crUsdcAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'CToken'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ });
+ });
+});
diff --git a/test/CreamDebtAdapter.js b/test/CreamDebtAdapter.js
new file mode 100755
index 00000000..6d7f83c5
--- /dev/null
+++ b/test/CreamDebtAdapter.js
@@ -0,0 +1,68 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CreamDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('CreamDebtAdapter', () => {
+ const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
+ // Random address with positive balance
+ const testAddress = '0xbF3bc2f3D279466686174261BfCCD0Ac07576E59';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Cream'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ usdcAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/CreamStakingAdapter.js b/test/CreamStakingAdapter.js
new file mode 100755
index 00000000..5540433c
--- /dev/null
+++ b/test/CreamStakingAdapter.js
@@ -0,0 +1,68 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CreamStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('CreamStakingAdapter', () => {
+ const balancerCreamWethAddress = '0x5a82503652d05B21780f33178FDF53d31c29B916';
+ // Random address with positive balance
+ const testAddress = '0xD761b97d8dbAaF908FDF6004B088d16E63Aa9222';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Cream'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ balancerCreamWethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/CurveAdapter.js b/test/CurveAdapter.js
index 3f800db6..75b1992c 100755
--- a/test/CurveAdapter.js
+++ b/test/CurveAdapter.js
@@ -1,17 +1,21 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./CurveAdapter');
-const TokenAdapter = artifacts.require('./CurveTokenAdapter');
-const CTokenAdapter = artifacts.require('./CompoundTokenAdapter');
-const YTokenAdapter = artifacts.require('./IearnTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CurveAdapter');
+const TokenAdapter = artifacts.require('CurveTokenAdapter');
+const CTokenAdapter = artifacts.require('CompoundTokenAdapter');
+const YTokenAdapter = artifacts.require('IearnTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('CurveAdapter', () => {
- const ssCompoundTokenAddress = '0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2';
- const ssUSDTTokenAddress = '0x9fC689CCaDa600B6DF723D9E47D84d76664a1F23';
- const ssYTokenAddress = '0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8';
- const ssBusdTokenAddress = '0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B';
+ const cCrvAddress = '0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2';
+ const tCrvAddress = '0x9fC689CCaDa600B6DF723D9E47D84d76664a1F23';
+ const yCrvAddress = '0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8';
+ const bCrvAddress = '0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B';
+ const sCrvAddress = '0xC25a3A3b969415c80451098fa907EC722572917F';
+ const pCrvAddress = '0xD905e2eaeBe188fc92179b6350807D8bd91Db0D8';
+ const tbtcCrvAddress = '0x1f2a662FB513441f06b8dB91ebD9a1466462b275';
+ const renCrvAddress = '0x49849C98ae39Fff122806C06791Fa73784FB3675';
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
const cDAIAddress = '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643';
@@ -110,9 +114,14 @@ contract('CurveAdapter', () => {
protocolAdapterAddress,
]],
[[[
- ssCompoundTokenAddress,
- ssYTokenAddress,
- ssBusdTokenAddress,
+ cCrvAddress,
+ tCrvAddress,
+ yCrvAddress,
+ bCrvAddress,
+ sCrvAddress,
+ pCrvAddress,
+ tbtcCrvAddress,
+ renCrvAddress,
]]],
)
.send({
@@ -138,28 +147,34 @@ contract('CurveAdapter', () => {
displayToken(result[0].adapterBalances[0].balances[1].underlying[0]);
displayToken(result[0].adapterBalances[0].balances[1].underlying[1]);
displayToken(result[0].adapterBalances[0].balances[1].underlying[2]);
- displayToken(result[0].adapterBalances[0].balances[1].underlying[3]);
displayToken(result[0].adapterBalances[0].balances[2].underlying[0]);
displayToken(result[0].adapterBalances[0].balances[2].underlying[1]);
displayToken(result[0].adapterBalances[0].balances[2].underlying[2]);
displayToken(result[0].adapterBalances[0].balances[2].underlying[3]);
+ displayToken(result[0].adapterBalances[0].balances[3].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[3].underlying[1]);
+ displayToken(result[0].adapterBalances[0].balances[3].underlying[2]);
+ displayToken(result[0].adapterBalances[0].balances[3].underlying[3]);
assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, dai);
assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[1].metadata, usdc);
assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[0].metadata, dai);
assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[1].metadata, usdc);
assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[2].metadata, usdt);
- assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[3].metadata, tusd);
assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[0].metadata, dai);
assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[1].metadata, usdc);
assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[2].metadata, usdt);
- assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[3].metadata, busd);
+ assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[3].metadata, tusd);
+ assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[0].metadata, dai);
+ assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[1].metadata, usdc);
+ assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[2].metadata, usdt);
+ assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[3].metadata, busd);
});
});
it('should return correct full unit', async () => {
await adapterRegistry.methods['getFullTokenBalance(string,address)'](
'Curve pool token',
- ssCompoundTokenAddress,
+ cCrvAddress,
)
.call()
.then((result) => {
@@ -171,7 +186,7 @@ contract('CurveAdapter', () => {
it('should return correct final full unit', async () => {
await adapterRegistry.methods['getFinalFullTokenBalance(string,address)'](
'Curve pool token',
- ssCompoundTokenAddress,
+ cCrvAddress,
)
.call()
.then((result) => {
@@ -179,16 +194,4 @@ contract('CurveAdapter', () => {
assert.deepEqual(result.underlying[1].metadata, usdc);
});
});
-
- it('should not return 0 if wrong pool token address', async () => {
- await adapterRegistry.methods.getAdapterBalance(
- testAddress,
- protocolAdapterAddress,
- [ssUSDTTokenAddress],
- )
- .call()
- .then((result) => {
- assert.deepEqual(result.balances[0].underlying, []);
- });
- });
});
diff --git a/test/CurveStakingAdapter.js b/test/CurveStakingAdapter.js
new file mode 100755
index 00000000..2a86a3c8
--- /dev/null
+++ b/test/CurveStakingAdapter.js
@@ -0,0 +1,68 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CurveStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('CurveStakingAdapter', () => {
+ const cCrvAddress = '0x845838DF265Dcd2c412A1Dc9e959c7d08537f8a2';
+ // Random address with positive balances
+ const testAddress = '0x6346BA47665092855c879428aef512C63d249351';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Curve Gauges'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ cCrvAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/CurveVestingAdapter.js b/test/CurveVestingAdapter.js
new file mode 100644
index 00000000..9ef3f419
--- /dev/null
+++ b/test/CurveVestingAdapter.js
@@ -0,0 +1,67 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('CurveVestingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('CurveVestingAdapter', () => {
+ const crvAddress = '0xD533a949740bb3306d119CC777fa900bA034cd52';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Curve Vesting'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ crvAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/CurveVoteEscrowAdapter.js b/test/CurveVoteEscrowAdapter.js
new file mode 100644
index 00000000..68da102a
--- /dev/null
+++ b/test/CurveVoteEscrowAdapter.js
@@ -0,0 +1,28 @@
+const ProtocolAdapter = artifacts.require('CurveVoteEscrowAdapter');
+
+contract('CurveVoteEscrowAdapter', () => {
+ const crvAddress = '0xD533a949740bb3306d119CC777fa900bA034cd52';
+ const testAddress = '0x91544E0d0ee6361152f06891b52E778B3614d253';
+
+ let accounts;
+ let protocolAdapterContract;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+
+ await ProtocolAdapter.new({ from: accounts[0] }).then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ });
+
+ it('returns the correct balance', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](
+ crvAddress,
+ testAddress,
+ )
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+});
diff --git a/test/DSRAdapter.js b/test/DSRAdapter.js
index 975ec0c0..314bfc79 100755
--- a/test/DSRAdapter.js
+++ b/test/DSRAdapter.js
@@ -1,8 +1,8 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./DSRAdapter');
-const TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DSRAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('DSRAdapter', () => {
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
diff --git a/test/DdexLendingAssetAdapter.js b/test/DdexLendingAssetAdapter.js
new file mode 100644
index 00000000..4069d5fc
--- /dev/null
+++ b/test/DdexLendingAssetAdapter.js
@@ -0,0 +1,76 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DdexLendingAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('DdexLendingAssetAdapter', () => {
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const dai = [
+ daiAddress,
+ 'Dai Stablecoin',
+ 'DAI',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Ddex • Lending'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ ethAddress,
+ daiAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gasLimit: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gasLimit: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, dai);
+ });
+ });
+});
diff --git a/test/DdexMarginAssetAdapter.js b/test/DdexMarginAssetAdapter.js
new file mode 100644
index 00000000..16efa444
--- /dev/null
+++ b/test/DdexMarginAssetAdapter.js
@@ -0,0 +1,84 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DdexMarginAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('DdexMarginAssetAdapter', () => {
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const dai = [
+ daiAddress,
+ 'Dai Stablecoin',
+ 'DAI',
+ '18',
+ ];
+ const eth = [
+ ethAddress,
+ 'Ether',
+ 'ETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Ddex • Margin'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ ethAddress,
+ daiAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gasLimit: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gasLimit: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, eth);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[1].base.metadata, dai);
+ });
+ });
+});
diff --git a/test/DdexMarginDebtAdapter.js b/test/DdexMarginDebtAdapter.js
new file mode 100644
index 00000000..fba38ef2
--- /dev/null
+++ b/test/DdexMarginDebtAdapter.js
@@ -0,0 +1,76 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DdexMarginDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('DdexMarginDebtAdapter', () => {
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const eth = [
+ ethAddress,
+ 'Ether',
+ 'ETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Ddex • Margin'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ ethAddress,
+ daiAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gasLimit: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gasLimit: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, eth);
+ });
+ });
+});
diff --git a/test/DdexSpotAssetAdapter.js b/test/DdexSpotAssetAdapter.js
new file mode 100644
index 00000000..ecbee397
--- /dev/null
+++ b/test/DdexSpotAssetAdapter.js
@@ -0,0 +1,76 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DdexSpotAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('DdexSpotAssetAdapter', () => {
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const dai = [
+ daiAddress,
+ 'Dai Stablecoin',
+ 'DAI',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Ddex • Spot'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ ethAddress,
+ daiAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gasLimit: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gasLimit: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, dai);
+ });
+ });
+});
diff --git a/test/DmmAssetAdapter.js b/test/DmmAssetAdapter.js
index adc46a82..65f1485a 100644
--- a/test/DmmAssetAdapter.js
+++ b/test/DmmAssetAdapter.js
@@ -1,21 +1,18 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./DmmAssetAdapter');
-const TokenAdapter = artifacts.require('./DmmTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DmmAssetAdapter');
+const TokenAdapter = artifacts.require('DmmTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('DmmAssetAdapter', () => {
const mDAIAddress = '0x06301057D77D54B6e14c7FafFB11Ffc7Cab4eaa7';
const mUSDCAddress = '0x3564ad35b9E95340E5Ace2D6251dbfC76098669B';
+ const mETHAddress = '0xdF9307DFf0a1B57660F60f9457D32027a55ca0B2';
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
- /**
- * This address is the first holder of mDAI and mUSDC - it's a DMMF-associated address and will
- * always hold a little of each token.
- */
- const testAddress = '0x0f9dd46b0e1f77cec0f66c20b9a1f56cb34a4556';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
let accounts;
let adapterRegistry;
@@ -68,6 +65,7 @@ contract('DmmAssetAdapter', () => {
[[[
mDAIAddress,
mUSDCAddress,
+ mETHAddress,
]]],
)
.send({
diff --git a/test/DodoAdapter.js b/test/DodoAdapter.js
new file mode 100755
index 00000000..66d09ad2
--- /dev/null
+++ b/test/DodoAdapter.js
@@ -0,0 +1,89 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DodoAdapter');
+const TokenAdapter = artifacts.require('DodoTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('DODOAdapter', () => {
+ const dodoWethUsdcWethAddress = '0xc11eCCDee225d644f873776A68A02eCD8c015697';
+ const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const dodoWethUsdcWeth = [
+ dodoWethUsdcWethAddress,
+ 'WETH/USDC Pool: WETH',
+ 'DLP',
+ '18',
+ ];
+ const weth = [
+ wethAddress,
+ 'Wrapped Ether',
+ 'WETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['DODO'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ dodoWethUsdcWethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'DODO pool token'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, dodoWethUsdcWeth);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, weth);
+ });
+ });
+});
diff --git a/test/DodoStakingAdapter.js b/test/DodoStakingAdapter.js
new file mode 100755
index 00000000..69f8228d
--- /dev/null
+++ b/test/DodoStakingAdapter.js
@@ -0,0 +1,68 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DodoStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('DodoStakingAdapter', () => {
+ const dodoAddress = '0x43Dfc4159D86F3A37A5A4B3D4580b888ad7d4DDd';
+ // Random address with positive balances
+ const testAddress = '0xC11a18f3F2F5D642EB85f15E284e0691125aeC51';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['DODO'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ dodoAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/DyDxAssetAdapter.js b/test/DyDxAssetAdapter.js
index bb88d217..ca28abd9 100755
--- a/test/DyDxAssetAdapter.js
+++ b/test/DyDxAssetAdapter.js
@@ -1,8 +1,8 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./DyDxAssetAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DyDxAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('DyDxAssetAdapter', () => {
const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
diff --git a/test/DyDxDebtAdapter.js b/test/DyDxDebtAdapter.js
index 47578a0b..e22d315e 100755
--- a/test/DyDxDebtAdapter.js
+++ b/test/DyDxDebtAdapter.js
@@ -1,8 +1,8 @@
-import displayToken from './helpers/displayToken';
+// import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./DyDxDebtAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('DyDxDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('DyDxDebtAdapter', () => {
const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
@@ -16,12 +16,6 @@ contract('DyDxDebtAdapter', () => {
let adapterRegistry;
let protocolAdapterAddress;
let erc20TokenAdapterAddress;
- const weth = [
- wethAddress,
- 'Wrapped Ether',
- 'WETH',
- '18',
- ];
beforeEach(async () => {
accounts = await web3.eth.getAccounts();
@@ -74,8 +68,7 @@ contract('DyDxDebtAdapter', () => {
await adapterRegistry.methods['getBalances(address)'](testAddress)
.call()
.then((result) => {
- displayToken(result[0].adapterBalances[0].balances[0].base);
- assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, weth);
+ assert.deepEqual(result, []);
});
});
diff --git a/test/ERC20TokenAdapter.js b/test/ERC20TokenAdapter.js
index 79912cfb..72351703 100755
--- a/test/ERC20TokenAdapter.js
+++ b/test/ERC20TokenAdapter.js
@@ -1,8 +1,8 @@
// import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./SynthetixAssetAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('SynthetixAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('ERC20TokenAdapter', () => {
const badAddress = '0x101571584659dC31bF3E3E5E29F55D8BdfBAecEC';
diff --git a/test/EnzymeTokenAdapter.js b/test/EnzymeTokenAdapter.js
new file mode 100755
index 00000000..8974d60b
--- /dev/null
+++ b/test/EnzymeTokenAdapter.js
@@ -0,0 +1,39 @@
+const TokenAdapter = artifacts.require('EnzymeTokenAdapter');
+
+contract('EnzymeTokenAdapter', () => {
+ const enzfAddress = '0x9D4Ed905084bbC489a514c75420429C3a246e76d';
+
+ let accounts;
+ let tokenAdapter;
+ const ENZF = [
+ enzfAddress,
+ 'Cantaloupe',
+ 'ENZF',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapter = result.contract;
+ });
+ });
+
+ it('should return correct components', async () => {
+ await tokenAdapter.methods['getComponents(address)'](enzfAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+
+ it('should return correct metadata', async () => {
+ await tokenAdapter.methods['getMetadata(address)'](enzfAddress)
+ .call()
+ .then((result) => {
+ assert.deepEqual(result, ENZF);
+ });
+ });
+});
diff --git a/test/FinNexusAssetAdapter.js b/test/FinNexusAssetAdapter.js
new file mode 100755
index 00000000..32af42a8
--- /dev/null
+++ b/test/FinNexusAssetAdapter.js
@@ -0,0 +1,67 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('FinNexusAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('FinNexusDebtAdapter', () => {
+ const fptAddress = '0xA072EA1a2a75047908e68e0B1a2baC3a7190CE58';
+ const testAddress = '0xBA096024056bB653c6E28f53C8889BFC3553bAD8';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['FinNexus'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ fptAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/FinNexusDebtAdapter.js b/test/FinNexusDebtAdapter.js
new file mode 100755
index 00000000..d71d4eee
--- /dev/null
+++ b/test/FinNexusDebtAdapter.js
@@ -0,0 +1,73 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('FinNexusDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('FinNexusDebtAdapter', () => {
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
+ const fnxAddress = '0xeF9Cd7882c067686691B6fF49e650b43AFBBCC6B';
+ const testAddress = '0xBA096024056bB653c6E28f53C8889BFC3553bAD8';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['FinNexus'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ fnxAddress,
+ ethAddress,
+ usdcAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '300000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ displayToken(result[0].adapterBalances[0].balances[2].base);
+ });
+ });
+});
diff --git a/test/GnosisProtocolAdapter.js b/test/GnosisProtocolAdapter.js
new file mode 100644
index 00000000..5d43bb47
--- /dev/null
+++ b/test/GnosisProtocolAdapter.js
@@ -0,0 +1,75 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('GnosisProtocolAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('GnosisProtocolAdapter', () => {
+ const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
+ const testAddress = '0x9eabf70538331a6932e0d249d31a5257cee5dd22';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ const weth = [
+ wethAddress,
+ 'Wrapped Ether',
+ 'WETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Gnosis Protocol'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ wethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, weth);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/HarvestStakingAdapter.js b/test/HarvestStakingAdapter.js
new file mode 100644
index 00000000..25943d53
--- /dev/null
+++ b/test/HarvestStakingAdapter.js
@@ -0,0 +1,71 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('HarvestStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('HarvestStakingAdapter', () => {
+ const fusdcAddress = '0xc3F7ffb5d5869B3ade9448D094d81B0521e8326f';
+ const farmAddress = '0xa0246c9032bC3A600820415aE600c6388619A14D';
+ // Random address with positive balances
+ const testAddress = '0x1e2b3e14148487d26923beecb94b251c0a09ba5d';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Harvest'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ fusdcAddress,
+ farmAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/IdleAdapter.js b/test/IdleAdapter.js
index 06a889ef..86b04778 100644
--- a/test/IdleAdapter.js
+++ b/test/IdleAdapter.js
@@ -1,14 +1,14 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./IdleAdapter');
-const TokenAdapter = artifacts.require('./IdleTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('IdleAdapter');
+const TokenAdapter = artifacts.require('IdleTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('IdleAdapter', () => {
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
- const idleDAIAddress = '0x10eC0D497824e342bCB0EDcE00959142aAa766dD';
- const idleUSDCAddress = '0xeB66ACc3d011056B00ea521F8203580C2E5d3991';
+ const idleDAIAddress = '0x78751B12Da02728F467A44eAc40F5cbc16Bd7934';
+ const idleUSDCAddress = '0x12B98C621E8754Ae70d0fDbBC73D6208bC3e3cA6';
const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
let accounts;
diff --git a/test/IdleRewardsAdapter.js b/test/IdleRewardsAdapter.js
new file mode 100755
index 00000000..03f1c908
--- /dev/null
+++ b/test/IdleRewardsAdapter.js
@@ -0,0 +1,68 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('IdleRewardsAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('IdleRewardsAdapter', () => {
+ const idleAddress = '0x875773784Af8135eA0ef43b5a374AaD105c5D39e';
+ // Random address with positive balances
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Idle Early Rewards'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ idleAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/IearnAdapter.js b/test/IearnAdapter.js
index 550aed6f..2b4f3c3a 100755
--- a/test/IearnAdapter.js
+++ b/test/IearnAdapter.js
@@ -1,9 +1,9 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./IearnAdapter');
-const TokenAdapter = artifacts.require('./IearnTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('IearnAdapter');
+const TokenAdapter = artifacts.require('IearnTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('IearnAdapter', () => {
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
diff --git a/test/KeeperDaoAssetAdapter.js b/test/KeeperDaoAssetAdapter.js
new file mode 100644
index 00000000..133457ec
--- /dev/null
+++ b/test/KeeperDaoAssetAdapter.js
@@ -0,0 +1,84 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('KeeperDaoAssetAdapter');
+const TokenAdapter = artifacts.require('KeeperDaoTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('KeeperDaoAssetAdapter', () => {
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const kETHAddress = '0xC4c43C78fb32F2c7F8417AF5af3B85f090F1d327';
+ const kWETHAddress = '0xac19815455C2c438af8A8b4623F65f091364be10';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const eth = [
+ ethAddress,
+ 'Ether',
+ 'ETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['KeeperDAO'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ kETHAddress,
+ kWETHAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'KToken'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, eth);
+ });
+ });
+});
diff --git a/test/KimchiStakingAdapter.js b/test/KimchiStakingAdapter.js
new file mode 100755
index 00000000..ae0c1e96
--- /dev/null
+++ b/test/KimchiStakingAdapter.js
@@ -0,0 +1,71 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('KimchiStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('KimchiStakingAdapter', () => {
+ const kimchiAddress = '0x1E18821E69B9FAA8e6e75DFFe54E7E25754beDa0';
+ const uniYfiWethAddress = '0x2fDbAdf3C4D5A8666Bc06645B8358ab803996E28';
+ // Random address with positive balances
+ const testAddress = '0x75c8e2dd57927eb0373e8e201ebf582406adcf45';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['KIMCHI'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ kimchiAddress,
+ uniYfiWethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/KyberAssetAdapter.js b/test/KyberAssetAdapter.js
new file mode 100644
index 00000000..d44138f3
--- /dev/null
+++ b/test/KyberAssetAdapter.js
@@ -0,0 +1,86 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('KyberAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('KyberAssetAdapter', () => {
+ const kncAddress = '0xdd974D5C2e2928deA5F71b9825b8b646686BD200';
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const knc = [
+ kncAddress,
+ 'Kyber Network Crystal',
+ 'KNC',
+ '18',
+ ];
+ // const eth = [
+ // ethAddress,
+ // 'Ether',
+ // 'ETH',
+ // '18',
+ // ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Kyber'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ kncAddress,
+ ethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, knc);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ // displayToken(result[0].adapterBalances[0].balances[1].base);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[1].base.metadata, eth);
+ // assert.equal(result[0].adapterBalances[0].balances[1].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/LinkswapAdapter.js b/test/LinkswapAdapter.js
new file mode 100644
index 00000000..9c591ccf
--- /dev/null
+++ b/test/LinkswapAdapter.js
@@ -0,0 +1,531 @@
+// . import displayToken from './helpers/displayToken';
+
+// const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('LinkswapAdapter');
+const TokenAdapter = artifacts.require('UniswapV2TokenAdapter');
+// const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('LinkswapAdapter', () => {
+ // const yflAddress = '0x28cb7e841ee97947a86B06fA4090C8451f64c0be';
+ // const yflusdAddress = '0x7b760d06e401f85545f3b50c44bf5b05308b7b62';
+ // const syflAddress = '0x8282df223ac402d04b2097d16f758af4f70e7db0';
+ // const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
+ // const linkAddress = '0x514910771AF9Ca656af840dff83E8264EcF986CA';
+ // const usdtAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
+ // const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
+ // const busdAddress = '0x4Fabb145d64652a948d72533023f6E7A623C7C53';
+ // const cfiAddress = '0x63b4f3e3fa4e438698ce330e365e831f7ccd1ef4';
+ // const masqAddress = '0x06F3C323f0238c72BF35011071f2b5B7F43A054c';
+ // const dpiAddress = '0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b';
+ // const celAddress = '0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d';
+ // const yaxAddress = '0xb1dc9124c395c1e97773ab855d66e879f053a289';
+ // const gswapAddress = '0xaac41EC512808d64625576EDdd580e7Ea40ef8B2';
+ // const azukiAddress = '0x910524678C0B1B23FFB9285a81f99C29C11CBaEd';
+ // const dokiAddress = '0x9ceb84f92a0561fa3cc4132ab9c0b76a59787544';
+
+ const lslpYflLink = '0x189A730921550314934019d184EC05726881D481';
+ // const lslpLinkYflusd = '0x6cd7817e6f3f52123df529e1edf5830240ce48c1';
+ // const lslpYflusdWeth = '0x195734d862dfb5380eeda0acd8acf697ea95d370';
+ // const lslpLinkSyfl = '0x74c89f297b1dc87f927d9432a4eeea697e6f89a5';
+ // const lslpSyflWeth = '0x3315351f0b20595777a28054ef3d514bdc37463d';
+ // const lslpDpiLink = '0x017fad4b7a54c1ace95ca614954e4d0d12cdb27e';
+ // const lslpLinkGswap = '0xdef0cef53e0d4c6a5e568c53edcf45ceb33dbe46';
+ // const lslpLinkCel = '0x639916bb4b29859fadf7a272185a3212157f8ce1';
+ // const lslpMasqWeth = '0x37cee65899da4b1738412814155540c98dfd752c';
+ // const lslpBusdLink = '0x983c9a1bcf0eb980a232d1b17bffd6bbf68fe4ce';
+ // const lslpLinkYax = '0x626b88542495d2e341d285969f8678b99cd91da7';
+ // const lslpYaxWeth = '0x21dee38170f1e1f26baff2c30c0fc8f8362b6961';
+ // const lslpLinkCfi = '0xf68c01198cddeafb9d2ea43368fc9fa509a339fa';
+ // const lslpLinkUsdc = '0x9d996bDD1F65C835EE92Cd0b94E15d886EF14D63';
+ // const lslpLinkUsdt = '0xf36c9fc3c2abe4132019444aff914fc8dc9785a9';
+ // const lslpYflWeth = '0x7e5A536F3d79791E283940ec379CEE10C9C40e86';
+ // const lslpLinkAzuki = '0xB7Cd446a2a80d4770C6bECde661B659cFC55acf5';
+ // const lslpLinkDoki = '0xbe755C548D585dbc4e3Fe4bcD712a32Fd81e5Ba0';
+
+ const testAddress = '0x35FC734948B36370c15387342F048aC87210bC22';
+
+ let accounts;
+ // let adapterRegistry;
+ let protocolAdapterContract;
+ let tokenAdapterContract;
+ // let erc20TokenAdapterAddress;
+ const yflLink = [
+ lslpYflLink,
+ 'YFL/LINK Pool',
+ 'LSLP',
+ '18',
+ ];
+ // const linkYflusd = [
+ // lslpLinkYflusd,
+ // 'LINK-YFLUSD',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const yflusdWeth = [
+ // lslpYflusdWeth,
+ // 'YFLUSD-WETH',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkSyfl = [
+ // lslpLinkSyfl,
+ // 'LINK-sYFL',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const syflWeth = [
+ // lslpSyflWeth,
+ // 'sYFL-WETH',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const dpiLink = [
+ // lslpDpiLink,
+ // 'DPI-LINK',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkGswap = [
+ // lslpLinkGswap,
+ // 'LINK-GSWAP',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkCel = [
+ // lslpLinkCel,
+ // 'LINK-CEL',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const masqWeth = [
+ // lslpMasqWeth,
+ // 'MASQ-WETH',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const busdLink = [
+ // lslpBusdLink,
+ // 'BUSD-LINK',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkYax = [
+ // lslpLinkYax,
+ // 'LINK-YAX',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const yaxWeth = [
+ // lslpYaxWeth,
+ // 'YAX-WETH',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkCfi = [
+ // lslpLinkCfi,
+ // 'LINK-CFI',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkUsdc = [
+ // lslpLinkUsdc,
+ // 'LINK-USDC',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkUsdt = [
+ // lslpLinkUsdt,
+ // 'LINK-USDT',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkAzuki = [
+ // lslpLinkAzuki,
+ // 'LINK-AZUKI',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const linkDoki = [
+ // lslpLinkDoki,
+ // 'LINK-DOKI',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const yflWeth = [
+ // lslpYflWeth,
+ // 'YFL-WETH',
+ // 'LSLP',
+ // '18',
+ // ];
+ // const yfl = [
+ // yflAddress,
+ // 'YF Link',
+ // 'YFL',
+ // '18',
+ // ];
+ // const yflusd = [
+ // yflusdAddress,
+ // 'YFLink USD',
+ // 'YFLUSD',
+ // '18',
+ // ];
+ // const syfl = [
+ // syflAddress,
+ // 'YFLink Synthetic',
+ // 'sYFL',
+ // '18',
+ // ];
+ // const weth = [
+ // wethAddress,
+ // 'Wrapped Ether',
+ // 'WETH',
+ // '18',
+ // ];
+ // const link = [
+ // linkAddress,
+ // 'ChainLink Token',
+ // 'LINK',
+ // '18',
+ // ];
+ // const usdc = [
+ // usdcAddress,
+ // 'USD Coin',
+ // 'USDC',
+ // '6',
+ // ];
+ // const usdt = [
+ // usdtAddress,
+ // 'Tether USD',
+ // 'USDT',
+ // '6',
+ // ];
+ // const busd = [
+ // busdAddress,
+ // 'Binance USD',
+ // 'BUSD',
+ // '18',
+ // ];
+ // const cfi = [
+ // cfiAddress,
+ // 'CyberFi Token',
+ // 'CFI',
+ // '18',
+ // ];
+ // const masq = [
+ // masqAddress,
+ // 'MASQ',
+ // 'MASQ',
+ // '18',
+ // ];
+ // const dpi = [
+ // dpiAddress,
+ // 'DefiPulse Index',
+ // 'DPI',
+ // '18',
+ // ];
+ // const cel = [
+ // celAddress,
+ // 'Celsius',
+ // 'CEL',
+ // '4',
+ // ];
+ // const yax = [
+ // yaxAddress,
+ // 'yAxis',
+ // 'YAX',
+ // '18',
+ // ];
+ // const gswap = [
+ // gswapAddress,
+ // 'gameswap.org',
+ // 'GSWAP',
+ // '18',
+ // ];
+ // const azuki = [
+ // azukiAddress,
+ // 'DokiDokiAzuki',
+ // 'AZUKI',
+ // '18',
+ // ];
+ // const doki = [
+ // dokiAddress,
+ // 'DokiDokiFinance',
+ // 'DOKI',
+ // '18',
+ // ];
+ // const yflLinkNa = [
+ // lslpYflLink,
+ // 'Not available',
+ // 'N/A',
+ // '0',
+ // ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterContract = result.contract;
+ });
+ // await ERC20TokenAdapter.new({ from: accounts[0] })
+ // .then((result) => {
+ // erc20TokenAdapterAddress = result.address;
+ // });
+ // await AdapterRegistry.new({ from: accounts[0] })
+ // .then((result) => {
+ // adapterRegistry = result.contract;
+ // });
+ // await adapterRegistry.methods.addProtocols(
+ // ['LINKSWAP'],
+ // [[
+ // 'Mock Protocol Name',
+ // 'Mock protocol description',
+ // 'Mock website',
+ // 'Mock icon',
+ // '0',
+ // ]],
+ // [[
+ // protocolAdapterAddress,
+ // ]],
+ // [[[
+ // lslpYflLink,
+ // lslpYflWeth,
+ // lslpLinkYflusd,
+ // lslpYflusdWeth,
+ // lslpLinkSyfl,
+ // lslpSyflWeth,
+ // lslpLinkUsdc,
+ // lslpLinkUsdt,
+ // lslpLinkCel,
+ // lslpLinkYax,
+ // lslpYaxWeth,
+ // lslpLinkCfi,
+ // lslpLinkGswap,
+ // lslpBusdLink,
+ // lslpDpiLink,
+ // lslpMasqWeth,
+ // lslpLinkAzuki,
+ // lslpLinkDoki,
+ // ]]],
+ // )
+ // .send({
+ // from: accounts[0],
+ // gas: '1000000',
+ // });
+ // await adapterRegistry.methods.addTokenAdapters(
+ // ['ERC20', 'Uniswap V2 pool token'],
+ // [erc20TokenAdapterAddress, tokenAdapterAddress],
+ // )
+ // .send({
+ // from: accounts[0],
+ // gas: '1000000',
+ // });
+ });
+
+ it('should return correct balances', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](lslpYflLink, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+
+ it('should return correct components', async () => {
+ await tokenAdapterContract.methods['getComponents(address)'](lslpYflLink)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+
+ it('should return correct metadata', async () => {
+ await tokenAdapterContract.methods['getMetadata(address)'](lslpYflLink)
+ .call()
+ .then((result) => {
+ assert.deepEqual(result, yflLink);
+ });
+ });
+
+ // it('should return correct balances', async () => {
+ // await adapterRegistry.methods['getBalances(address)'](testAddress)
+ // .call()
+ // .then((result) => {
+ // displayToken(result[0].adapterBalances[0].balances[0].base);
+ // displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[0].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[1].base);
+ // displayToken(result[0].adapterBalances[0].balances[1].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[1].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[2].base);
+ // displayToken(result[0].adapterBalances[0].balances[2].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[2].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[3].base);
+ // displayToken(result[0].adapterBalances[0].balances[3].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[3].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[4].base);
+ // displayToken(result[0].adapterBalances[0].balances[4].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[4].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[5].base);
+ // displayToken(result[0].adapterBalances[0].balances[5].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[5].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[6].base);
+ // displayToken(result[0].adapterBalances[0].balances[6].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[6].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[7].base);
+ // displayToken(result[0].adapterBalances[0].balances[7].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[7].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[8].base);
+ // displayToken(result[0].adapterBalances[0].balances[8].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[8].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[9].base);
+ // displayToken(result[0].adapterBalances[0].balances[9].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[9].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[10].base);
+ // displayToken(result[0].adapterBalances[0].balances[10].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[10].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[11].base);
+ // displayToken(result[0].adapterBalances[0].balances[11].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[11].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[12].base);
+ // displayToken(result[0].adapterBalances[0].balances[12].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[12].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[13].base);
+ // displayToken(result[0].adapterBalances[0].balances[13].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[13].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[14].base);
+ // displayToken(result[0].adapterBalances[0].balances[14].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[14].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[15].base);
+ // displayToken(result[0].adapterBalances[0].balances[15].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[15].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[16].base);
+ // displayToken(result[0].adapterBalances[0].balances[16].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[16].underlying[1]);
+ // displayToken(result[0].adapterBalances[0].balances[17].base);
+ // displayToken(result[0].adapterBalances[0].balances[17].underlying[0]);
+ // displayToken(result[0].adapterBalances[0].balances[17].underlying[1]);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, yfl);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[0].metadata, link);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[0].metadata, link);
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[3].underlying[0].metadata,
+ // yflusd,
+ // );
+ // assert.deepEqual(result[0].adapterBalances[0].balances[4].underlying[0].metadata, link);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[5].underlying[0].metadata, syfl);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[6].underlying[0].metadata, link);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[7].underlying[0].metadata, link);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[8].underlying[0].metadata, link);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[9].underlying[0].metadata, link);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[10].underlying[0].metadata, yax);
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[11].underlying[0].metadata,
+ // link,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[12].underlying[0].metadata,
+ // link,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[13].underlying[0].metadata,
+ // busd,
+ // );
+ // assert.deepEqual(result[0].adapterBalances[0].balances[14].underlying[0].metadata, dpi);
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[15].underlying[0].metadata,
+ // masq,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[16].underlying[0].metadata,
+ // link,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[17].underlying[0].metadata,
+ // link,
+ // );
+ // assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, yflLink);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[1].base.metadata, yflWeth);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[2].base.metadata, linkYflusd);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[3].base.metadata, yflusdWeth);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[4].base.metadata, linkSyfl);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[5].base.metadata, syflWeth);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[6].base.metadata, linkUsdc);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[7].base.metadata, linkUsdt);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[8].base.metadata, linkCel);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[9].base.metadata, linkYax);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[10].base.metadata, yaxWeth);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[11].base.metadata, linkCfi);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[12].base.metadata, linkGswap);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[13].base.metadata, busdLink);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[14].base.metadata, dpiLink);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[15].base.metadata, masqWeth);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[16].base.metadata, linkAzuki);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[17].base.metadata, linkDoki);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[1].metadata, link);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[1].metadata, weth);
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[2].underlying[1].metadata,
+ // yflusd,
+ // );
+ // assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[1].metadata, weth);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[4].underlying[1].metadata, syfl);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[5].underlying[1].metadata, weth);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[6].underlying[1].metadata, usdc);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[7].underlying[1].metadata, usdt);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[8].underlying[1].metadata, cel);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[9].underlying[1].metadata, yax);
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[10].underlying[1].metadata,
+ // weth,
+ // );
+ // assert.deepEqual(result[0].adapterBalances[0].balances[11].underlying[1].metadata, cfi);
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[12].underlying[1].metadata,
+ // gswap,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[13].underlying[1].metadata,
+ // link,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[14].underlying[1].metadata,
+ // link,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[15].underlying[1].metadata,
+ // weth,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[16].underlying[1].metadata,
+ // azuki,
+ // );
+ // assert.deepEqual(
+ // result[0].adapterBalances[0].balances[17].underlying[1].metadata,
+ // doki,
+ // );
+ // });
+ // });
+ //
+ // it('should not fail if token adapter is missing', async () => {
+ // await adapterRegistry.methods.removeTokenAdapters(
+ // ['LSLP'],
+ // )
+ // .send({
+ // from: accounts[0],
+ // gas: '1000000',
+ // });
+ // await adapterRegistry.methods.getAdapterBalance(
+ // testAddress,
+ // protocolAdapterAddress,
+ // [lslpYflLink],
+ // )
+ // .call()
+ // .then((result) => {
+ // assert.deepEqual(result.balances[0].base.metadata, yflLinkNa);
+ // assert.equal(result.balances[0].underlying.length, 0);
+ // });
+ // });
+});
diff --git a/test/LinkswapStakingAdapter.js b/test/LinkswapStakingAdapter.js
new file mode 100644
index 00000000..ed9e2c61
--- /dev/null
+++ b/test/LinkswapStakingAdapter.js
@@ -0,0 +1,84 @@
+// import displayToken from './helpers/displayToken';
+
+// const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('LinkswapStakingAdapter');
+// const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('LinkswapStakingAdapter', () => {
+ const yflAddress = '0x28cb7e841ee97947a86B06fA4090C8451f64c0be';
+ // Random address with positive balances
+ const testAddress = '0x75D1aA733920b14fC74c9F6e6faB7ac1EcE8482E';
+
+ let accounts;
+ // let adapterRegistry;
+ let protocolAdapterContract;
+ // let erc20TokenAdapterAddress;
+ // const yfl = [
+ // yflAddress,
+ // 'YFLink',
+ // 'YFL',
+ // '18',
+ // ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ // await ERC20TokenAdapter.new({ from: accounts[0] })
+ // .then((result) => {
+ // erc20TokenAdapterAddress = result.address;
+ // });
+ // await AdapterRegistry.new({ from: accounts[0] })
+ // .then((result) => {
+ // adapterRegistry = result.contract;
+ // });
+ // await adapterRegistry.methods.addProtocols(
+ // ['LINKSWAP Staking'],
+ // [[
+ // 'Mock Protocol Name',
+ // 'Mock protocol description',
+ // 'Mock website',
+ // 'Mock icon',
+ // '0',
+ // ]],
+ // [[
+ // protocolAdapterContract,
+ // ]],
+ // [[[
+ // yflAddress,
+ // ]]],
+ // )
+ // .send({
+ // from: accounts[0],
+ // gas: '1000000',
+ // });
+ // await adapterRegistry.methods.addTokenAdapters(
+ // ['ERC20'],
+ // [erc20TokenAdapterAddress],
+ // )
+ // .send({
+ // from: accounts[0],
+ // gas: '1000000',
+ // });
+ });
+
+ it('should return correct balances', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](yflAddress, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+
+ // it('should return correct balances', async () => {
+ // await adapterRegistry.methods['getBalances(address)'](testAddress)
+ // .call()
+ // .then((result) => {
+ // displayToken(result[0].adapterBalances[0].balances[0].base);
+ // displayToken(result[0].adapterBalances[0].balances[1].base);
+ // assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, yfl);
+ // });
+ // });
+});
diff --git a/test/MCDAssetAdapter.js b/test/MCDAssetAdapter.js
index 4f0f8d54..445203cf 100755
--- a/test/MCDAssetAdapter.js
+++ b/test/MCDAssetAdapter.js
@@ -1,9 +1,9 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./MCDAssetAdapter');
-const DebtProtocolAdapter = artifacts.require('./MCDDebtAdapter');
-const TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MCDAssetAdapter');
+const DebtProtocolAdapter = artifacts.require('MCDDebtAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('MCDAssetAdapter', () => {
const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
diff --git a/test/MCDDebtAdapter.js b/test/MCDDebtAdapter.js
index 25c1a1f8..2934d4d1 100755
--- a/test/MCDDebtAdapter.js
+++ b/test/MCDDebtAdapter.js
@@ -1,8 +1,8 @@
// import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./MCDDebtAdapter');
-const TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MCDDebtAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('MCDDebtAdapter', () => {
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F'; // for debt
diff --git a/test/MakerGovernanceAdapter.js b/test/MakerGovernanceAdapter.js
new file mode 100644
index 00000000..6f39c082
--- /dev/null
+++ b/test/MakerGovernanceAdapter.js
@@ -0,0 +1,76 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MakerGovernanceAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('MakerGovernanceAdapter', () => {
+ const mkrAddress = '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2';
+ // Random address with deposits > 0
+ const testAddress = '0xCE612d91a21203671901142034A76DEd9D8591EE';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ const mkr = [
+ mkrAddress,
+ 'Maker',
+ 'MKR',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Maker Governance'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ mkrAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, mkr);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/MaticStakingAdapter.js b/test/MaticStakingAdapter.js
new file mode 100644
index 00000000..c084682d
--- /dev/null
+++ b/test/MaticStakingAdapter.js
@@ -0,0 +1,75 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MaticStakingAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('MaticStakingAdapter', () => {
+ const maticAddress = '0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ const matic = [
+ maticAddress,
+ 'Matic Token',
+ 'MATIC',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Matic'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ maticAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, matic);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/MelonAssetAdapter.js b/test/MelonAssetAdapter.js
new file mode 100644
index 00000000..2ff9b240
--- /dev/null
+++ b/test/MelonAssetAdapter.js
@@ -0,0 +1,91 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MelonAssetAdapter');
+const TokenAdapter = artifacts.require('MelonTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('MelonAssetAdapter', () => {
+ const mlnfAddress = '0xfC14b7257e1d1ef0d2198774c234CFD553877dBc';
+ const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
+ // Random address with positive balance
+ const testAddress = '0x3dB962e4A0fbD60A6c68957DA8C7C1cfD264B203';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const mlnf = [
+ mlnfAddress,
+ '0x000000000000000000000000000000000000000000005268696e6f2046756e64', // 'Rhino Fund',
+ 'MLNF',
+ '18',
+ ];
+ const weth = [
+ wethAddress,
+ 'Wrapped Ether',
+ 'WETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Melon Protocol'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ mlnfAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'MelonToken'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[1]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, mlnf);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, weth);
+ });
+ });
+});
diff --git a/test/MooniswapAdapter.js b/test/MooniswapAdapter.js
new file mode 100755
index 00000000..8961e009
--- /dev/null
+++ b/test/MooniswapAdapter.js
@@ -0,0 +1,104 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MooniswapAdapter');
+const TokenAdapter = artifacts.require('MooniswapTokenAdapter');
+const CompoundTokenAdapter = artifacts.require('CompoundTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('MooniswapAdapter', () => {
+ const usdcEthMooniAddress = '0x61Bb2Fda13600c497272A8DD029313AfdB125fd3';
+ const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
+ const ethAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let cTokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const usdcEthMooni = [
+ usdcEthMooniAddress,
+ 'Mooniswap V1 (ETH-USDC)',
+ 'MOON-V1-ETH-USDC',
+ '18',
+ ];
+ const usdc = [
+ usdcAddress,
+ 'USD//C',
+ 'USDC',
+ '6',
+ ];
+ const eth = [
+ ethAddress,
+ 'Ether',
+ 'ETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await CompoundTokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ cTokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Mooniswap'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ usdcEthMooniAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'Mooniswap pool token', 'CToken'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress, cTokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[1]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, usdcEthMooni);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, eth);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[1].metadata, usdc);
+ });
+ });
+});
diff --git a/test/MstableAdapter.js b/test/MstableAdapter.js
new file mode 100644
index 00000000..e843e61e
--- /dev/null
+++ b/test/MstableAdapter.js
@@ -0,0 +1,109 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MstableAssetAdapter');
+const TokenAdapter = artifacts.require('MstableTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('MstableAssetAdapter', () => {
+ const mUsdAddress = '0xe2f2a5C287993345a840Db3B0845fbC70f5935a5';
+ const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
+ const tusdAddress = '0x0000000000085d4780B73119b644AE5ecd22b376';
+ const usdtAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const dai = [
+ daiAddress,
+ 'Dai Stablecoin',
+ 'DAI',
+ '18',
+ ];
+ const usdc = [
+ usdcAddress,
+ 'USD//C',
+ 'USDC',
+ '6',
+ ];
+ const tusd = [
+ tusdAddress,
+ 'TrueUSD',
+ 'TUSD',
+ '18',
+ ];
+ const usdt = [
+ usdtAddress,
+ 'Tether USD',
+ 'USDT',
+ '6',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Mstable'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ mUsdAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'Masset'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[1]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[2]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[3]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, dai);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[1].metadata, usdc);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[2].metadata, tusd);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[3].metadata, usdt);
+ });
+ });
+});
diff --git a/test/MstableSavingsTokenAdapter.js b/test/MstableSavingsTokenAdapter.js
new file mode 100755
index 00000000..0c551a07
--- /dev/null
+++ b/test/MstableSavingsTokenAdapter.js
@@ -0,0 +1,40 @@
+const TokenAdapter = artifacts.require('MstableSavingsTokenAdapter');
+
+contract('MstableSavingsTokenAdapter', () => {
+ const imUsdAddress = '0x30647a72Dc82d7Fbb1123EA74716aB8A317Eac19';
+ const mUsdAddress = '0xe2f2a5C287993345a840Db3B0845fbC70f5935a5';
+
+ let accounts;
+ let tokenAdapter;
+ const imUSD = [
+ imUsdAddress,
+ 'Interest bearing mUSD',
+ 'imUSD',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapter = result.contract;
+ });
+ });
+
+ it('should return correct components', async () => {
+ await tokenAdapter.methods['getComponents(address)'](imUsdAddress)
+ .call()
+ .then((result) => {
+ assert.equal(result[0][0], mUsdAddress);
+ });
+ });
+
+ it('should return correct metadata', async () => {
+ await tokenAdapter.methods['getMetadata(address)'](imUsdAddress)
+ .call()
+ .then((result) => {
+ assert.deepEqual(result, imUSD);
+ });
+ });
+});
diff --git a/test/MstableStakingAdapter.js b/test/MstableStakingAdapter.js
new file mode 100644
index 00000000..bf158988
--- /dev/null
+++ b/test/MstableStakingAdapter.js
@@ -0,0 +1,80 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('MstableStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('MstableStakingAdapter', () => {
+ const mtaAddress = '0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2';
+ const balAddress = '0xba100000625a3754423978a60c9317c58a424e3D';
+ const balancerMusd20Mta80Address = '0x003a70265a3662342010823bEA15Dc84C6f7eD54';
+ const balancerUsdc50Musd50Address = '0x72Cd8f4504941Bf8c5a21d1Fd83A96499FD71d2C';
+ const balancerMusd95Mta5Address = '0xa5DA8Cc7167070B62FdCB332EF097A55A68d8824';
+ const balancerWeth50Musd50Address = '0xe036CCE08cf4E23D33bC6B18e53Caf532AFa8513';
+ const uniswapMtaWethAddress = '0x0d0d65E7A7dB277d3E0F5E1676325E75f3340455';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['mStable Staking'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ mtaAddress,
+ balAddress,
+ balancerMusd20Mta80Address,
+ balancerUsdc50Musd50Address,
+ balancerMusd95Mta5Address,
+ balancerWeth50Musd50Address,
+ uniswapMtaWethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/MustStakingAdapter.js b/test/MustStakingAdapter.js
new file mode 100755
index 00000000..4cb7f70f
--- /dev/null
+++ b/test/MustStakingAdapter.js
@@ -0,0 +1,34 @@
+const ProtocolAdapter = artifacts.require('MustStakingAdapter');
+
+contract('MustStakingAdapter', () => {
+ const mustAddress = '0x9C78EE466D6Cb57A4d01Fd887D2b5dFb2D46288f';
+ const uniMustWeth = '0x15861b072abAd08b24460Add30b09E1481290F94';
+ const testAddress = '0x2ed393Dd537Bf9d60D7bB98C67811be135a5f045';
+
+ let accounts;
+ let protocolAdapterContract;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ });
+
+ it('should return correct balances for must', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](mustAddress, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+
+ it('should return correct balances for uni', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](uniMustWeth, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+});
diff --git a/test/NexusStakingAdapter.js b/test/NexusStakingAdapter.js
new file mode 100644
index 00000000..db929a17
--- /dev/null
+++ b/test/NexusStakingAdapter.js
@@ -0,0 +1,68 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('NexusStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('NexusStakingAdapter', () => {
+ const nxmAddress = '0xd7c49CEE7E9188cCa6AD8FF264C1DA2e69D4Cf3B';
+ // Random address with positive balance
+ const testAddress = '0x37b376924ffcce0b3e74004000ead546e299e3c6';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Nexus Mutual Staking'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ nxmAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ });
+ });
+});
diff --git a/test/OneInchLiquidityProtocolAdapter.js b/test/OneInchLiquidityProtocolAdapter.js
new file mode 100755
index 00000000..7f7d3e60
--- /dev/null
+++ b/test/OneInchLiquidityProtocolAdapter.js
@@ -0,0 +1,40 @@
+const ProtocolAdapter = artifacts.require('OneInchLiquidityProtocolAdapter');
+const TokenAdapter = artifacts.require('OneInchLiquidityProtocolTokenAdapter');
+const CompoundTokenAdapter = artifacts.require('CompoundTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('OneInchLiquidityProtocolAdapter', () => {
+ const usdcEthAddress = '0xbbcaf4dc53befcb85deb56edd9ff37efaeb00e74';
+
+ let accounts;
+ let tokenAdapter;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ tokenAdapter = result.contract;
+ });
+ await CompoundTokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ cTokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await tokenAdapter.methods['getComponents(address)'](usdcEthAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+});
diff --git a/test/OusdTokenAdapter.js b/test/OusdTokenAdapter.js
new file mode 100644
index 00000000..3c5215f9
--- /dev/null
+++ b/test/OusdTokenAdapter.js
@@ -0,0 +1,39 @@
+const TokenAdapter = artifacts.require('OusdTokenAdapter');
+
+contract.only('OusdTokenAdapter', () => {
+ const tokenAddress = '0x2A8e1E676Ec238d8A992307B495b45B3fEAa5e86';
+
+ let accounts;
+ let tokenAdapter;
+ const OUSD = [
+ tokenAddress,
+ 'Origin Dollar',
+ 'OUSD',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapter = result.contract;
+ });
+ });
+
+ it('should return correct components', async () => {
+ await tokenAdapter.methods['getComponents(address)'](tokenAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+
+ it('should return correct metadata', async () => {
+ await tokenAdapter.methods['getMetadata(address)'](tokenAddress)
+ .call()
+ .then((result) => {
+ assert.deepEqual(result, OUSD);
+ });
+ });
+});
diff --git a/test/PickleAssetAdapter.js b/test/PickleAssetAdapter.js
new file mode 100755
index 00000000..c1848c4b
--- /dev/null
+++ b/test/PickleAssetAdapter.js
@@ -0,0 +1,75 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('PickleAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+const TokenAdapter = artifacts.require('PickleTokenAdapter');
+
+contract('PickleAssetAdapter', () => {
+ const pickleThreeCrvJarV2Address = '0x1BB74b5DdC1f4fC91D6f9E7906cf68bc93538e33';
+ // Random address with positive balances
+ const testAddress = '0xB671BBf9Cca4DAaB9953628303e51C3bCcb6924E';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ let tokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Pickle Finance'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ pickleThreeCrvJarV2Address,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'PickleJar'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ });
+ });
+});
diff --git a/test/PickleStakingV1Adapter.js b/test/PickleStakingV1Adapter.js
new file mode 100755
index 00000000..146880ed
--- /dev/null
+++ b/test/PickleStakingV1Adapter.js
@@ -0,0 +1,71 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('PickleStakingV1Adapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('PickleStakingV1Adapter', () => {
+ const pickleAddress = '0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5';
+ const sCrvAddress = '0xC25a3A3b969415c80451098fa907EC722572917F';
+ // Random address with positive balances
+ const testAddress = '0x7563839e02004d3f419ff78df4256e9c5dd713ed';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Pickle Finance'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ pickleAddress,
+ sCrvAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/PickleStakingV2Adapter.js b/test/PickleStakingV2Adapter.js
new file mode 100755
index 00000000..8d7d0b81
--- /dev/null
+++ b/test/PickleStakingV2Adapter.js
@@ -0,0 +1,71 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('PickleStakingV2Adapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('PickleStakingV2Adapter', () => {
+ const pickleAddress = '0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5';
+ const uniPickleWethAddress = '0xdc98556Ce24f007A5eF6dC1CE96322d65832A819';
+ // Random address with positive balances
+ const testAddress = '0x774facd1685bca4a978f6097ed69c5ea0b158a65';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Pickle Finance'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ pickleAddress,
+ uniPickleWethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/PieDAOPieAdapter.js b/test/PieDAOPieAdapter.js
new file mode 100755
index 00000000..9d771e17
--- /dev/null
+++ b/test/PieDAOPieAdapter.js
@@ -0,0 +1,118 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('PieDAOPieAdapter');
+const TokenAdapter = artifacts.require('PieDAOPieTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('PieDAOPieAdapter', () => {
+ const BTCPPAddress = '0x0327112423F3A68efdF1fcF402F6c5CB9f7C33fd';
+ const wbtcAddress = '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599';
+ const pbtcAddress = '0x5228a22e72ccC52d415EcFd199F99D0665E7733b';
+ const imbtcAddress = '0x3212b29E33587A00FB1C83346f5dBFA69A458923';
+ const sbtcAddress = '0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6';
+
+ const testAddress = '0xd4DBF96Db2FDf8ED40296d8d104b371aDF7dEE12';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ const btcpp = [
+ BTCPPAddress,
+ 'PieDAO BTC++',
+ 'BTC++',
+ '18',
+ ];
+ const wbtc = [
+ wbtcAddress,
+ 'Wrapped BTC',
+ 'WBTC',
+ '8',
+ ];
+ const pbtc = [
+ pbtcAddress,
+ 'pTokens BTC',
+ 'pBTC',
+ '18',
+ ];
+ const imbtc = [
+ imbtcAddress,
+ 'The Tokenized Bitcoin',
+ 'imBTC',
+ '8',
+ ];
+ const sbtc = [
+ sbtcAddress,
+ 'Synth sBTC',
+ 'sBTC',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['PieDAOPie'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ BTCPPAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'PieDAO Pie Token'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[1]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[2]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[3]);
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, btcpp);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, wbtc);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[1].metadata, pbtc);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[2].metadata, imbtc);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[3].metadata, sbtc);
+ });
+ });
+});
diff --git a/test/PieDAOStakingAdapter.js b/test/PieDAOStakingAdapter.js
new file mode 100755
index 00000000..0512a733
--- /dev/null
+++ b/test/PieDAOStakingAdapter.js
@@ -0,0 +1,71 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('PieDAOStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('PieDAOStakingAdapter', () => {
+ const doughAddress = '0xad32A8e6220741182940c5aBF610bDE99E737b2D';
+ const bptAddress = '0xFAE2809935233d4BfE8a56c2355c4A2e7d1fFf1A';
+ // Random address with positive balances
+ const testAddress = '0x66827bcd635f2bb1779d68c46aeb16541bca6ba8';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['PieDAO Staking'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ doughAddress,
+ bptAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/PoolTogetherAdapter.js b/test/PoolTogetherAdapter.js
index 5d0305bb..672756aa 100755
--- a/test/PoolTogetherAdapter.js
+++ b/test/PoolTogetherAdapter.js
@@ -1,9 +1,9 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./PoolTogetherAdapter');
-const TokenAdapter = artifacts.require('./PoolTogetherTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('PoolTogetherAdapter');
+const TokenAdapter = artifacts.require('PoolTogetherTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('PoolTogetherAdapter', () => {
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
diff --git a/test/PoolTogetherV3TokenAdapter.js b/test/PoolTogetherV3TokenAdapter.js
new file mode 100755
index 00000000..948ab01b
--- /dev/null
+++ b/test/PoolTogetherV3TokenAdapter.js
@@ -0,0 +1,47 @@
+const TokenAdapter = artifacts.require('PoolTogetherV3TokenAdapter');
+
+contract('PoolTogetherV3TokenAdapter', () => {
+ const pcUNIAddress = '0xA92a861FC11b99b24296aF880011B47F9cAFb5ab';
+ const uniAddress = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984';
+
+ let accounts;
+ let tokenAdapter;
+ const pcUNI = [
+ pcUNIAddress,
+ 'PoolTogether UNI Ticket (Compound)',
+ 'PcUNI',
+ '18',
+ ];
+ const pcUNIComponents = [
+ [
+ uniAddress,
+ 'ERC20',
+ '1000000000000000000',
+ ],
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapter = result.contract;
+ });
+ });
+
+ it('should return correct components', async () => {
+ await tokenAdapter.methods['getComponents(address)'](pcUNIAddress)
+ .call()
+ .then((result) => {
+ assert.deepEqual(result, pcUNIComponents);
+ });
+ });
+
+ it('should return correct metadata', async () => {
+ await tokenAdapter.methods['getMetadata(address)'](pcUNIAddress)
+ .call()
+ .then((result) => {
+ assert.deepEqual(result, pcUNI);
+ });
+ });
+});
diff --git a/test/ReflexerAssetAdapter.js b/test/ReflexerAssetAdapter.js
new file mode 100755
index 00000000..b250729e
--- /dev/null
+++ b/test/ReflexerAssetAdapter.js
@@ -0,0 +1,26 @@
+const ProtocolAdapter = artifacts.require('ReflexerAssetAdapter');
+
+contract('ReflexerAssetAdapter', () => {
+ const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
+ // DSProxy of '0xBd3f90047B14e4f392d6877276d52D0aC59F4CF8'
+ const testAddress = '0x3B75d4C34dbf26BA53AeB2220bf8A96C40d6FdC9';
+
+ let accounts;
+ let protocolAdapterContract;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ });
+
+ it('should return correct balances for weth', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](wethAddress, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+});
diff --git a/test/ReflexerDebtAdapter.js b/test/ReflexerDebtAdapter.js
new file mode 100755
index 00000000..5de647bd
--- /dev/null
+++ b/test/ReflexerDebtAdapter.js
@@ -0,0 +1,26 @@
+const ProtocolAdapter = artifacts.require('ReflexerDebtAdapter');
+
+contract('ReflexerDebtAdapter', () => {
+ const raiAddress = '0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919';
+ // DSProxy of '0xBd3f90047B14e4f392d6877276d52D0aC59F4CF8'
+ const testAddress = '0x3B75d4C34dbf26BA53AeB2220bf8A96C40d6FdC9';
+
+ let accounts;
+ let protocolAdapterContract;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ });
+
+ it('should return correct balances for weth', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](raiAddress, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+});
diff --git a/test/SushiStakingAdapter.js b/test/SushiStakingAdapter.js
new file mode 100755
index 00000000..44e449e7
--- /dev/null
+++ b/test/SushiStakingAdapter.js
@@ -0,0 +1,71 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('SushiStakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('SushiStakingAdapter', () => {
+ const sushiAddress = '0x6B3595068778DD592e39A122f4f5a5cF09C90fE2';
+ const uniSushiWethAddress = '0xCE84867c3c02B05dc570d0135103d3fB9CC19433';
+ // Random address with positive balances
+ const testAddress = '0x1ec594a869dc67d78fabc33963d3c6a0ab017dd6';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['SushiSwap'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ sushiAddress,
+ uniSushiWethAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/SynthetixAssetAdapter.js b/test/SynthetixAssetAdapter.js
index e2891165..bdb4475c 100755
--- a/test/SynthetixAssetAdapter.js
+++ b/test/SynthetixAssetAdapter.js
@@ -1,11 +1,16 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./SynthetixAssetAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('SynthetixAssetAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('SynthetixAssetAdapter', () => {
const snxAddress = '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F';
+ const sethUniAddress = '0xe9Cf7887b93150D4F2Da7dFc6D502B216438F244';
+ const curveSnxAddress = '0xC25a3A3b969415c80451098fa907EC722572917F';
+ const curveSbtcAddress = '0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3';
+ const iETHAddress = '0xA9859874e1743A32409f75bB11549892138BBA1E';
+ const sxauUniAddress = '0x34a0216C5057bC18e5d34D4405284564eFd759b2';
const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
let accounts;
@@ -18,6 +23,36 @@ contract('SynthetixAssetAdapter', () => {
'SNX',
'18',
];
+ const sethUni = [
+ sethUniAddress,
+ 'Not available',
+ 'N/A',
+ '0',
+ ];
+ const ieth = [
+ iETHAddress,
+ 'Synth iETH',
+ 'iETH',
+ '18',
+ ];
+ const sxauUni = [
+ sxauUniAddress,
+ 'Uniswap V2',
+ 'UNI-V2',
+ '18',
+ ];
+ const curveSusd = [
+ curveSnxAddress,
+ 'Curve.fi DAI/USDC/USDT/sUSD',
+ 'crvPlain3andSUSD',
+ '18',
+ ];
+ const curveSbtc = [
+ curveSbtcAddress,
+ 'Curve.fi renBTC/wBTC/sBTC',
+ 'crvRenWSBTC',
+ '18',
+ ];
beforeEach(async () => {
accounts = await web3.eth.getAccounts();
@@ -47,6 +82,11 @@ contract('SynthetixAssetAdapter', () => {
]],
[[[
snxAddress,
+ sethUniAddress,
+ curveSnxAddress,
+ iETHAddress,
+ sxauUniAddress,
+ curveSbtcAddress,
]]],
)
.send({
@@ -70,6 +110,21 @@ contract('SynthetixAssetAdapter', () => {
displayToken(result[0].adapterBalances[0].balances[0].base);
assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, snx);
assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[1].base.metadata, sethUni);
+ assert.equal(result[0].adapterBalances[0].balances[1].underlying.length, 0);
+ displayToken(result[0].adapterBalances[0].balances[2].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[2].base.metadata, curveSusd);
+ assert.equal(result[0].adapterBalances[0].balances[2].underlying.length, 0);
+ displayToken(result[0].adapterBalances[0].balances[3].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[3].base.metadata, ieth);
+ assert.equal(result[0].adapterBalances[0].balances[3].underlying.length, 0);
+ displayToken(result[0].adapterBalances[0].balances[4].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[4].base.metadata, sxauUni);
+ assert.equal(result[0].adapterBalances[0].balances[4].underlying.length, 0);
+ displayToken(result[0].adapterBalances[0].balances[5].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[5].base.metadata, curveSbtc);
+ assert.equal(result[0].adapterBalances[0].balances[5].underlying.length, 0);
});
});
});
diff --git a/test/SynthetixDebtAdapter.js b/test/SynthetixDebtAdapter.js
index fe3f5f4e..901af7b3 100755
--- a/test/SynthetixDebtAdapter.js
+++ b/test/SynthetixDebtAdapter.js
@@ -1,8 +1,8 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./SynthetixDebtAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('SynthetixDebtAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('SynthetixDebtAdapter', () => {
const susdAddress = '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51';
diff --git a/test/TokenSetsAdapter.js b/test/TokenSetsAdapter.js
index 6a66e5f2..d55167f1 100755
--- a/test/TokenSetsAdapter.js
+++ b/test/TokenSetsAdapter.js
@@ -1,9 +1,9 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./TokenSetsAdapter');
-const TokenAdapter = artifacts.require('./TokenSetsTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('TokenSetsAdapter');
+const TokenAdapter = artifacts.require('TokenSetsTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('TokenSetsAdapter', () => {
const ETH12DayEMACrossoverSet = '0x2c5a9980B41861D91D30d0E0271d1c093452DcA5';
diff --git a/test/TokenSetsV2Adapter.js b/test/TokenSetsV2Adapter.js
new file mode 100755
index 00000000..d2c78110
--- /dev/null
+++ b/test/TokenSetsV2Adapter.js
@@ -0,0 +1,86 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('TokenSetsV2Adapter');
+const TokenAdapter = artifacts.require('TokenSetsV2TokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('TokenSetsV2Adapter', () => {
+ const dpiAddress = '0x1494CA1F11D487c2bBe4543E90080AeBa4BA3C2b';
+
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['TokenSetsV2'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ dpiAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'SetToken V2'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[1]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[2]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[3]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[4]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[5]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[6]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[7]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[8]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[9]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[10]);
+ });
+ });
+});
diff --git a/test/TubeProtocolAdapter.js b/test/TubeProtocolAdapter.js
new file mode 100755
index 00000000..8cc3ab58
--- /dev/null
+++ b/test/TubeProtocolAdapter.js
@@ -0,0 +1,25 @@
+const ProtocolAdapter = artifacts.require('TubeProtocolAdapter');
+
+contract('TubeProtocolAdapter', () => {
+ const mustAddress = '0x9C78EE466D6Cb57A4d01Fd887D2b5dFb2D46288f';
+ const testAddress = '0x2ed393Dd537Bf9d60D7bB98C67811be135a5f045';
+
+ let accounts;
+ let protocolAdapterContract;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterContract = result.contract;
+ });
+ });
+
+ it('should return correct balances for must', async () => {
+ await protocolAdapterContract.methods['getBalance(address,address)'](mustAddress, testAddress)
+ .call()
+ .then((result) => {
+ console.dir(result, { depth: null });
+ });
+ });
+});
diff --git a/test/UniswapV1Adapter.js b/test/UniswapV1Adapter.js
index bab0e795..70e168af 100755
--- a/test/UniswapV1Adapter.js
+++ b/test/UniswapV1Adapter.js
@@ -1,22 +1,19 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./UniswapV1Adapter');
-const TokenAdapter = artifacts.require('./UniswapV1TokenAdapter');
-const CompoundTokenAdapter = artifacts.require('./CompoundTokenAdapter');
-const ERC20TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('UniswapV1Adapter');
+const TokenAdapter = artifacts.require('UniswapV1TokenAdapter');
+const CompoundTokenAdapter = artifacts.require('CompoundTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('UniswapV1Adapter', () => {
const batUniAddress = '0x2E642b8D59B45a1D8c5aEf716A84FF44ea665914';
const mkrUniAddress = '0x2C4Bd064b998838076fa341A83d007FC2FA50957';
- const daiUniAddress = '0x2a1530C4C41db0B0b2bB646CB5Eb1A67b7158667';
const usdcUniAddress = '0x97deC872013f6B5fB443861090ad931542878126';
const snxUniAddress = '0x3958B4eC427F8fa24eB60F42821760e88d485f7F';
const saiUniAddress = '0x09cabEC1eAd1c0Ba254B09efb3EE13841712bE14';
- const cDaiUniAddress = '0x34E89740adF97C3A9D3f63Cc2cE4a914382c230b';
const cSaiUniAddress = '0x45A2FDfED7F7a2c791fb1bdF6075b83faD821ddE';
const batAddress = '0x0D8775F648430679A709E98d2b0Cb6250d2887EF';
- const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
const mkrAddress = '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2';
const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
const snxAddress = '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F';
@@ -42,12 +39,6 @@ contract('UniswapV1Adapter', () => {
'UNI-V1',
'18',
];
- const daiUni = [
- daiUniAddress,
- 'DAI pool',
- 'UNI-V1',
- '18',
- ];
const usdcUni = [
usdcUniAddress,
'USDC pool',
@@ -72,12 +63,6 @@ contract('UniswapV1Adapter', () => {
'UNI-V1',
'18',
];
- const dai = [
- daiAddress,
- 'Dai Stablecoin',
- 'DAI',
- '18',
- ];
const mkr = [
mkrAddress,
'Maker',
@@ -152,11 +137,9 @@ contract('UniswapV1Adapter', () => {
[[[
batUniAddress,
mkrUniAddress,
- daiUniAddress,
usdcUniAddress,
snxUniAddress,
saiUniAddress,
- cDaiUniAddress,
cSaiUniAddress,
]]],
)
@@ -196,30 +179,24 @@ contract('UniswapV1Adapter', () => {
displayToken(result[0].adapterBalances[0].balances[5].base);
displayToken(result[0].adapterBalances[0].balances[5].underlying[0]);
displayToken(result[0].adapterBalances[0].balances[5].underlying[1]);
- displayToken(result[0].adapterBalances[0].balances[6].base);
- displayToken(result[0].adapterBalances[0].balances[6].underlying[0]);
- displayToken(result[0].adapterBalances[0].balances[6].underlying[1]);
assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, eth);
assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[0].metadata, eth);
assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[0].metadata, eth);
assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[0].metadata, eth);
assert.deepEqual(result[0].adapterBalances[0].balances[4].underlying[0].metadata, eth);
assert.deepEqual(result[0].adapterBalances[0].balances[5].underlying[0].metadata, eth);
- assert.deepEqual(result[0].adapterBalances[0].balances[6].underlying[0].metadata, eth);
assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, batUni);
assert.deepEqual(result[0].adapterBalances[0].balances[1].base.metadata, mkrUni);
- assert.deepEqual(result[0].adapterBalances[0].balances[2].base.metadata, daiUni);
- assert.deepEqual(result[0].adapterBalances[0].balances[3].base.metadata, usdcUni);
- assert.deepEqual(result[0].adapterBalances[0].balances[4].base.metadata, snxUni);
- assert.deepEqual(result[0].adapterBalances[0].balances[5].base.metadata, saiUni);
- assert.deepEqual(result[0].adapterBalances[0].balances[6].base.metadata, cSaiUni);
+ assert.deepEqual(result[0].adapterBalances[0].balances[2].base.metadata, usdcUni);
+ assert.deepEqual(result[0].adapterBalances[0].balances[3].base.metadata, snxUni);
+ assert.deepEqual(result[0].adapterBalances[0].balances[4].base.metadata, saiUni);
+ assert.deepEqual(result[0].adapterBalances[0].balances[5].base.metadata, cSaiUni);
assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[1].metadata, bat);
assert.deepEqual(result[0].adapterBalances[0].balances[1].underlying[1].metadata, mkr);
- assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[1].metadata, dai);
- assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[1].metadata, usdc);
- assert.deepEqual(result[0].adapterBalances[0].balances[4].underlying[1].metadata, snx);
+ assert.deepEqual(result[0].adapterBalances[0].balances[2].underlying[1].metadata, usdc);
+ assert.deepEqual(result[0].adapterBalances[0].balances[3].underlying[1].metadata, snx);
+ assert.deepEqual(result[0].adapterBalances[0].balances[4].underlying[1].metadata, sai);
assert.deepEqual(result[0].adapterBalances[0].balances[5].underlying[1].metadata, sai);
- assert.deepEqual(result[0].adapterBalances[0].balances[6].underlying[1].metadata, sai);
});
});
});
diff --git a/test/UniswapV2Adapter.js b/test/UniswapV2Adapter.js
new file mode 100755
index 00000000..6edf1b30
--- /dev/null
+++ b/test/UniswapV2Adapter.js
@@ -0,0 +1,111 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('UniswapV2Adapter');
+const TokenAdapter = artifacts.require('UniswapV2TokenAdapter');
+const CompoundTokenAdapter = artifacts.require('CompoundTokenAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('UniswapV2Adapter', () => {
+ const wethDaiUniAddress = '0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11';
+ // const wethCdaiUniAddress = '';
+ const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
+ const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
+ const testAddress = '0xAC6cFBFb9eE02E270f695c6DeE900DB112Bc0D6b';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let tokenAdapterAddress;
+ let cTokenAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const wethDaiUni = [
+ wethDaiUniAddress,
+ 'DAI/WETH Pool',
+ 'UNI-V2',
+ '18',
+ ];
+ // const wethCdaiUni = [
+ // wethCdaiUniAddress,
+ // 'WETH/cDAI Uniswap Pool',
+ // 'UNI-V2',
+ // '18',
+ // ];
+ const dai = [
+ daiAddress,
+ 'Dai Stablecoin',
+ 'DAI',
+ '18',
+ ];
+ const weth = [
+ wethAddress,
+ 'Wrapped Ether',
+ 'WETH',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapterAddress = result.address;
+ });
+ await CompoundTokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ cTokenAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Uniswap V2'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ wethDaiUniAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20', 'Uniswap V2 pool token', 'CToken'],
+ [erc20TokenAdapterAddress, tokenAdapterAddress, cTokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[0]);
+ displayToken(result[0].adapterBalances[0].balances[0].underlying[1]);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, wethDaiUni);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[0].metadata, dai);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].underlying[1].metadata, weth);
+ });
+ });
+});
diff --git a/test/UniswapV2StakingAdapter.js b/test/UniswapV2StakingAdapter.js
new file mode 100644
index 00000000..5495e96f
--- /dev/null
+++ b/test/UniswapV2StakingAdapter.js
@@ -0,0 +1,71 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('UniswapV2StakingAdapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('UniswapV2StakingAdapter', () => {
+ const uniDaiWethAddress = '0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11';
+ const uniAddress = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984';
+ // Random address with positive balances
+ const testAddress = '0x6f71f06a0b93970a3b9e6dea8416380def99d032';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['UniswapV2'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ uniDaiWethAddress,
+ uniAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/YearnStakingV1Adapter.js b/test/YearnStakingV1Adapter.js
new file mode 100644
index 00000000..e15af1f8
--- /dev/null
+++ b/test/YearnStakingV1Adapter.js
@@ -0,0 +1,75 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('YearnStakingV1Adapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('YearnStakingV1Adapter', () => {
+ const yfiAddress = '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e';
+ const testAddress = '0xCa845A71d1ff53E7DB7769Ae3f356AF53Fb43000';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+ const yfi = [
+ yfiAddress,
+ 'yearn.finance',
+ 'YFI',
+ '18',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['YFI'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ yfiAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ assert.deepEqual(result[0].adapterBalances[0].balances[0].base.metadata, yfi);
+ assert.equal(result[0].adapterBalances[0].balances[0].underlying.length, 0);
+ });
+ });
+});
diff --git a/test/YearnStakingV2Adapter.js b/test/YearnStakingV2Adapter.js
new file mode 100755
index 00000000..5fd4a2d2
--- /dev/null
+++ b/test/YearnStakingV2Adapter.js
@@ -0,0 +1,70 @@
+import displayToken from './helpers/displayToken';
+
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('YearnStakingV2Adapter');
+const ERC20TokenAdapter = artifacts.require('ERC20TokenAdapter');
+
+contract('YearnStakingV2Adapter', () => {
+ const yfiAddress = '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e';
+ const yCrvAddress = '0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8';
+ const testAddress = '0x42b9dF65B219B3dD36FF330A4dD8f327A6Ada990';
+
+ let accounts;
+ let adapterRegistry;
+ let protocolAdapterAddress;
+ let erc20TokenAdapterAddress;
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+ await ProtocolAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ protocolAdapterAddress = result.address;
+ });
+ await ERC20TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ erc20TokenAdapterAddress = result.address;
+ });
+ await AdapterRegistry.new({ from: accounts[0] })
+ .then((result) => {
+ adapterRegistry = result.contract;
+ });
+ await adapterRegistry.methods.addProtocols(
+ ['Yearn Staking'],
+ [[
+ 'Mock Protocol Name',
+ 'Mock protocol description',
+ 'Mock website',
+ 'Mock icon',
+ '0',
+ ]],
+ [[
+ protocolAdapterAddress,
+ ]],
+ [[[
+ yfiAddress,
+ yCrvAddress,
+ ]]],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ await adapterRegistry.methods.addTokenAdapters(
+ ['ERC20'],
+ [erc20TokenAdapterAddress],
+ )
+ .send({
+ from: accounts[0],
+ gas: '1000000',
+ });
+ });
+
+ it('should return correct balances', async () => {
+ await adapterRegistry.methods['getBalances(address)'](testAddress)
+ .call()
+ .then((result) => {
+ displayToken(result[0].adapterBalances[0].balances[0].base);
+ displayToken(result[0].adapterBalances[0].balances[1].base);
+ });
+ });
+});
diff --git a/test/YearnVaultTokenAdapter.js b/test/YearnVaultTokenAdapter.js
new file mode 100755
index 00000000..dbc33c2d
--- /dev/null
+++ b/test/YearnVaultTokenAdapter.js
@@ -0,0 +1,41 @@
+const TokenAdapter = artifacts.require('YearnVaultTokenAdapter');
+
+contract('YearnVaultTokenAdapter', () => {
+ const yvUSDCAddress = '0x5f18C75AbDAe578b483E5F43f12a39cF75b973a9';
+ const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
+
+ let accounts;
+ let tokenAdapter;
+ const yvUSDC = [
+ yvUSDCAddress,
+ 'USDC yVault',
+ 'yvUSDC',
+ '6',
+ ];
+
+ beforeEach(async () => {
+ accounts = await web3.eth.getAccounts();
+
+ await TokenAdapter.new({ from: accounts[0] })
+ .then((result) => {
+ tokenAdapter = result.contract;
+ });
+ });
+
+ it('should return correct components', async () => {
+ await tokenAdapter.methods['getComponents(address)'](yvUSDCAddress)
+ .call()
+ .then((result) => {
+ assert.equal(result[0][0], usdcAddress);
+ assert.equal(result[0][1], 'ERC20');
+ });
+ });
+
+ it('should return correct metadata', async () => {
+ await tokenAdapter.methods['getMetadata(address)'](yvUSDCAddress)
+ .call()
+ .then((result) => {
+ assert.deepEqual(result, yvUSDC);
+ });
+ });
+});
diff --git a/test/ZrxAdapter.js b/test/ZrxAdapter.js
index 6f0d11a3..b755e690 100755
--- a/test/ZrxAdapter.js
+++ b/test/ZrxAdapter.js
@@ -1,8 +1,8 @@
import displayToken from './helpers/displayToken';
-const AdapterRegistry = artifacts.require('./AdapterRegistry');
-const ProtocolAdapter = artifacts.require('./ZrxAdapter');
-const TokenAdapter = artifacts.require('./ERC20TokenAdapter');
+const AdapterRegistry = artifacts.require('AdapterRegistry');
+const ProtocolAdapter = artifacts.require('ZrxAdapter');
+const TokenAdapter = artifacts.require('ERC20TokenAdapter');
contract('ZrxAdapter', () => {
const zrxAddress = '0xE41d2489571d322189246DaFA5ebDe1F4699F498';
diff --git a/test/helpers/displayToken.js b/test/helpers/displayToken.js
index 389252a2..f28e8226 100755
--- a/test/helpers/displayToken.js
+++ b/test/helpers/displayToken.js
@@ -1,10 +1,21 @@
const displayToken = (token) => {
- const { BN } = web3.utils;
- const base = new BN(10).pow(new BN(token.metadata.decimals - 5));
- const weiAmount = new BN(token.amount);
- const amount = weiAmount.divRound(base).toNumber() / 100000;
+ const amountString = token.amount.toString();
+ let amount;
+ if (token.metadata.decimals > 0) {
+ if (amountString.length > token.metadata.decimals) {
+ const intPartLength = amountString.length - token.metadata.decimals;
+ const decimalPart = amountString.slice(intPartLength).replace(/0+$/, '');
+ amount = `${amountString.slice(0, intPartLength)}.${decimalPart}`;
+ } else {
+ const zeroPartLength = token.metadata.decimals - amountString.length;
+ const decimalPart = amountString.replace(/0+$/, '');
+ amount = `0.${'0'.repeat(zeroPartLength)}${decimalPart}`;
+ }
+ } else {
+ amount = token.amount.toString();
+ }
// eslint-disable-next-line no-console
- console.log(`${token.metadata.name} amount: ${amount.toString()}`);
+ console.log(`${token.metadata.name} amount: ${amount}`);
};
export default displayToken;
diff --git a/truffle.js b/truffle.js
index 8cfd7a11..2a26b2ea 100755
--- a/truffle.js
+++ b/truffle.js
@@ -22,10 +22,9 @@ module.exports = {
mainnet: {
provider: () => new HDWalletProvider(process.env.MNEMONIC, `https://mainnet.infura.io/v3/${process.env.INFURA_API_KEY}`, 0),
network_id: 1,
- gas: 8000000,
- gasPrice: 1100000000,
- timeoutBlocks: 200,
- skipDryRun: true,
+ gas: 2000000,
+ gasPrice: 10100000000,
+ timeoutBlocks: 2000,
},
kovan: {
provider: () => new HDWalletProvider(process.env.MNEMONIC, `https://kovan.infura.io/v3/${process.env.INFURA_API_KEY}`, 0),