feat: clean debt bridge connector and payable fns

This commit is contained in:
gitpusha 2020-10-24 12:00:58 +02:00 committed by Luis Schliesske
parent 0b8ef845d9
commit a6107586d1
6 changed files with 118 additions and 114 deletions

View File

@ -217,7 +217,7 @@ abstract contract GelatoHelpers is Helpers {
return 0x169E633A2D1E6c10dD91238Ba11c4A708dfEF37C; return 0x169E633A2D1E6c10dD91238Ba11c4A708dfEF37C;
} }
function _getGasPrice() internal view returns (uint256) { function _getGelatoGasPrice() internal view returns (uint256) {
return return
uint256( uint256(
GelatoGasPriceOracle(_getGelatoGasPriceOracle()).latestAnswer() GelatoGasPriceOracle(_getGelatoGasPriceOracle()).latestAnswer()
@ -259,24 +259,20 @@ abstract contract MakerResolver is GelatoHelpers {
} }
} }
/// @title ConnectGelatoDebtBridgeFromMaker
/// @notice InstaDapp connector for full or partial refinancing of Maker debt positions.
/// @author Gelato Team
contract ConnectGelatoDebtBridgeFromMaker is MakerResolver { contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
using GelatoBytes for bytes; using GelatoBytes for bytes;
// solhint-disable-next-line const-name-snakecase // solhint-disable-next-line const-name-snakecase
string public constant override name = "GelatoDebtBridge-v1.0"; string public constant override name = "GelatoDebtBridge-v1.0";
uint256 public constant GAS_LIMIT = 1933090 + (19331 * 2); // 1933080 + ~2% (Estimated Value) uint256 public constant GAS_COST = 1933090 + (19331 * 2); // 1933080 + ~2% (Estimated Value)
constructor(uint256 _id) { constructor(uint256 _id) {
__id = _id; __id = _id;
} }
/// @notice Get gas price from gelato Gas Price Oracle and multiply
/// this gas price by the estimated amount of needed for executing
/// the transaction
function _getFees() internal view returns (uint256 gasCost) {
gasCost = _mul(GAS_LIMIT, _getGasPrice());
}
/// @notice Saves Data to InstaMemory that can be used for DebtBridge Maker->Compound /// @notice Saves Data to InstaMemory that can be used for DebtBridge Maker->Compound
/// @dev Use wad for colRatios. The user has no influence over setUint or getUint. /// @dev Use wad for colRatios. The user has no influence over setUint or getUint.
/// @param _vaultId The id of the makerDAO vault. /// @param _vaultId The id of the makerDAO vault.
@ -288,7 +284,7 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
/// method e.g. the function selector of MakerOracle's read function. /// method e.g. the function selector of MakerOracle's read function.
// @param _getId Id for writting in instaMemory. // @param _getId Id for writting in instaMemory.
// @param _setId Id for loading from instaMemory. // @param _setId Id for loading from instaMemory.
function saveDebtBridgeDataToMemory( function savePartialRefinanceDataToMemory(
uint256 _vaultId, uint256 _vaultId,
uint256 _wMinColRatioMaker, // should be in ray because maker use ray standard uint256 _wMinColRatioMaker, // should be in ray because maker use ray standard
uint256 _wMinColRatioB, // should be in wad because compound use wad standard uint256 _wMinColRatioB, // should be in wad because compound use wad standard
@ -296,10 +292,10 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
bytes calldata _oraclePayload, bytes calldata _oraclePayload,
uint256, /*_getId,*/ uint256, /*_getId,*/
uint256 /*_setId*/ uint256 /*_setId*/
) public virtual { ) public payable virtual {
( (
uint256 wDaiDebtToMove, uint256 wDaiDebtToMove,
uint256 wCollateralToMove, uint256 wColToWithdrawFromMaker,
uint256 gasFeesPaidFromCol uint256 gasFeesPaidFromCol
) = computeDebtBridge( ) = computeDebtBridge(
_vaultId, _vaultId,
@ -311,56 +307,35 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
_setInstaMemoryUints( _setInstaMemoryUints(
wDaiDebtToMove, wDaiDebtToMove,
_add(wCollateralToMove, gasFeesPaidFromCol), wColToWithdrawFromMaker,
wCollateralToMove, _sub(wColToWithdrawFromMaker, gasFeesPaidFromCol), // _wColToDepositInB
wDaiDebtToMove,
gasFeesPaidFromCol gasFeesPaidFromCol
); );
} }
/// @notice Save in instaMemory the needed values for doing full refinancing between makerDAO and Compound. /// @notice Stores payload for full refinancing from a Maker position in InstaMemory.
/// @param _vaultID The ID of the makerDAO vault. /// @param _vaultID The ID of the makerDAO vault.
// @param _getID Id for writting in instaMemory. // @param _getID Id for writting in instaMemory.
// @param _setID Id for loading from instaMemory. // @param _setID Id for loading from instaMemory.
function saveFullRefinanceFromMakerDataToMemory( function saveFullRefinanceDataToMemory(
uint256 _vaultID, uint256 _vaultID,
uint256, /*_getId,*/ uint256, /*_getId,*/
uint256 /*_setId*/ uint256 /*_setId*/
) external payable { ) public payable virtual {
uint256 fees = _getFees(); // get Fees uint256 wDaiDebtToMove = getMakerVaultDebt(_vaultID);
uint256 paybackAmount = getMakerVaultDebt(_vaultID); uint256 wColToWithdrawFromMaker = getMakerVaultCollateralBalance(
uint256 collateralToWithdraw = getMakerVaultCollateralBalance(_vaultID); _vaultID
);
uint256 gasFeesPaidFromCol = _getGelatoProviderFees();
_setInstaMemoryUints( _setInstaMemoryUints(
paybackAmount, wDaiDebtToMove,
collateralToWithdraw, wColToWithdrawFromMaker,
_sub(collateralToWithdraw, fees), _sub(wColToWithdrawFromMaker, gasFeesPaidFromCol), // _wColToDepositInB
paybackAmount, gasFeesPaidFromCol
fees
); );
} }
/// @notice Internal function to store values in InstaMemory
/// @param _makerDebtRepaymentAmount payback maker && flashloan borrow amount
/// @param _makerCollaToWithdraw withdraw maker
/// @param _compoundDepositAmount deposit compound
/// @param _compoundDebtAmount borrow compound
/// @param _fees pay the Gelato Provider (TO DO: unsafe)
function _setInstaMemoryUints(
uint256 _makerDebtRepaymentAmount,
uint256 _makerCollaToWithdraw,
uint256 _compoundDepositAmount,
uint256 _compoundDebtAmount,
uint256 _fees
) internal {
setUint(600, _makerDebtRepaymentAmount); // borrow flashloan
setUint(601, _makerDebtRepaymentAmount); // payback maker
setUint(602, _makerCollaToWithdraw); // withdraw maker
setUint(603, _compoundDepositAmount); // deposit compound
setUint(604, _compoundDebtAmount); // borrow compound
setUint(605, _fees); // pay the provider
}
/// @notice Computes values needed for DebtBridge Maker->ProtocolB /// @notice Computes values needed for DebtBridge Maker->ProtocolB
/// @dev Use wad for colRatios. /// @dev Use wad for colRatios.
/// @param _vaultId The id of the makerDAO vault. /// @param _vaultId The id of the makerDAO vault.
@ -371,7 +346,7 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
/// @param _oraclePayload The data for making the staticcall to the oracle's read /// @param _oraclePayload The data for making the staticcall to the oracle's read
/// method e.g. the function selector of MakerOracle's read function. /// method e.g. the function selector of MakerOracle's read function.
/// @return wDaiDebtToMove DAI Debt (wad) to: flashBorrow->repay Maker->withdraw from B->flashPayback. /// @return wDaiDebtToMove DAI Debt (wad) to: flashBorrow->repay Maker->withdraw from B->flashPayback.
/// @return wCollateralToMove (wad) to: withdraw from Maker and deposit on B. /// @return wColToWithdrawFromMaker (wad) to: withdraw from Maker and deposit on B.
/// @return gasFeesPaidFromCol Gelato automation-gas-fees paid from user's collateral /// @return gasFeesPaidFromCol Gelato automation-gas-fees paid from user's collateral
// solhint-disable function-max-lines // solhint-disable function-max-lines
function computeDebtBridge( function computeDebtBridge(
@ -386,7 +361,7 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
virtual virtual
returns ( returns (
uint256 wDaiDebtToMove, uint256 wDaiDebtToMove,
uint256 wCollateralToMove, uint256 wColToWithdrawFromMaker,
uint256 gasFeesPaidFromCol uint256 gasFeesPaidFromCol
) )
{ {
@ -408,8 +383,8 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
} }
// TO DO: add fee mechanism for non-ETH collateral debt bridge // TO DO: add fee mechanism for non-ETH collateral debt bridge
// uint256 gasFeesPaidFromCol = _mul(GAS_LIMIT, wmul(_getGasPrice(), latestPrice)); // uint256 gasFeesPaidFromCol = _mul(GAS_COST, wmul(_getGelatoGasPrice(), latestPrice));
gasFeesPaidFromCol = _getFees(); gasFeesPaidFromCol = _getGelatoProviderFees();
uint256 wPricedCol = wmul( uint256 wPricedCol = wmul(
_sub(getMakerVaultCollateralBalance(_vaultId), gasFeesPaidFromCol), _sub(getMakerVaultCollateralBalance(_vaultId), gasFeesPaidFromCol),
@ -418,7 +393,7 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
uint256 wDaiDebtOnMaker = getMakerVaultDebt(_vaultId); uint256 wDaiDebtOnMaker = getMakerVaultDebt(_vaultId);
wCollateralToMove = wCalcCollateralToWithdraw( wColToWithdrawFromMaker = wCalcCollateralToWithdraw(
_wMinColRatioMaker, _wMinColRatioMaker,
_wMinColRatioB, _wMinColRatioB,
wColPrice, wColPrice,
@ -499,4 +474,28 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
) )
); );
} }
// _gasFeesPaidFromCol == _wColToWithdrawFromMaker - _wColToDepositInB
function _setInstaMemoryUints(
uint256 _wDaiDebtToMove,
uint256 _wColToWithdrawFromMaker,
uint256 _wColToDepositInB,
uint256 _gasFeesPaidFromCol
) internal virtual {
setUint(600, _wDaiDebtToMove); // borrow flashloan
setUint(601, _wDaiDebtToMove); // payback maker
setUint(602, _wColToWithdrawFromMaker); // withdraw maker
setUint(603, _wColToDepositInB); // deposit compound
setUint(604, _wDaiDebtToMove); // borrow compound
setUint(605, _gasFeesPaidFromCol); // pay the provider
}
function _getGelatoProviderFees()
internal
view
virtual
returns (uint256 gasCost)
{
gasCost = _mul(GAS_COST, _getGelatoGasPrice());
}
} }

View File

@ -12,8 +12,8 @@
"lint": "eslint --cache . && yarn lint:sol", "lint": "eslint --cache . && yarn lint:sol",
"lint:sol": "solhint contracts/**/*.sol", "lint:sol": "solhint contracts/**/*.sol",
"lint:fix": "eslint --cache --fix . && solhint --fix contracts/**/*.sol", "lint:fix": "eslint --cache --fix . && solhint --fix contracts/**/*.sol",
"test": "npx hardhat test", "test": "yarn compile --force && npx hardhat test",
"debug": "DEBUG=true npx hardhat test" "debug": "DEBUG=true yarn compile --force && npx hardhat test"
}, },
"devDependencies": { "devDependencies": {
"@gelatonetwork/core": "1.0.0", "@gelatonetwork/core": "1.0.0",
@ -21,13 +21,13 @@
"@nomiclabs/hardhat-waffle": "2.0.0", "@nomiclabs/hardhat-waffle": "2.0.0",
"chai": "4.2.0", "chai": "4.2.0",
"dotenv": "8.2.0", "dotenv": "8.2.0",
"eslint": "7.10.0", "eslint": "7.12.0",
"eslint-config-prettier": "6.12.0", "eslint-config-prettier": "6.14.0",
"ethereum-waffle": "3.1.1", "ethereum-waffle": "3.1.2",
"ethers": "5.0.19", "ethers": "5.0.19",
"hardhat": "2.0.0", "hardhat": "2.0.1",
"husky": ">=4", "husky": ">=4",
"lint-staged": ">=10", "lint-staged": "10.4.2",
"prettier": "2.1.2", "prettier": "2.1.2",
"prettier-plugin-solidity": "1.0.0-alpha.59", "prettier-plugin-solidity": "1.0.0-alpha.59",
"solhint": "3.2.2", "solhint": "3.2.2",

View File

@ -139,7 +139,7 @@ describe("Full Debt Bridge refinancing loan from Maker to Compound", function ()
// Bots constatly check whether the submitted task is executable (by calling canExec) // Bots constatly check whether the submitted task is executable (by calling canExec)
// If the task becomes executable (returns "OK"), the "exec" function will be called // If the task becomes executable (returns "OK"), the "exec" function will be called
// which will execute the debt refinancing on behalf of the user // which will execute the debt refinancing on behalf of the user
it("#2: Use Maker Compound refinancing if the maker vault become unsafe after a market move.", async function () { it("#3: Use Maker Compound refinancing if the maker vault become unsafe after a market move.", async function () {
// Steps // Steps
// Step 1: Market Move against the user (Mock) // Step 1: Market Move against the user (Mock)
// Step 2: Executor execute the user's task // Step 2: Executor execute the user's task

View File

@ -478,7 +478,7 @@ class Helper {
addr: contracts.connectGelatoDebtBridgeFromMaker.address, addr: contracts.connectGelatoDebtBridgeFromMaker.address,
data: await hre.run("abi-encode-withselector", { data: await hre.run("abi-encode-withselector", {
abi: ConnectGelatoDebtBridgeFromMakerABI, abi: ConnectGelatoDebtBridgeFromMakerABI,
functionname: "saveFullRefinanceFromMakerDataToMemory", functionname: "saveFullRefinanceDataToMemory",
inputs: [vaultId, 0, 0], inputs: [vaultId, 0, 0],
}), }),
operation: GelatoCoreLib.Operation.Delegatecall, operation: GelatoCoreLib.Operation.Delegatecall,

View File

@ -541,7 +541,7 @@ describe("Debt Bridge with External Provider", function () {
addr: connectGelatoDebtBridgeFromMaker.address, addr: connectGelatoDebtBridgeFromMaker.address,
data: await hre.run("abi-encode-withselector", { data: await hre.run("abi-encode-withselector", {
abi: ConnectGelatoDebtBridgeFromMakerABI, abi: ConnectGelatoDebtBridgeFromMakerABI,
functionname: "saveDebtBridgeDataToMemory", functionname: "savePartialRefinanceDataToMemory",
inputs: [ inputs: [
vaultId, vaultId,
MIN_COL_RATIO_MAKER, MIN_COL_RATIO_MAKER,

109
yarn.lock
View File

@ -39,10 +39,10 @@
resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89"
integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==
"@eslint/eslintrc@^0.1.3": "@eslint/eslintrc@^0.2.0":
version "0.1.3" version "0.2.0"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.0.tgz#bc7e3c4304d4c8720968ccaee793087dfb5fe6b4"
integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== integrity sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==
dependencies: dependencies:
ajv "^6.12.4" ajv "^6.12.4"
debug "^4.1.1" debug "^4.1.1"
@ -55,18 +55,18 @@
minimatch "^3.0.4" minimatch "^3.0.4"
strip-json-comments "^3.1.1" strip-json-comments "^3.1.1"
"@ethereum-waffle/chai@^3.1.1": "@ethereum-waffle/chai@^3.1.2":
version "3.1.1" version "3.1.2"
resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.1.1.tgz#2d2594e19613cdee0eaa1a38fc8dac31f66460e6" resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.1.2.tgz#f1a15085f6ab67397d1bfe89ec97938309f2d941"
integrity sha512-gbpjfIz+XhM9sH8BtBiRmK+eU6WuAWPK5TqIMR7QwzcGQ4XkIoFzACRNc/kxnV5f9Townpgr7yp0yzbzJJCWiw== integrity sha512-+rlfrBlWleY2zCjkR3tH9pleKHx10atI4CQ03ZKz4bw0sCU8FtD3Bq7pEt6gMWMpVH7h5hlemBTT++1hED9jyA==
dependencies: dependencies:
"@ethereum-waffle/provider" "^3.1.1" "@ethereum-waffle/provider" "^3.1.2"
ethers "^5.0.0" ethers "^5.0.0"
"@ethereum-waffle/compiler@^3.1.1": "@ethereum-waffle/compiler@^3.1.2":
version "3.1.1" version "3.1.2"
resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.1.1.tgz#df3dba3c5dc556afe04f259e0789c16bc34333f5" resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.1.2.tgz#4df177bc1c6b369061062514f166183181954abd"
integrity sha512-vneBsbR7VaqZ0cDJRc+pr7aU6ZB8uO2h4ScKsn3GQIXE1GYB4i9eUxvRkdi5t/cS7YufnmUyKQU/IyAjivDcWw== integrity sha512-ko8fc1CYilS6txrNeyNgArRYgw1+cBKzs0nY6ZYPbxN6ywdm0efpcdYHuKPh8L0KeH5w9dIoKNkCLjL+vUEFjA==
dependencies: dependencies:
"@resolver-engine/imports" "^0.3.3" "@resolver-engine/imports" "^0.3.3"
"@resolver-engine/imports-fs" "^0.3.3" "@resolver-engine/imports-fs" "^0.3.3"
@ -77,29 +77,29 @@
node-fetch "^2.6.0" node-fetch "^2.6.0"
solc "^0.6.3" solc "^0.6.3"
"@ethereum-waffle/ens@^3.1.1": "@ethereum-waffle/ens@^3.1.2":
version "3.1.1" version "3.1.2"
resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.1.1.tgz#0e0d35ff8e10e871b7dfc81eef60e4345df8f610" resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.1.2.tgz#ed21ea9c376ec21f3c02649cc158cb60a69d94e9"
integrity sha512-36O7UBmPnDLoHaMcXBoCiF+lNrgiPs8DdLz8btMK231N68L/Bb1UdhzYhEeE0XsTpCkb+IxRr0Xl3gpI+y63Mg== integrity sha512-otoTGCClgCbyNQ7YStyTtFkCYo+K9XKslijOcTOGBHEp/tbij76fToXMp6EPUGaNg2mbNrWw9H8x6Glp7UD8iw==
dependencies: dependencies:
"@ensdomains/ens" "^0.4.4" "@ensdomains/ens" "^0.4.4"
"@ensdomains/resolver" "^0.2.4" "@ensdomains/resolver" "^0.2.4"
ethers "^5.0.1" ethers "^5.0.1"
"@ethereum-waffle/mock-contract@^3.1.1": "@ethereum-waffle/mock-contract@^3.1.2":
version "3.1.1" version "3.1.2"
resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.1.1.tgz#ae0fe5bcdb7a0ba64069098394ea4e54a02ed293" resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.1.2.tgz#4dd3c02454b797ad7a8e5d42fbd20eaee75af3cc"
integrity sha512-by4eUeL7FGQzczi4nM94YcnYWV9EPsjx9WI9A66LzLHHPdEyIvAUZyyBQ+9hLYwUqJ78ppLoVx+xYWEagHx/jg== integrity sha512-P3AZGqVWE1ZJ3Gqiko/oPC4CfnNSbHwq2awNsa4HLj2URHeRE5fIQMuAxCT3bCwf4QGdE7yxOVkFHDLu40hNuw==
dependencies: dependencies:
"@ethersproject/abi" "^5.0.1" "@ethersproject/abi" "^5.0.1"
ethers "^5.0.1" ethers "^5.0.1"
"@ethereum-waffle/provider@^3.1.1": "@ethereum-waffle/provider@^3.1.2":
version "3.1.1" version "3.1.2"
resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.1.1.tgz#74ac4f64a83f8d975d7e9e09f5b5f1ce8c794d19" resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.1.2.tgz#8ff1d98b3725c9abbdd1b13d47784eccf57ae1e5"
integrity sha512-2gwa7+OKSuJBvKR4Y/ljhvmQd2J31NY0n5ygLrykMrk/HMEGhzBKFu94O+cndnYRhHrB4Rl8sWcFH/0H2Qqx+Q== integrity sha512-RQTt87qmPJOFqF3QP1ASSt/kGUB2WJKfEwFMuAMP9ZQ2icRXtyLXseU4dKNAU0gc/BckqrXk5r1xzirwJp+ANg==
dependencies: dependencies:
"@ethereum-waffle/ens" "^3.1.1" "@ethereum-waffle/ens" "^3.1.2"
ethers "^5.0.1" ethers "^5.0.1"
ganache-core "^2.10.2" ganache-core "^2.10.2"
patch-package "^6.2.2" patch-package "^6.2.2"
@ -2843,10 +2843,10 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-config-prettier@6.12.0: eslint-config-prettier@6.14.0:
version "6.12.0" version "6.14.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz#9eb2bccff727db1c52104f0b49e87ea46605a0d2" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz#390e7863a8ae99970981933826476169285b3a27"
integrity sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw== integrity sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==
dependencies: dependencies:
get-stdin "^6.0.0" get-stdin "^6.0.0"
@ -2885,13 +2885,18 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
eslint@7.10.0: eslint-visitor-keys@^2.0.0:
version "7.10.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA== integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
eslint@7.12.0:
version "7.12.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.0.tgz#7b6a85f87a9adc239e979bb721cde5ce0dc27da6"
integrity sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==
dependencies: dependencies:
"@babel/code-frame" "^7.0.0" "@babel/code-frame" "^7.0.0"
"@eslint/eslintrc" "^0.1.3" "@eslint/eslintrc" "^0.2.0"
ajv "^6.10.0" ajv "^6.10.0"
chalk "^4.0.0" chalk "^4.0.0"
cross-spawn "^7.0.2" cross-spawn "^7.0.2"
@ -2900,7 +2905,7 @@ eslint@7.10.0:
enquirer "^2.3.5" enquirer "^2.3.5"
eslint-scope "^5.1.1" eslint-scope "^5.1.1"
eslint-utils "^2.1.0" eslint-utils "^2.1.0"
eslint-visitor-keys "^1.3.0" eslint-visitor-keys "^2.0.0"
espree "^7.3.0" espree "^7.3.0"
esquery "^1.2.0" esquery "^1.2.0"
esutils "^2.0.2" esutils "^2.0.2"
@ -3209,15 +3214,15 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3:
secp256k1 "^4.0.1" secp256k1 "^4.0.1"
setimmediate "^1.0.5" setimmediate "^1.0.5"
ethereum-waffle@3.1.1: ethereum-waffle@3.1.2:
version "3.1.1" version "3.1.2"
resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.1.1.tgz#2a63475104281dca1fd2ffed12ab8f6605219d51" resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.1.2.tgz#54ab4049d256185bb50de4e86328e521ea2ad816"
integrity sha512-kiJo7PPGKsRfNiQOB8Z/ogLTHrU7Cj7VOZrdU3nyx9xXobkTFN9F9FcwdYZRg3gw3C1XnuOd18Jk2hPfuQbORA== integrity sha512-q9fI4N2RN+OEIXoWpyj8LWhjaBNtIxKID9RHHIvWe32Jp5nRN8F3Ja+EAaJ5Qh3/eZMPdpauW4N5zBrY2qXQpQ==
dependencies: dependencies:
"@ethereum-waffle/chai" "^3.1.1" "@ethereum-waffle/chai" "^3.1.2"
"@ethereum-waffle/compiler" "^3.1.1" "@ethereum-waffle/compiler" "^3.1.2"
"@ethereum-waffle/mock-contract" "^3.1.1" "@ethereum-waffle/mock-contract" "^3.1.2"
"@ethereum-waffle/provider" "^3.1.1" "@ethereum-waffle/provider" "^3.1.2"
ethers "^5.0.1" ethers "^5.0.1"
ethereumjs-abi@0.6.5: ethereumjs-abi@0.6.5:
@ -4156,10 +4161,10 @@ har-validator@~5.1.3:
ajv "^6.12.3" ajv "^6.12.3"
har-schema "^2.0.0" har-schema "^2.0.0"
hardhat@2.0.0: hardhat@2.0.1:
version "2.0.0" version "2.0.1"
resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.0.tgz#d2d5fcbcdbb9b6ec13e7c8e93706ddf0e5ac2a70" resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.1.tgz#2e7d1815654406199b88b31da9c2d2763e8f5577"
integrity sha512-kwl4fTn5jU4n3rlT1PucKETZ6qWzZiGgcUAqoqLc2ZADbcm1N9KUCbKzleidvgn+gTYcvVkhPTskkU2Yop6Lag== integrity sha512-9g67OkehLgHLgfqqbdR+FANshTUvFM3yuJr06ZScNErsvrdiLHpQ/Jbkd6rRiXjYovN/SMu4YZrhNEm62b7boA==
dependencies: dependencies:
"@nomiclabs/ethereumjs-vm" "^4.1.1" "@nomiclabs/ethereumjs-vm" "^4.1.1"
"@sentry/node" "^5.18.1" "@sentry/node" "^5.18.1"
@ -5206,10 +5211,10 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
lint-staged@>=10: lint-staged@10.4.2:
version "10.4.0" version "10.4.2"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.4.0.tgz#d18628f737328e0bbbf87d183f4020930e9a984e" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.4.2.tgz#9fee4635c4b5ddb845746f237c6d43494ccd21c1"
integrity sha512-uaiX4U5yERUSiIEQc329vhCTDDwUcSvKdRLsNomkYLRzijk3v8V9GWm2Nz0RMVB87VcuzLvtgy6OsjoH++QHIg== integrity sha512-OLCA9K1hS+Sl179SO6kX0JtnsaKj/MZalEhUj5yAgXsb63qPI/Gfn6Ua1KuZdbfkZNEu3/n5C/obYCu70IMt9g==
dependencies: dependencies:
chalk "^4.1.0" chalk "^4.1.0"
cli-truncate "^2.1.0" cli-truncate "^2.1.0"