diff --git a/.example.env b/.example.env new file mode 100644 index 0000000..fde63d3 --- /dev/null +++ b/.example.env @@ -0,0 +1,12 @@ +# Infra +ALCHEMY_ID="" +INFURA_ID="" + +# PK +DEPLOYER_PK_MAINNET="" +DEPLOYER_PK_RINKEBY="" + +# For verifying contracts on Etherscan +ETHERSCAN_API_KEY="" + +COINMARKETCAP_API_KEY="" \ No newline at end of file diff --git a/contracts/__mocks__/__dependencies__/InstaDapp/dsa-contracts/connectors.sol b/contracts/__mocks__/__dependencies__/InstaDapp/dsa-contracts/connectors.sol index 91d9051..de68857 100644 --- a/contracts/__mocks__/__dependencies__/InstaDapp/dsa-contracts/connectors.sol +++ b/contracts/__mocks__/__dependencies__/InstaDapp/dsa-contracts/connectors.sol @@ -1,3 +1,7 @@ +/** + *Submitted for verification at Etherscan.io on 2020-03-26 + */ + pragma solidity 0.6.0; /** @@ -31,7 +35,7 @@ contract Controllers is DSMath { // InstaIndex Address. address public constant instaIndex = - 0x0000000000000000000000000000000000000000; + 0x2971AdFa57b20E5a416aE5a708A8655A9c74f723; // Enabled Chief(Address of Chief => bool). mapping(address => bool) public chief; diff --git a/contracts/__mocks__/gelato/MockDebtBridgeETHBExecutor.sol b/contracts/__mocks__/gelato/MockDebtBridgeETHBExecutor.sol index 0e41f7e..3b8fc7a 100644 --- a/contracts/__mocks__/gelato/MockDebtBridgeETHBExecutor.sol +++ b/contracts/__mocks__/gelato/MockDebtBridgeETHBExecutor.sol @@ -2,7 +2,7 @@ pragma solidity 0.7.4; pragma experimental ABIEncoderV2; -// import {console} from "hardhat/console.sol"; // Uncomment this line for using gasLeft Method +// import "hardhat/console.sol"; // Uncomment this line for using gasLeft Method import { TaskReceipt } from "@gelatonetwork/core/contracts/gelato_core/interfaces/IGelatoCore.sol"; @@ -47,48 +47,60 @@ contract MockDebtBridgeETHBExecutor { function execViaRoute0(TaskReceipt memory _taskReceipt) public { // uint256 gasLeft = gasleft(); IGelatoCore(gelatoCore).exec(_taskReceipt); - // console.log("Gas Cost for Task Execution %s", gasLeft - gasleft()); + // console.log("Gas Cost execViaRoute0: %s", gasLeft - gasleft()); } function execViaRoute0AndOpenVault(TaskReceipt memory _taskReceipt) public { // uint256 gasLeft = gasleft(); IGelatoCore(gelatoCore).exec(_taskReceipt); - // console.log("Gas Cost for Task Execution %s", gasLeft - gasleft()); + // console.log( + // "Gas Cost execViaRoute0AndOpenVault: %s", + // gasLeft - gasleft() + // ); } function execViaRoute1(TaskReceipt memory _taskReceipt) public { // uint256 gasLeft = gasleft(); IGelatoCore(gelatoCore).exec(_taskReceipt); - // console.log("Gas Cost for Task Execution %s", gasLeft - gasleft()); + // console.log("Gas Cost execViaRoute1: %s", gasLeft - gasleft()); } function execViaRoute1AndOpenVault(TaskReceipt memory _taskReceipt) public { // uint256 gasLeft = gasleft(); IGelatoCore(gelatoCore).exec(_taskReceipt); - // console.log("Gas Cost for Task Execution %s", gasLeft - gasleft()); + // console.log( + // "Gas Cost execViaRoute1AndOpenVault: %s", + // gasLeft - gasleft() + // ); } function execViaRoute2(TaskReceipt memory _taskReceipt) public { // uint256 gasLeft = gasleft(); IGelatoCore(gelatoCore).exec(_taskReceipt); - // console.log("Gas Cost for Task Execution %s", gasLeft - gasleft()); + // console.log("Gas Cost execViaRoute2: %s", gasLeft - gasleft()); } function execViaRoute2AndOpenVault(TaskReceipt memory _taskReceipt) public { // uint256 gasLeft = gasleft(); IGelatoCore(gelatoCore).exec(_taskReceipt); - // console.log("Gas Cost for Task Execution %s", gasLeft - gasleft()); + // console.log( + // "Gas Cost execViaRoute2AndOpenVault %s", + // gasLeft - gasleft() + // ); } function execViaRoute3(TaskReceipt memory _taskReceipt) public { // uint256 gasLeft = gasleft(); IGelatoCore(gelatoCore).exec(_taskReceipt); - // console.log("Gas Cost for Task Execution %s", gasLeft - gasleft()); + // console.log("Gas Cost execViaRoute3: %s", gasLeft - gasleft()); } function execViaRoute3AndOpenVAult(TaskReceipt memory _taskReceipt) public { // uint256 gasLeft = gasleft(); IGelatoCore(gelatoCore).exec(_taskReceipt); - // console.log("Gas Cost for Task Execution %s", gasLeft - gasleft()); + // console.log( + // "Gas Cost execViaRoute3AndOpenVAult: %s", + // gasLeft - gasleft() + // ); } } diff --git a/deploy/connectors/ConnectGelatoDataFullMakerToMaker.deploy.js b/deploy/connectors/ConnectGelatoDataFullMakerToMaker.deploy.js index c876568..dfbe25e 100644 --- a/deploy/connectors/ConnectGelatoDataFullMakerToMaker.deploy.js +++ b/deploy/connectors/ConnectGelatoDataFullMakerToMaker.deploy.js @@ -1,7 +1,6 @@ const hre = require("hardhat"); const { ethers } = hre; const { sleep } = require("@gelatonetwork/core"); -const InstaConnector = require("../../pre-compiles/InstaConnectors.json"); module.exports = async (hre) => { if (hre.network.name === "mainnet") { @@ -33,7 +32,7 @@ module.exports = async (hre) => { }); const instaConnectors = await hre.ethers.getContractAt( - InstaConnector.abi, + "InstaConnectors", hre.network.config.InstaConnectors ); const connectorLength = await instaConnectors.connectorLength(); diff --git a/deploy/connectors/ConnectGelatoProviderPayment.deploy.js b/deploy/connectors/ConnectGelatoProviderPayment.deploy.js index 1e2de3d..f31b47b 100644 --- a/deploy/connectors/ConnectGelatoProviderPayment.deploy.js +++ b/deploy/connectors/ConnectGelatoProviderPayment.deploy.js @@ -1,7 +1,6 @@ const hre = require("hardhat"); const { ethers } = hre; const { sleep } = require("@gelatonetwork/core"); -const InstaConnector = require("../../pre-compiles/InstaConnectors.json"); module.exports = async (hre) => { if (hre.network.name === "mainnet") { @@ -32,7 +31,7 @@ module.exports = async (hre) => { }); const instaConnectors = await hre.ethers.getContractAt( - InstaConnector.abi, + "InstaConnectors", hre.network.config.InstaConnectors ); const connectorLength = await instaConnectors.connectorLength(); @@ -63,7 +62,6 @@ module.exports = async (hre) => { gelatoProvider, ], gasPrice: hre.network.config.gasPrice, - nonce: 170, log: true, }); } diff --git a/hardhat.config.js b/hardhat.config.js index de18347..f7f9795 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -75,7 +75,7 @@ module.exports = { { version: "0.6.0", settings: { - optimizer: { enabled: process.env.DEBUG ? false : true }, + optimizer: { enabled: false }, }, }, { diff --git a/package.json b/package.json index ac37c35..22a0c72 100644 --- a/package.json +++ b/package.json @@ -19,15 +19,15 @@ }, "devDependencies": { "@codechecks/client": "0.1.10", - "@gelatonetwork/core": "1.3.1", + "@gelatonetwork/core": "1.4.1", "@nomiclabs/hardhat-ethers": "2.0.0", "@nomiclabs/hardhat-waffle": "2.0.0", - "@openzeppelin/contracts": "^3.2.0", + "@openzeppelin/contracts": "3.2.0", "chai": "4.2.0", "dotenv": "8.2.0", "eslint": "7.14.0", "eslint-config-prettier": "6.15.0", - "ethereum-waffle": "3.2.0", + "ethereum-waffle": "3.2.1", "ethers": "5.0.22", "hardhat": "2.0.3", "hardhat-deploy": "0.7.0-beta.30", diff --git a/test/gas/debt_bridge/full/from_maker/1_ETHA-ETHB-WITH-Vault-Creation.mock.test.js b/test/gas/debt_bridge/full/from_maker/1_ETHA-newETHB.mock.test.js similarity index 94% rename from test/gas/debt_bridge/full/from_maker/1_ETHA-ETHB-WITH-Vault-Creation.mock.test.js rename to test/gas/debt_bridge/full/from_maker/1_ETHA-newETHB.mock.test.js index 59aabcd..d6cffd9 100644 --- a/test/gas/debt_bridge/full/from_maker/1_ETHA-ETHB-WITH-Vault-Creation.mock.test.js +++ b/test/gas/debt_bridge/full/from_maker/1_ETHA-newETHB.mock.test.js @@ -3,8 +3,8 @@ const hre = require("hardhat"); const { deployments } = hre; const GelatoCoreLib = require("@gelatonetwork/core"); -const setupFullRefinanceMakerToMakerWithVaultBCreationMock = require("./helpers/setupFullRefinanceMakerToMakerWithVaultBCreationMock.mock"); -const exec_ETHA_ETHB_With_Vault_Creation = require("./helpers/services/exec-ETHA-ETHB-WITH-Vault-Creation"); +const mockSetupFullRefinanceMakerToNewMaker = require("./helpers/setupFullRefinanceMakerToNewMaker.mock"); +const mockExec_ETHA_newETHB = require("./helpers/services/exec-ETHA-newETHB.mock"); describe("Gas Measurements: Full Debt Bridge From Maker ETH-A to ETH-B", function () { this.timeout(0); @@ -47,9 +47,7 @@ describe("Gas Measurements: Full Debt Bridge From Maker ETH-A to ETH-B", functio // Reset back to a fresh forked state during runtime await deployments.fixture(); - const result = await setupFullRefinanceMakerToMakerWithVaultBCreationMock( - mockRoute - ); + const result = await mockSetupFullRefinanceMakerToNewMaker(mockRoute); wallets = result.wallets; contracts = result.contracts; @@ -162,7 +160,7 @@ describe("Gas Measurements: Full Debt Bridge From Maker ETH-A to ETH-B", functio expiryDate, }); - await exec_ETHA_ETHB_With_Vault_Creation( + await mockExec_ETHA_newETHB( constants, contracts, wallets, @@ -209,7 +207,7 @@ describe("Gas Measurements: Full Debt Bridge From Maker ETH-A to ETH-B", functio expiryDate, }); - await exec_ETHA_ETHB_With_Vault_Creation( + await mockExec_ETHA_newETHB( constants, contracts, wallets, @@ -256,7 +254,7 @@ describe("Gas Measurements: Full Debt Bridge From Maker ETH-A to ETH-B", functio expiryDate, }); - await exec_ETHA_ETHB_With_Vault_Creation( + await mockExec_ETHA_newETHB( constants, contracts, wallets, @@ -303,7 +301,7 @@ describe("Gas Measurements: Full Debt Bridge From Maker ETH-A to ETH-B", functio expiryDate, }); - await exec_ETHA_ETHB_With_Vault_Creation( + await mockExec_ETHA_newETHB( constants, contracts, wallets, diff --git a/test/gas/debt_bridge/full/from_maker/helpers/services/exec-ETHA-ETHB-WITH-Vault-Creation.js b/test/gas/debt_bridge/full/from_maker/helpers/services/exec-ETHA-newETHB.mock.js similarity index 100% rename from test/gas/debt_bridge/full/from_maker/helpers/services/exec-ETHA-ETHB-WITH-Vault-Creation.js rename to test/gas/debt_bridge/full/from_maker/helpers/services/exec-ETHA-newETHB.mock.js diff --git a/test/gas/debt_bridge/full/from_maker/helpers/services/getSpells-ETHA-ETHB-With-Vault-Creation.mock.js b/test/gas/debt_bridge/full/from_maker/helpers/services/getSpells-ETHA-newETHB.mock.js similarity index 100% rename from test/gas/debt_bridge/full/from_maker/helpers/services/getSpells-ETHA-ETHB-With-Vault-Creation.mock.js rename to test/gas/debt_bridge/full/from_maker/helpers/services/getSpells-ETHA-newETHB.mock.js diff --git a/test/gas/debt_bridge/full/from_maker/helpers/setupFullRefinanceMakerToMakerWithVaultBCreationMock.mock.js b/test/gas/debt_bridge/full/from_maker/helpers/setupFullRefinanceMakerToNewMaker.mock.js similarity index 92% rename from test/gas/debt_bridge/full/from_maker/helpers/setupFullRefinanceMakerToMakerWithVaultBCreationMock.mock.js rename to test/gas/debt_bridge/full/from_maker/helpers/setupFullRefinanceMakerToNewMaker.mock.js index fdcdd0d..9820b75 100644 --- a/test/gas/debt_bridge/full/from_maker/helpers/setupFullRefinanceMakerToMakerWithVaultBCreationMock.mock.js +++ b/test/gas/debt_bridge/full/from_maker/helpers/setupFullRefinanceMakerToNewMaker.mock.js @@ -7,7 +7,7 @@ const addProviderModuleDSA = require("../../../../../helpers/services/gelato/add const createDSA = require("../../../../../helpers/services/InstaDapp/createDSA"); const initializeMakerCdp = require("../../../../../helpers/services/maker/initializeMakerCdp"); const createVaultForETHB = require("../../../../../helpers/services/maker/createVaultForETHB"); -const mockGetSpellsETHAETHBWithVaultCreation = require("./services/getSpells-ETHA-ETHB-With-Vault-Creation.mock"); +const getMockSpellsETHAnewETHB = require("./services/getSpells-ETHA-newETHB.mock"); const getABI = require("../../../../../helpers/services/getABI"); module.exports = async function (mockRoute) { @@ -55,7 +55,7 @@ module.exports = async function (mockRoute) { contracts.getCdps, contracts.dssCdpManager ); - const spells = await mockGetSpellsETHAETHBWithVaultCreation( + const spells = await getMockSpellsETHAnewETHB( wallets, contracts, constants, diff --git a/test/helpers/constants/GasConstant.js b/test/helpers/constants/GasConstant.js deleted file mode 100644 index c82012e..0000000 --- a/test/helpers/constants/GasConstant.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = async () => { - return { - PREMIUM: 20, - VAULT_CREATION_COST: 100000, - }; -}; diff --git a/test/integration/debt_bridge/from_maker/full/0_To-Compound.test.js b/test/integration/debt_bridge/from_maker/full/functionality/0_To-Compound.test.js similarity index 95% rename from test/integration/debt_bridge/from_maker/full/0_To-Compound.test.js rename to test/integration/debt_bridge/from_maker/full/functionality/0_To-Compound.test.js index 646acf4..09f17a9 100644 --- a/test/integration/debt_bridge/from_maker/full/0_To-Compound.test.js +++ b/test/integration/debt_bridge/from_maker/full/functionality/0_To-Compound.test.js @@ -4,9 +4,9 @@ const { deployments, ethers } = hre; const GelatoCoreLib = require("@gelatonetwork/core"); -const setupFullRefinanceMakerToCompound = require("./helpers/setupFullRefinanceMakerToCompound"); -const getInstaPoolV2Route = require("../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); -const getGasCostForFullRefinance = require("../../../../helpers/services/gelato/getGasCostForFullRefinance"); +const setupMakerToCompound = require("../helpers/setupMakerToCompound"); +const getInstaPoolV2Route = require("../../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); +const getGasCost = require("../helpers/services/getGasCost"); // This test showcases how to submit a task refinancing a Users debt position from // Maker to Compound using Gelato @@ -34,7 +34,7 @@ describe("Full Debt Bridge refinancing loan from Maker to Compound", function () before(async function () { await deployments.fixture(); - const result = await setupFullRefinanceMakerToCompound(); + const result = await setupMakerToCompound(); wallets = result.wallets; contracts = result.contracts; vaultId = result.vaultId; @@ -205,7 +205,7 @@ describe("Full Debt Bridge refinancing loan from Maker to Compound", function () contracts.instaPoolResolver ); - const gasCost = await getGasCostForFullRefinance(route); + const gasCost = await getGasCost(route); const gasFeesPaidFromCol = ethers.BigNumber.from(gasCost).mul( gelatoGasPrice diff --git a/test/integration/debt_bridge/from_maker/full/1_ETHA-ETHB-With-Vault-Creation.test.js b/test/integration/debt_bridge/from_maker/full/functionality/1_ETHA-newETHB.test.js similarity index 95% rename from test/integration/debt_bridge/from_maker/full/1_ETHA-ETHB-With-Vault-Creation.test.js rename to test/integration/debt_bridge/from_maker/full/functionality/1_ETHA-newETHB.test.js index a5cc9f3..96a15b1 100644 --- a/test/integration/debt_bridge/from_maker/full/1_ETHA-ETHB-With-Vault-Creation.test.js +++ b/test/integration/debt_bridge/from_maker/full/functionality/1_ETHA-newETHB.test.js @@ -3,9 +3,9 @@ const hre = require("hardhat"); const { deployments, ethers } = hre; const GelatoCoreLib = require("@gelatonetwork/core"); -const setupFullRefinanceMakerToMakerWithVaultBCreation = require("./helpers/setupFullRefinanceMakerToMakerWithVaultBCreation"); -const getInstaPoolV2Route = require("../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); -const getGasCostForFullRefinance = require("./../../../../helpers/services/gelato/getGasCostForFullRefinance"); +const setupMakerToNewMaker = require("../helpers/setupMakerToNewMaker"); +const getInstaPoolV2Route = require("../../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); +const getGasCost = require("../helpers/services/getGasCost"); // This test showcases how to submit a task refinancing a Users debt position from // Maker to Compound using Gelato @@ -34,7 +34,7 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B with vault creat // Reset back to a fresh forked state during runtime await deployments.fixture(); - const result = await setupFullRefinanceMakerToMakerWithVaultBCreation(); + const result = await setupMakerToNewMaker(); wallets = result.wallets; contracts = result.contracts; @@ -223,7 +223,7 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B with vault creat ); } - const gasCost = await getGasCostForFullRefinance(route, true); + const gasCost = await getGasCost(route, true); const gasFeesPaidFromCol = ethers.BigNumber.from(gasCost).mul( gelatoGasPrice diff --git a/test/integration/debt_bridge/from_maker/full/2_ETHA-ETHB.test.js b/test/integration/debt_bridge/from_maker/full/functionality/2_ETHA-ETHB.test.js similarity index 96% rename from test/integration/debt_bridge/from_maker/full/2_ETHA-ETHB.test.js rename to test/integration/debt_bridge/from_maker/full/functionality/2_ETHA-ETHB.test.js index 4d47bcf..00afc21 100644 --- a/test/integration/debt_bridge/from_maker/full/2_ETHA-ETHB.test.js +++ b/test/integration/debt_bridge/from_maker/full/functionality/2_ETHA-ETHB.test.js @@ -3,9 +3,9 @@ const hre = require("hardhat"); const { deployments, ethers } = hre; const GelatoCoreLib = require("@gelatonetwork/core"); -const setupFullRefinanceMakerToMaker = require("./helpers/setupFullRefinanceMakerToMaker"); -const getInstaPoolV2Route = require("../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); -const getGasCostForFullRefinance = require("../../../../helpers/services/gelato/getGasCostForFullRefinance"); +const setupMakerToMaker = require("../helpers/setupMakerToMaker"); +const getInstaPoolV2Route = require("../../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); +const getGasCost = require("../helpers/services/getGasCost"); // This test showcases how to submit a task refinancing a Users debt position from // Maker to Compound using Gelato @@ -35,7 +35,7 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B", function () { // Reset back to a fresh forked state during runtime await deployments.fixture(); - const result = await setupFullRefinanceMakerToMaker(); + const result = await setupMakerToMaker(); wallets = result.wallets; contracts = result.contracts; @@ -225,7 +225,7 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B", function () { ); } - const gasCost = await getGasCostForFullRefinance(route); + const gasCost = await getGasCost(route); const gasFeesPaidFromCol = ethers.BigNumber.from(gasCost).mul( gelatoGasPrice diff --git a/test/integration/debt_bridge/from_maker/full/3_ETHA-ETHB-With-Vault-Closing.test.js b/test/integration/debt_bridge/from_maker/full/functionality/3_ETHA-closedETHB.test.js similarity index 96% rename from test/integration/debt_bridge/from_maker/full/3_ETHA-ETHB-With-Vault-Closing.test.js rename to test/integration/debt_bridge/from_maker/full/functionality/3_ETHA-closedETHB.test.js index a05e62f..f3113f9 100644 --- a/test/integration/debt_bridge/from_maker/full/3_ETHA-ETHB-With-Vault-Closing.test.js +++ b/test/integration/debt_bridge/from_maker/full/functionality/3_ETHA-closedETHB.test.js @@ -3,9 +3,9 @@ const hre = require("hardhat"); const { deployments, ethers } = hre; const GelatoCoreLib = require("@gelatonetwork/core"); -const setupFullRefinanceMakerToMaker = require("./helpers/setupFullRefinanceMakerToMaker"); -const getInstaPoolV2Route = require("../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); -const getGasCostForFullRefinance = require("../../../../helpers/services/gelato/getGasCostForFullRefinance"); +const setupMakerToMaker = require("../helpers/setupMakerToMaker"); +const getInstaPoolV2Route = require("../../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); +const getGasCost = require("../helpers/services/getGasCost"); // This test showcases how to submit a task refinancing a Users debt position from // Maker to Compound using Gelato @@ -35,7 +35,7 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B with Vault B cre // Reset back to a fresh forked state during runtime await deployments.fixture(); - const result = await setupFullRefinanceMakerToMaker(); + const result = await setupMakerToMaker(); wallets = result.wallets; contracts = result.contracts; @@ -244,7 +244,7 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B with Vault B cre ); } - const gasCost = await getGasCostForFullRefinance(route, true); + const gasCost = await getGasCost(route, true); const gasFeesPaidFromCol = ethers.BigNumber.from(gasCost).mul( gelatoGasPrice diff --git a/test/integration/debt_bridge/from_maker/full/helpers/constants/costs.js b/test/integration/debt_bridge/from_maker/full/helpers/constants/costs.js new file mode 100644 index 0000000..5ccc334 --- /dev/null +++ b/test/integration/debt_bridge/from_maker/full/helpers/constants/costs.js @@ -0,0 +1,4 @@ +module.exports = { + PREMIUM: 20, + VAULT_CREATION_COST: 100000, +}; diff --git a/test/helpers/services/gelato/getGasCostForFullRefinance.js b/test/integration/debt_bridge/from_maker/full/helpers/services/getGasCost.js similarity index 71% rename from test/helpers/services/gelato/getGasCostForFullRefinance.js rename to test/integration/debt_bridge/from_maker/full/helpers/services/getGasCost.js index 0108a1d..d57c443 100644 --- a/test/helpers/services/gelato/getGasCostForFullRefinance.js +++ b/test/integration/debt_bridge/from_maker/full/helpers/services/getGasCost.js @@ -1,8 +1,7 @@ -const gasConstants = require("../../constants/GasConstant"); +const { PREMIUM, VAULT_CREATION_COST } = require("../constants/costs"); -module.exports = async function (route, withVaultCreation) { +module.exports = (route, withVaultCreation) => { let rawGasCost; - const gasCons = await gasConstants(); switch (route) { case 0: rawGasCost = 2519000; // 2290000 * 1,1 // gas left method measure : 2290000 - 2106637 = 183363 | gas reporter : 2290000 - 1789126 = 500874 @@ -21,7 +20,6 @@ module.exports = async function (route, withVaultCreation) { } return withVaultCreation - ? ((rawGasCost + gasCons.VAULT_CREATION_COST) * (100 + gasCons.PREMIUM)) / - 100 - : (rawGasCost * (100 + gasCons.PREMIUM)) / 100; + ? ((rawGasCost + VAULT_CREATION_COST) * (100 + PREMIUM)) / 100 + : (rawGasCost * (100 + PREMIUM)) / 100; }; diff --git a/test/integration/debt_bridge/from_maker/full/helpers/services/getSpells-ETHA-ETHB-With-Vault-Creation.js b/test/integration/debt_bridge/from_maker/full/helpers/services/getSpells-ETHA-newETHB.js similarity index 100% rename from test/integration/debt_bridge/from_maker/full/helpers/services/getSpells-ETHA-ETHB-With-Vault-Creation.js rename to test/integration/debt_bridge/from_maker/full/helpers/services/getSpells-ETHA-newETHB.js diff --git a/test/integration/debt_bridge/from_maker/full/helpers/setupFullRefinanceMakerToCompound.js b/test/integration/debt_bridge/from_maker/full/helpers/setupMakerToCompound.js similarity index 100% rename from test/integration/debt_bridge/from_maker/full/helpers/setupFullRefinanceMakerToCompound.js rename to test/integration/debt_bridge/from_maker/full/helpers/setupMakerToCompound.js diff --git a/test/integration/debt_bridge/from_maker/full/helpers/setupFullRefinanceMakerToMaker.js b/test/integration/debt_bridge/from_maker/full/helpers/setupMakerToMaker.js similarity index 100% rename from test/integration/debt_bridge/from_maker/full/helpers/setupFullRefinanceMakerToMaker.js rename to test/integration/debt_bridge/from_maker/full/helpers/setupMakerToMaker.js diff --git a/test/integration/debt_bridge/from_maker/full/helpers/setupFullRefinanceMakerToMakerWithVaultBCreation.js b/test/integration/debt_bridge/from_maker/full/helpers/setupMakerToNewMaker.js similarity index 98% rename from test/integration/debt_bridge/from_maker/full/helpers/setupFullRefinanceMakerToMakerWithVaultBCreation.js rename to test/integration/debt_bridge/from_maker/full/helpers/setupMakerToNewMaker.js index 2ea245e..036b92c 100644 --- a/test/integration/debt_bridge/from_maker/full/helpers/setupFullRefinanceMakerToMakerWithVaultBCreation.js +++ b/test/integration/debt_bridge/from_maker/full/helpers/setupMakerToNewMaker.js @@ -7,7 +7,7 @@ const providerAssignsExecutor = require("../../../../../helpers/services/gelato/ const addProviderModuleDSA = require("../../../../../helpers/services/gelato/addProviderModuleDSA"); const createDSA = require("../../../../../helpers/services/InstaDapp/createDSA"); const initializeMakerCdp = require("../../../../../helpers/services/maker/initializeMakerCdp"); -const getSpellsEthAEthBWithVaultCreation = require("./services/getSpells-ETHA-ETHB-With-Vault-Creation"); +const getSpellsEthAEthBWithVaultCreation = require("./services/getSpells-ETHA-newETHB"); const getABI = require("../../../../../helpers/services/getABI"); module.exports = async function () { diff --git a/test/integration/debt_bridge/from_maker/full/security/_cast.test.js b/test/integration/debt_bridge/from_maker/full/security/_cast.test.js new file mode 100644 index 0000000..03091f0 --- /dev/null +++ b/test/integration/debt_bridge/from_maker/full/security/_cast.test.js @@ -0,0 +1,263 @@ +const { expect } = require("chai"); +const hre = require("hardhat"); +const { deployments, ethers } = hre; +const GelatoCoreLib = require("@gelatonetwork/core"); + +const setupMakerToMaker = require("../helpers/setupMakerToMaker"); + +// This test showcases how to submit a task refinancing a Users debt position from +// Maker to Compound using Gelato +describe("Security: _cast function by example of ETHA-ETHB with disabled ConnectGelatoProviderPayment", function () { + this.timeout(0); + if (hre.network.name !== "hardhat") { + console.error("Test Suite is meant to be run on hardhat only"); + process.exit(1); + } + + let contracts; + let wallets; + let constants; + let ABI; + + // Payload Params for ConnectGelatoFullDebtBridgeFromMaker and ConditionMakerVaultUnsafe + let vaultAId; + let vaultBId; + + // For TaskSpec and for Task + let gelatoDebtBridgeSpells = []; + + // Cross test var + let taskReceipt; + + before(async function () { + // Reset back to a fresh forked state during runtime + await deployments.fixture(); + + const result = await setupMakerToMaker(); + + wallets = result.wallets; + contracts = result.contracts; + vaultAId = result.vaultAId; + vaultBId = result.vaultBId; + gelatoDebtBridgeSpells = result.spells; + + ABI = result.ABI; + constants = result.constants; + }); + + it("#1: DSA authorizes Gelato to cast spells.", async function () { + //#region User give authorization to gelato to use his DSA on his behalf. + + // Instadapp DSA contract give the possibility to the user to delegate + // action by giving authorization. + // In this case user give authorization to gelato to execute + // task for him if needed. + + await contracts.dsa.cast( + [hre.network.config.ConnectAuth], + [ + await hre.run("abi-encode-withselector", { + abi: ABI.ConnectAuthABI, + functionname: "add", + inputs: [contracts.gelatoCore.address], + }), + ], + wallets.userAddress + ); + + expect(await contracts.dsa.isAuth(contracts.gelatoCore.address)).to.be.true; + + //#endregion + }); + + it("#2: User submits automated Debt Bridge task to Gelato via DSA", async function () { + //#region User submit a Debt Refinancing task if market move against him + + // User submit the refinancing task if market move against him. + // So in this case if the maker vault go to the unsafe area + // the refinancing task will be executed and the position + // will be split on two position on maker and compound. + // It will be done through a algorithm that will optimize the + // total borrow rate. + + const conditionMakerVaultUnsafeObj = new GelatoCoreLib.Condition({ + inst: contracts.conditionMakerVaultUnsafe.address, + data: await contracts.conditionMakerVaultUnsafe.getConditionData( + vaultAId, + contracts.priceOracleResolver.address, + await hre.run("abi-encode-withselector", { + abi: (await deployments.getArtifact("PriceOracleResolver")).abi, + functionname: "getMockPrice", + inputs: [wallets.userAddress], + }), + constants.MIN_COL_RATIO_MAKER + ), + }); + + const conditionDebtBridgeIsAffordableObj = new GelatoCoreLib.Condition({ + inst: contracts.conditionDebtBridgeIsAffordable.address, + data: await contracts.conditionDebtBridgeIsAffordable.getConditionData( + vaultAId, + constants.MAX_FEES_IN_PERCENT + ), + }); + + const conditionDestVaultWillBeSafe = new GelatoCoreLib.Condition({ + inst: contracts.conditionDestVaultWillBeSafe.address, + data: await contracts.conditionDestVaultWillBeSafe.getConditionData( + vaultAId, + vaultBId, + "ETH-B" + ), + }); + + // ======= GELATO TASK SETUP ====== + const refinanceFromEthAToBIfVaultUnsafe = new GelatoCoreLib.Task({ + conditions: [ + conditionMakerVaultUnsafeObj, + conditionDebtBridgeIsAffordableObj, + conditionDestVaultWillBeSafe, + ], + actions: gelatoDebtBridgeSpells, + }); + + const gelatoExternalProvider = new GelatoCoreLib.GelatoProvider({ + addr: wallets.gelatoProviderAddress, // Gelato Provider Address + module: contracts.dsaProviderModule.address, // Gelato DSA module + }); + + const expiryDate = 0; + + await expect( + contracts.dsa.cast( + [contracts.connectGelato.address], // targets + [ + await hre.run("abi-encode-withselector", { + abi: ABI.ConnectGelatoABI, + functionname: "submitTask", + inputs: [ + gelatoExternalProvider, + refinanceFromEthAToBIfVaultUnsafe, + expiryDate, + ], + }), + ], // datas + wallets.userAddress, // origin + { + gasLimit: 5000000, + } + ) + ).to.emit(contracts.gelatoCore, "LogTaskSubmitted"); + + taskReceipt = new GelatoCoreLib.TaskReceipt({ + id: await contracts.gelatoCore.currentTaskReceiptId(), + userProxy: contracts.dsa.address, + provider: gelatoExternalProvider, + tasks: [refinanceFromEthAToBIfVaultUnsafe], + expiryDate, + }); + + //#endregion + }); + + // This test showcases the part which is automatically done by the Gelato Executor Network on mainnet + // 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("#3: Test Case: Task execution with LogExecReverted due to disabled connector", async function () { + // Steps + // Step 1: Market Move against the user (Mock) + // Step 2: Executor execute the user's task + + //#region Step 1 Market Move against the user (Mock) + + // Ether market price went from the current price to 250$ + + const gelatoGasPrice = await hre.run("fetchGelatoGasPrice"); + expect(gelatoGasPrice).to.be.lte(constants.GAS_PRICE_CEIL); + + // TO DO: base mock price off of real price data + await contracts.priceOracleResolver.setMockPrice( + ethers.utils.parseUnits("400", 18) + ); + + expect( + await contracts.gelatoCore + .connect(wallets.gelatoExecutorWallet) + .canExec(taskReceipt, constants.GAS_LIMIT, gelatoGasPrice) + ).to.be.equal("ConditionNotOk:MakerVaultNotUnsafe"); + + // TO DO: base mock price off of real price data + await contracts.priceOracleResolver.setMockPrice( + ethers.utils.parseUnits("250", 18) + ); + + expect( + await contracts.gelatoCore + .connect(wallets.gelatoExecutorWallet) + .canExec(taskReceipt, constants.GAS_LIMIT, gelatoGasPrice) + ).to.be.equal("OK"); + + // SECURITY TEST CASE: we disable a connector to be called as part of the Task + // and expect this to cause the _cast + const instaConnectors = await hre.ethers.getContractAt( + "InstaConnectors", + hre.network.config.InstaConnectors + ); + + const { address: connectGelatoProviderPayment } = await ethers.getContract( + "ConnectGelatoProviderPayment" + ); + + expect(await instaConnectors.isConnector([connectGelatoProviderPayment])).to + .be.true; + + const instaMaster = await ethers.provider.getSigner( + hre.network.config.InstaMaster + ); + + await wallets.userWallet.sendTransaction({ + to: await instaMaster.getAddress(), + value: ethers.utils.parseEther("0.1"), + }); + + await hre.network.provider.request({ + method: "hardhat_impersonateAccount", + params: [await instaMaster.getAddress()], + }); + + await instaConnectors + .connect(instaMaster) + .disable(connectGelatoProviderPayment); + + await hre.network.provider.request({ + method: "hardhat_stopImpersonatingAccount", + params: [await instaMaster.getAddress()], + }); + + // await expect( + // contracts.gelatoCore + // .connect(wallets.gelatoExecutorWallet) + // .exec(taskReceipt, { + // gasPrice: gelatoGasPrice, // Exectutor must use gelatoGasPrice (Chainlink fast gwei) + // gasLimit: constants.GAS_LIMIT, + // }) + // ).to.emit(contracts.gelatoCore, "LogExecReverted"); + + const txResponse = await contracts.gelatoCore + .connect(wallets.gelatoExecutorWallet) + .exec(taskReceipt, { + gasPrice: gelatoGasPrice, + gasLimit: constants.GAS_LIMIT, + }); + const { blockHash } = await txResponse.wait(); + const logs = await ethers.provider.getLogs({ blockHash }); + expect( + logs.some( + (log) => + contracts.gelatoCore.interface.parseLog(log).args.reason === + "GelatoCore._exec:ConnectGelatoDataFullMakerToMaker._cast:not-connector" + ) + ).to.be.true; + }); +}); diff --git a/test/unit/functions/0_FGelatoDebtBridge.test.js b/test/unit/functions/0_FGelatoDebtBridge.test.js index 097e0ac..4b459ca 100644 --- a/test/unit/functions/0_FGelatoDebtBridge.test.js +++ b/test/unit/functions/0_FGelatoDebtBridge.test.js @@ -3,7 +3,7 @@ const hre = require("hardhat"); const { deployments, ethers } = hre; const InstaPoolResolver = require("../../../artifacts/contracts/interfaces/InstaDapp/resolvers/IInstaPoolResolver.sol/IInstaPoolResolver.json"); -const getGasCostForFullRefinance = require("./../../helpers/services/gelato/getGasCostForFullRefinance"); +const getGasCost = require("../../integration/debt_bridge/from_maker/full/helpers/services/getGasCost"); const DAI = hre.network.config.DAI; describe("FGelatoDebtBridge Unit Tests", function () { @@ -76,56 +76,56 @@ describe("FGelatoDebtBridge Unit Tests", function () { }); it("getGasCostMakerToMaker should return 3142800 gas limit for route 0 (Dydx) and new vault", async function () { - const expectedGasCost = await getGasCostForFullRefinance(0, true); + const expectedGasCost = await getGasCost(0, true); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(true, 0) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToMaker should return 3022800 gas limit for route 0 (Dydx)", async function () { - const expectedGasCost = await getGasCostForFullRefinance(0); + const expectedGasCost = await getGasCost(0); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(false, 0) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToMaker should return 3888600 gas limit for route 1 (maker) and new vault", async function () { - const expectedGasCost = await getGasCostForFullRefinance(1, true); + const expectedGasCost = await getGasCost(1, true); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(true, 1) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToMaker should return 3768600 gas limit for route 1 (maker)", async function () { - const expectedGasCost = await getGasCostForFullRefinance(1); + const expectedGasCost = await getGasCost(1); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(false, 1) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToMaker should return 4885200 gas limit for route 2 (compound) and new vault", async function () { - const expectedGasCost = await getGasCostForFullRefinance(2, true); + const expectedGasCost = await getGasCost(2, true); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(true, 2) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToMaker should return 4765200 gas limit for route 2 (compound)", async function () { - const expectedGasCost = await getGasCostForFullRefinance(2); + const expectedGasCost = await getGasCost(2); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(false, 2) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToMaker should return 5334000 gas limit for route 3 (aave) and new vault", async function () { - const expectedGasCost = await getGasCostForFullRefinance(3, true); + const expectedGasCost = await getGasCost(3, true); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(true, 3) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToMaker should return 5214000 gas limit for route 3 (aave)", async function () { - const expectedGasCost = await getGasCostForFullRefinance(3); + const expectedGasCost = await getGasCost(3); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(false, 3) ).to.be.equal(expectedGasCost); @@ -140,28 +140,28 @@ describe("FGelatoDebtBridge Unit Tests", function () { }); it("getGasCostMakerToCompound should return 3022800 gas limit for route 0 (Dydx)", async function () { - const expectedGasCost = await getGasCostForFullRefinance(0); + const expectedGasCost = await getGasCost(0); expect( await fGelatoDebtBridgeMock.getGasCostMakerToCompound(0) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToCompound should return 3768600 gas limit for route 1 (Maker)", async function () { - const expectedGasCost = await getGasCostForFullRefinance(1); + const expectedGasCost = await getGasCost(1); expect( await fGelatoDebtBridgeMock.getGasCostMakerToCompound(1) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToCompound should return 4765200 gas limit for route 2 (Compound)", async function () { - const expectedGasCost = await getGasCostForFullRefinance(2); + const expectedGasCost = await getGasCost(2); expect( await fGelatoDebtBridgeMock.getGasCostMakerToCompound(2) ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToCompound should return 5214000 gas limit for route 3 (Aave)", async function () { - const expectedGasCost = await getGasCostForFullRefinance(3); + const expectedGasCost = await getGasCost(3); expect( await fGelatoDebtBridgeMock.getGasCostMakerToCompound(3) ).to.be.equal(expectedGasCost); diff --git a/yarn.lock b/yarn.lock index f76abd7..0805d6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -81,18 +81,18 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereum-waffle/chai@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.2.0.tgz#f75465e447358db0fde967b26cf10adbe5365380" - integrity sha512-3mvI7luX8FSAX2yjklSN8rw8F8RNaMzZDadDkS9JvmoM4khByGe3mDn8rVroneBAcFusXJfL6BEssGj5S4mD7Q== +"@ethereum-waffle/chai@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.2.1.tgz#5cb542b2a323adf0bc2dda00f48b0eb85944d8ab" + integrity sha512-0aG946J1+2Gg7WnEjtwPEWe+xwLTeBTy6LpCnGecosMf3YINkaf9Xv3Sd7CrXBR88ihCoUhfzfmOloMHIAQPAg== dependencies: - "@ethereum-waffle/provider" "^3.2.0" + "@ethereum-waffle/provider" "^3.2.1" ethers "^5.0.0" -"@ethereum-waffle/compiler@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.2.0.tgz#3d5cccc8171ff61a0069d9558fb567ddd45b6b4e" - integrity sha512-Tg8YjbcVKQkNwhbiBf9Z4kKPolPO0IB+iYwAdpXNwgyMOH74guIHhFGtKOCPoY4VXR75erGgeQIt2PzIn/szCA== +"@ethereum-waffle/compiler@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.2.1.tgz#612a9056285a94ce28eb57b895770ad10e438bf9" + integrity sha512-URSsbTp4g8HPHAaA4KiAD6Aya9WPx/TULfOr+YpjCJ6YWXqE9wwi3ubf9qJUQxu6W6PsiczBaQhVhpI9RLoVUA== dependencies: "@resolver-engine/imports" "^0.3.3" "@resolver-engine/imports-fs" "^0.3.3" @@ -103,29 +103,29 @@ node-fetch "^2.6.0" solc "^0.6.3" -"@ethereum-waffle/ens@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.0.tgz#26f7b2048a422eae5ce39a855e519e01ebc06953" - integrity sha512-n4EYJDLAwN2X+2EsZMasXRlz5gYp39Tmy18RU4f6ZdnTNuVNw1BNkCC9VzrQooHGvHLjKZFPvcl+FRfBO+Xcyw== +"@ethereum-waffle/ens@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.1.tgz#9f369112d62f7aa88d010be4d133b6d0f5e8c492" + integrity sha512-dXv/Mb8EgEYOKv2jjmkFNFCmSjNv8nPk1Gaegc0J/KXWuTU6CBOhWet7YS5joGO8ORK21MvN2qVgcQj+FYw0Dw== dependencies: "@ensdomains/ens" "^0.4.4" "@ensdomains/resolver" "^0.2.4" ethers "^5.0.1" -"@ethereum-waffle/mock-contract@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.2.0.tgz#be9441060f8b58f1d7e344f74e5dd158d41a7c45" - integrity sha512-TfBt9ka2DXVxxIBee3WB0gSLgWCo9ZegqcdXjCz0QGlu+dEhL8W3+aLDYQoyx3kwlecfNl8EQ1V7g7GH8wrlMg== +"@ethereum-waffle/mock-contract@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.2.1.tgz#bf5f63f61c9749eb3270108893a88ff161e68f58" + integrity sha512-39GMp/IqsHF+3j3XK38cWA+nX7Q6ABfMsYkuAjtfpTguTFQKXx2C1/VJZwGOyb4de2pl4bssmN37VEraB3NWbQ== dependencies: "@ethersproject/abi" "^5.0.1" ethers "^5.0.1" -"@ethereum-waffle/provider@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.2.0.tgz#501d4bbf04ffc01dced0107dcc9e20f24354387f" - integrity sha512-U9KyjMKIZuK4gi2kzWIJkAXYjtg0aIlEQ0F4yKqHMRyqAiSM6M4VJgn6tHisxe3Ev9z/jSnutKT8dyAEwlIYdw== +"@ethereum-waffle/provider@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.2.1.tgz#d84c0603936f09afa69ecb671d56f527e9818e71" + integrity sha512-doG18hThqldsYcZIIO0YoiwV+ERx0dCVY6bkg4FKZtoymNelf15zNycb881c6QD9RnLuz6A2Jp9lmnrAD+IvYQ== dependencies: - "@ethereum-waffle/ens" "^3.2.0" + "@ethereum-waffle/ens" "^3.2.1" ethers "^5.0.1" ganache-core "^2.10.2" patch-package "^6.2.2" @@ -872,10 +872,10 @@ "@ethersproject/properties" "^5.0.3" "@ethersproject/strings" "^5.0.4" -"@gelatonetwork/core@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@gelatonetwork/core/-/core-1.3.1.tgz#cff0cb4d06a2bbb7859f3918995f44efc692bb11" - integrity sha512-xnl9jskZfAwwaJlIxmiXI+Cm1eKnPoDDBbMPlkNJ2NCDxoDOq/6tjHm9VXIVPDTjpqmNSPzQJjDxFWDrKUrosQ== +"@gelatonetwork/core@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@gelatonetwork/core/-/core-1.4.1.tgz#4e13368da1a0346217cf76e1ef5c1d0adcfdc870" + integrity sha512-6heuXhIewQ4B2qGe8QGg0het9/ixwIYfIE02QU9ATK/ULpBvZKsmj0NQ5K8l54XyoRvpNXhQYRendmSBE7Z7Sw== "@nomiclabs/ethereumjs-vm@^4.1.1": version "4.2.0" @@ -911,7 +911,7 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" -"@openzeppelin/contracts@^3.2.0": +"@openzeppelin/contracts@3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.2.0.tgz#3e6b3a7662d8ed64271ade96ef42655db983fd9d" integrity sha512-bUOmkSoPkjnUyMiKo6RYnb0VHBk5D9KKDAgNLzF41aqAM3TeE0yGdFF5dVRcV60pZdJLlyFT/jjXIZCWyyEzAQ== @@ -3739,15 +3739,15 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereum-waffle@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.2.0.tgz#1cea66fece731ea281e9d68046056caed2f2af84" - integrity sha512-XmLvbGE47u+6haOT/vBwx/2ifemlKv4Uop1ebnccnBXD0xmTK2Qnk/FonwHtkHX+cUxj+Ax+3c/1fYDogEvcZw== +ethereum-waffle@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.2.1.tgz#9d6d6b93484c5e1b77dfdeb646c050ed877e836e" + integrity sha512-Fhg7BaBuV+Xo5XT+NEC3UTKGunvpq+iQPglZbIAJF6ZcwQwkiKfJUDuB0ZSkg5ntbRS4gpahfoXj1nTzdtx8UA== dependencies: - "@ethereum-waffle/chai" "^3.2.0" - "@ethereum-waffle/compiler" "^3.2.0" - "@ethereum-waffle/mock-contract" "^3.2.0" - "@ethereum-waffle/provider" "^3.2.0" + "@ethereum-waffle/chai" "^3.2.1" + "@ethereum-waffle/compiler" "^3.2.1" + "@ethereum-waffle/mock-contract" "^3.2.1" + "@ethereum-waffle/provider" "^3.2.1" ethers "^5.0.1" ethereumjs-abi@0.6.5: