diff --git a/contracts/connectors/ConnectGelatoDebtBridgeFromMaker.sol b/contracts/connectors/ConnectGelatoDebtBridgeFromMaker.sol index da4d9a8..be5fe8b 100644 --- a/contracts/connectors/ConnectGelatoDebtBridgeFromMaker.sol +++ b/contracts/connectors/ConnectGelatoDebtBridgeFromMaker.sol @@ -217,7 +217,7 @@ abstract contract GelatoHelpers is Helpers { return 0x169E633A2D1E6c10dD91238Ba11c4A708dfEF37C; } - function _getGasPrice() internal view returns (uint256) { + function _getGelatoGasPrice() internal view returns (uint256) { return uint256( 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 { using GelatoBytes for bytes; // solhint-disable-next-line const-name-snakecase 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) { __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 /// @dev Use wad for colRatios. The user has no influence over setUint or getUint. /// @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. // @param _getId Id for writting in instaMemory. // @param _setId Id for loading from instaMemory. - function saveDebtBridgeDataToMemory( + function savePartialRefinanceDataToMemory( uint256 _vaultId, uint256 _wMinColRatioMaker, // should be in ray because maker use ray standard uint256 _wMinColRatioB, // should be in wad because compound use wad standard @@ -296,10 +292,10 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver { bytes calldata _oraclePayload, uint256, /*_getId,*/ uint256 /*_setId*/ - ) public virtual { + ) public payable virtual { ( uint256 wDaiDebtToMove, - uint256 wCollateralToMove, + uint256 wColToWithdrawFromMaker, uint256 gasFeesPaidFromCol ) = computeDebtBridge( _vaultId, @@ -311,56 +307,35 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver { _setInstaMemoryUints( wDaiDebtToMove, - _add(wCollateralToMove, gasFeesPaidFromCol), - wCollateralToMove, - wDaiDebtToMove, + wColToWithdrawFromMaker, + _sub(wColToWithdrawFromMaker, gasFeesPaidFromCol), // _wColToDepositInB 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 _getID Id for writting in instaMemory. // @param _setID Id for loading from instaMemory. - function saveFullRefinanceFromMakerDataToMemory( + function saveFullRefinanceDataToMemory( uint256 _vaultID, uint256, /*_getId,*/ uint256 /*_setId*/ - ) external payable { - uint256 fees = _getFees(); // get Fees - uint256 paybackAmount = getMakerVaultDebt(_vaultID); - uint256 collateralToWithdraw = getMakerVaultCollateralBalance(_vaultID); + ) public payable virtual { + uint256 wDaiDebtToMove = getMakerVaultDebt(_vaultID); + uint256 wColToWithdrawFromMaker = getMakerVaultCollateralBalance( + _vaultID + ); + uint256 gasFeesPaidFromCol = _getGelatoProviderFees(); _setInstaMemoryUints( - paybackAmount, - collateralToWithdraw, - _sub(collateralToWithdraw, fees), - paybackAmount, - fees + wDaiDebtToMove, + wColToWithdrawFromMaker, + _sub(wColToWithdrawFromMaker, gasFeesPaidFromCol), // _wColToDepositInB + gasFeesPaidFromCol ); } - /// @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 /// @dev Use wad for colRatios. /// @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 /// 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 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 // solhint-disable function-max-lines function computeDebtBridge( @@ -386,7 +361,7 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver { virtual returns ( uint256 wDaiDebtToMove, - uint256 wCollateralToMove, + uint256 wColToWithdrawFromMaker, uint256 gasFeesPaidFromCol ) { @@ -408,8 +383,8 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver { } // TO DO: add fee mechanism for non-ETH collateral debt bridge - // uint256 gasFeesPaidFromCol = _mul(GAS_LIMIT, wmul(_getGasPrice(), latestPrice)); - gasFeesPaidFromCol = _getFees(); + // uint256 gasFeesPaidFromCol = _mul(GAS_COST, wmul(_getGelatoGasPrice(), latestPrice)); + gasFeesPaidFromCol = _getGelatoProviderFees(); uint256 wPricedCol = wmul( _sub(getMakerVaultCollateralBalance(_vaultId), gasFeesPaidFromCol), @@ -418,7 +393,7 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver { uint256 wDaiDebtOnMaker = getMakerVaultDebt(_vaultId); - wCollateralToMove = wCalcCollateralToWithdraw( + wColToWithdrawFromMaker = wCalcCollateralToWithdraw( _wMinColRatioMaker, _wMinColRatioB, 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()); + } } diff --git a/package.json b/package.json index 6baa6a7..bd4c1f6 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "lint": "eslint --cache . && yarn lint:sol", "lint:sol": "solhint contracts/**/*.sol", "lint:fix": "eslint --cache --fix . && solhint --fix contracts/**/*.sol", - "test": "npx hardhat test", - "debug": "DEBUG=true npx hardhat test" + "test": "yarn compile --force && npx hardhat test", + "debug": "DEBUG=true yarn compile --force && npx hardhat test" }, "devDependencies": { "@gelatonetwork/core": "1.0.0", @@ -21,13 +21,13 @@ "@nomiclabs/hardhat-waffle": "2.0.0", "chai": "4.2.0", "dotenv": "8.2.0", - "eslint": "7.10.0", - "eslint-config-prettier": "6.12.0", - "ethereum-waffle": "3.1.1", + "eslint": "7.12.0", + "eslint-config-prettier": "6.14.0", + "ethereum-waffle": "3.1.2", "ethers": "5.0.19", - "hardhat": "2.0.0", + "hardhat": "2.0.1", "husky": ">=4", - "lint-staged": ">=10", + "lint-staged": "10.4.2", "prettier": "2.1.2", "prettier-plugin-solidity": "1.0.0-alpha.59", "solhint": "3.2.2", diff --git a/test/2_Full-Debt-Bridge-Maker-Compound.test.js b/test/2_Full-Debt-Bridge-Maker-Compound.test.js index fd87847..5d5957a 100644 --- a/test/2_Full-Debt-Bridge-Maker-Compound.test.js +++ b/test/2_Full-Debt-Bridge-Maker-Compound.test.js @@ -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) // If the task becomes executable (returns "OK"), the "exec" function will be called // 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 // Step 1: Market Move against the user (Mock) // Step 2: Executor execute the user's task diff --git a/test/helpers/Full-Refinance-External-Provider.helper.js b/test/helpers/Full-Refinance-External-Provider.helper.js index 8c4bf8a..95b9111 100644 --- a/test/helpers/Full-Refinance-External-Provider.helper.js +++ b/test/helpers/Full-Refinance-External-Provider.helper.js @@ -478,7 +478,7 @@ class Helper { addr: contracts.connectGelatoDebtBridgeFromMaker.address, data: await hre.run("abi-encode-withselector", { abi: ConnectGelatoDebtBridgeFromMakerABI, - functionname: "saveFullRefinanceFromMakerDataToMemory", + functionname: "saveFullRefinanceDataToMemory", inputs: [vaultId, 0, 0], }), operation: GelatoCoreLib.Operation.Delegatecall, diff --git a/test_temp/3_Partial-Refinance-External-Provider.test.js b/test_temp/3_Partial-Refinance-External-Provider.test.js index f03deb1..562dd89 100644 --- a/test_temp/3_Partial-Refinance-External-Provider.test.js +++ b/test_temp/3_Partial-Refinance-External-Provider.test.js @@ -541,7 +541,7 @@ describe("Debt Bridge with External Provider", function () { addr: connectGelatoDebtBridgeFromMaker.address, data: await hre.run("abi-encode-withselector", { abi: ConnectGelatoDebtBridgeFromMakerABI, - functionname: "saveDebtBridgeDataToMemory", + functionname: "savePartialRefinanceDataToMemory", inputs: [ vaultId, MIN_COL_RATIO_MAKER, diff --git a/yarn.lock b/yarn.lock index bb7b289..f043dac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39,10 +39,10 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== -"@eslint/eslintrc@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" - integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== +"@eslint/eslintrc@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.0.tgz#bc7e3c4304d4c8720968ccaee793087dfb5fe6b4" + integrity sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -55,18 +55,18 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereum-waffle/chai@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.1.1.tgz#2d2594e19613cdee0eaa1a38fc8dac31f66460e6" - integrity sha512-gbpjfIz+XhM9sH8BtBiRmK+eU6WuAWPK5TqIMR7QwzcGQ4XkIoFzACRNc/kxnV5f9Townpgr7yp0yzbzJJCWiw== +"@ethereum-waffle/chai@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.1.2.tgz#f1a15085f6ab67397d1bfe89ec97938309f2d941" + integrity sha512-+rlfrBlWleY2zCjkR3tH9pleKHx10atI4CQ03ZKz4bw0sCU8FtD3Bq7pEt6gMWMpVH7h5hlemBTT++1hED9jyA== dependencies: - "@ethereum-waffle/provider" "^3.1.1" + "@ethereum-waffle/provider" "^3.1.2" ethers "^5.0.0" -"@ethereum-waffle/compiler@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.1.1.tgz#df3dba3c5dc556afe04f259e0789c16bc34333f5" - integrity sha512-vneBsbR7VaqZ0cDJRc+pr7aU6ZB8uO2h4ScKsn3GQIXE1GYB4i9eUxvRkdi5t/cS7YufnmUyKQU/IyAjivDcWw== +"@ethereum-waffle/compiler@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.1.2.tgz#4df177bc1c6b369061062514f166183181954abd" + integrity sha512-ko8fc1CYilS6txrNeyNgArRYgw1+cBKzs0nY6ZYPbxN6ywdm0efpcdYHuKPh8L0KeH5w9dIoKNkCLjL+vUEFjA== dependencies: "@resolver-engine/imports" "^0.3.3" "@resolver-engine/imports-fs" "^0.3.3" @@ -77,29 +77,29 @@ node-fetch "^2.6.0" solc "^0.6.3" -"@ethereum-waffle/ens@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.1.1.tgz#0e0d35ff8e10e871b7dfc81eef60e4345df8f610" - integrity sha512-36O7UBmPnDLoHaMcXBoCiF+lNrgiPs8DdLz8btMK231N68L/Bb1UdhzYhEeE0XsTpCkb+IxRr0Xl3gpI+y63Mg== +"@ethereum-waffle/ens@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.1.2.tgz#ed21ea9c376ec21f3c02649cc158cb60a69d94e9" + integrity sha512-otoTGCClgCbyNQ7YStyTtFkCYo+K9XKslijOcTOGBHEp/tbij76fToXMp6EPUGaNg2mbNrWw9H8x6Glp7UD8iw== dependencies: "@ensdomains/ens" "^0.4.4" "@ensdomains/resolver" "^0.2.4" ethers "^5.0.1" -"@ethereum-waffle/mock-contract@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.1.1.tgz#ae0fe5bcdb7a0ba64069098394ea4e54a02ed293" - integrity sha512-by4eUeL7FGQzczi4nM94YcnYWV9EPsjx9WI9A66LzLHHPdEyIvAUZyyBQ+9hLYwUqJ78ppLoVx+xYWEagHx/jg== +"@ethereum-waffle/mock-contract@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.1.2.tgz#4dd3c02454b797ad7a8e5d42fbd20eaee75af3cc" + integrity sha512-P3AZGqVWE1ZJ3Gqiko/oPC4CfnNSbHwq2awNsa4HLj2URHeRE5fIQMuAxCT3bCwf4QGdE7yxOVkFHDLu40hNuw== dependencies: "@ethersproject/abi" "^5.0.1" ethers "^5.0.1" -"@ethereum-waffle/provider@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.1.1.tgz#74ac4f64a83f8d975d7e9e09f5b5f1ce8c794d19" - integrity sha512-2gwa7+OKSuJBvKR4Y/ljhvmQd2J31NY0n5ygLrykMrk/HMEGhzBKFu94O+cndnYRhHrB4Rl8sWcFH/0H2Qqx+Q== +"@ethereum-waffle/provider@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.1.2.tgz#8ff1d98b3725c9abbdd1b13d47784eccf57ae1e5" + integrity sha512-RQTt87qmPJOFqF3QP1ASSt/kGUB2WJKfEwFMuAMP9ZQ2icRXtyLXseU4dKNAU0gc/BckqrXk5r1xzirwJp+ANg== dependencies: - "@ethereum-waffle/ens" "^3.1.1" + "@ethereum-waffle/ens" "^3.1.2" ethers "^5.0.1" ganache-core "^2.10.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" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@6.12.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz#9eb2bccff727db1c52104f0b49e87ea46605a0d2" - integrity sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw== +eslint-config-prettier@6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz#390e7863a8ae99970981933826476169285b3a27" + integrity sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ== dependencies: 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" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@7.10.0: - version "7.10.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9" - integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA== +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + 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: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.1.3" + "@eslint/eslintrc" "^0.2.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -2900,7 +2905,7 @@ eslint@7.10.0: enquirer "^2.3.5" eslint-scope "^5.1.1" eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" + eslint-visitor-keys "^2.0.0" espree "^7.3.0" esquery "^1.2.0" esutils "^2.0.2" @@ -3209,15 +3214,15 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereum-waffle@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.1.1.tgz#2a63475104281dca1fd2ffed12ab8f6605219d51" - integrity sha512-kiJo7PPGKsRfNiQOB8Z/ogLTHrU7Cj7VOZrdU3nyx9xXobkTFN9F9FcwdYZRg3gw3C1XnuOd18Jk2hPfuQbORA== +ethereum-waffle@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.1.2.tgz#54ab4049d256185bb50de4e86328e521ea2ad816" + integrity sha512-q9fI4N2RN+OEIXoWpyj8LWhjaBNtIxKID9RHHIvWe32Jp5nRN8F3Ja+EAaJ5Qh3/eZMPdpauW4N5zBrY2qXQpQ== dependencies: - "@ethereum-waffle/chai" "^3.1.1" - "@ethereum-waffle/compiler" "^3.1.1" - "@ethereum-waffle/mock-contract" "^3.1.1" - "@ethereum-waffle/provider" "^3.1.1" + "@ethereum-waffle/chai" "^3.1.2" + "@ethereum-waffle/compiler" "^3.1.2" + "@ethereum-waffle/mock-contract" "^3.1.2" + "@ethereum-waffle/provider" "^3.1.2" ethers "^5.0.1" ethereumjs-abi@0.6.5: @@ -4156,10 +4161,10 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hardhat@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.0.tgz#d2d5fcbcdbb9b6ec13e7c8e93706ddf0e5ac2a70" - integrity sha512-kwl4fTn5jU4n3rlT1PucKETZ6qWzZiGgcUAqoqLc2ZADbcm1N9KUCbKzleidvgn+gTYcvVkhPTskkU2Yop6Lag== +hardhat@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.1.tgz#2e7d1815654406199b88b31da9c2d2763e8f5577" + integrity sha512-9g67OkehLgHLgfqqbdR+FANshTUvFM3yuJr06ZScNErsvrdiLHpQ/Jbkd6rRiXjYovN/SMu4YZrhNEm62b7boA== dependencies: "@nomiclabs/ethereumjs-vm" "^4.1.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" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@>=10: - version "10.4.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.4.0.tgz#d18628f737328e0bbbf87d183f4020930e9a984e" - integrity sha512-uaiX4U5yERUSiIEQc329vhCTDDwUcSvKdRLsNomkYLRzijk3v8V9GWm2Nz0RMVB87VcuzLvtgy6OsjoH++QHIg== +lint-staged@10.4.2: + version "10.4.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.4.2.tgz#9fee4635c4b5ddb845746f237c6d43494ccd21c1" + integrity sha512-OLCA9K1hS+Sl179SO6kX0JtnsaKj/MZalEhUj5yAgXsb63qPI/Gfn6Ua1KuZdbfkZNEu3/n5C/obYCu70IMt9g== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0"