diff --git a/contracts/constants/CDebtBridge.sol b/contracts/constants/CDebtBridge.sol index 4cf271a..bdccd1c 100644 --- a/contracts/constants/CDebtBridge.sol +++ b/contracts/constants/CDebtBridge.sol @@ -4,3 +4,6 @@ pragma solidity 0.7.4; function GAS_COSTS_FOR_FULL_REFINANCE() pure returns (uint256[4] memory) { return [uint256(2519000), 3140500, 3971000, 4345000]; } + +uint256 constant VAT = 20; +uint256 constant VAULT_CREATION_COST = 100000; diff --git a/contracts/functions/gelato/FGelatoDebtBridge.sol b/contracts/functions/gelato/FGelatoDebtBridge.sol index 7deefa3..6d5e201 100644 --- a/contracts/functions/gelato/FGelatoDebtBridge.sol +++ b/contracts/functions/gelato/FGelatoDebtBridge.sol @@ -2,12 +2,16 @@ pragma solidity 0.7.4; pragma experimental ABIEncoderV2; -import {add, sub, wmul, wdiv} from "../../vendor/DSMath.sol"; +import {add, sub, mul, wmul, wdiv} from "../../vendor/DSMath.sol"; import { INSTA_POOL_RESOLVER, ROUTE_1_TOLERANCE } from "../../constants/CInstaDapp.sol"; -import {GAS_COSTS_FOR_FULL_REFINANCE} from "../../constants/CDebtBridge.sol"; +import { + GAS_COSTS_FOR_FULL_REFINANCE, + VAT, + VAULT_CREATION_COST +} from "../../constants/CDebtBridge.sol"; import { IInstaPoolResolver } from "../../interfaces/InstaDapp/resolvers/IInstaPoolResolver.sol"; @@ -77,14 +81,23 @@ function _getGasCostMakerToMaker(bool _newVault, uint256 _route) { _checkRouteIndex(_route); return - _newVault - ? add(GAS_COSTS_FOR_FULL_REFINANCE()[_route], 0) - : GAS_COSTS_FOR_FULL_REFINANCE()[_route]; + _getGasCostVAT( + _newVault + ? add( + GAS_COSTS_FOR_FULL_REFINANCE()[_route], + VAULT_CREATION_COST + ) + : GAS_COSTS_FOR_FULL_REFINANCE()[_route] + ); } function _getGasCostMakerToCompound(uint256 _route) pure returns (uint256) { _checkRouteIndex(_route); - return GAS_COSTS_FOR_FULL_REFINANCE()[_route]; + return _getGasCostVAT(GAS_COSTS_FOR_FULL_REFINANCE()[_route]); +} + +function _getGasCostVAT(uint256 _rawGasCost) pure returns (uint256) { + return mul(_rawGasCost, add(100, VAT)) / 100; } function _getRealisedDebt(uint256 _debtToMove) pure returns (uint256) { diff --git a/test/helpers/constants/GasConstant.js b/test/helpers/constants/GasConstant.js new file mode 100644 index 0000000..83a0412 --- /dev/null +++ b/test/helpers/constants/GasConstant.js @@ -0,0 +1,6 @@ +module.exports = async () => { + return { + VAT: 20, + VAULT_CREATION_COST: 100000, + }; +}; diff --git a/test/helpers/services/gelato/getGasCostForFullRefinance.js b/test/helpers/services/gelato/getGasCostForFullRefinance.js new file mode 100644 index 0000000..8d5562e --- /dev/null +++ b/test/helpers/services/gelato/getGasCostForFullRefinance.js @@ -0,0 +1,26 @@ +const gasConstants = require("../../constants/GasConstant"); + +module.exports = async function (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 + break; + case 1: + rawGasCost = 3140500; // 2855000 * 1,1 // gas left method measure : 2855000 - 2667325 = 187675 | gas reporter : 2855000 - 2244814 = 610186 + break; + case 2: + rawGasCost = 3971000; // 3610000 * 1,1 // gas left method measure : 3610000 - 3423279 = 186721 | gas reporter : 3610000 - 3031103 = 578897 + break; + case 3: + rawGasCost = 4345000; // 3950000 * 1,1 // gas left method measure : 3950000 - 3764004 = 185996 | gas reporter : 3950000 - 3313916 = 636084 + break; + default: + break; + } + + return withVaultCreation + ? ((rawGasCost + gasCons.VAULT_CREATION_COST) * (100 + gasCons.VAT)) / 100 + : (rawGasCost * (100 + gasCons.VAT)) / 100; +}; diff --git a/test/integration/debt_bridge/from_maker/full/0_To-Compound.test.js b/test/integration/debt_bridge/from_maker/full/0_To-Compound.test.js index 4d0b2bf..646acf4 100644 --- a/test/integration/debt_bridge/from_maker/full/0_To-Compound.test.js +++ b/test/integration/debt_bridge/from_maker/full/0_To-Compound.test.js @@ -6,7 +6,7 @@ const GelatoCoreLib = require("@gelatonetwork/core"); const setupFullRefinanceMakerToCompound = require("./helpers/setupFullRefinanceMakerToCompound"); const getInstaPoolV2Route = require("../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); -const getGasCostForFullRefinance = require("./helpers/services/getGasCostForFullRefinance"); +const getGasCostForFullRefinance = require("../../../../helpers/services/gelato/getGasCostForFullRefinance"); // This test showcases how to submit a task refinancing a Users debt position from // Maker to Compound using Gelato 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/1_ETHA-ETHB-With-Vault-Creation.test.js index 48728db..a5cc9f3 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/1_ETHA-ETHB-With-Vault-Creation.test.js @@ -5,7 +5,7 @@ const GelatoCoreLib = require("@gelatonetwork/core"); const setupFullRefinanceMakerToMakerWithVaultBCreation = require("./helpers/setupFullRefinanceMakerToMakerWithVaultBCreation"); const getInstaPoolV2Route = require("../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); -const getGasCostForFullRefinance = require("./helpers/services/getGasCostForFullRefinance"); +const getGasCostForFullRefinance = require("./../../../../helpers/services/gelato/getGasCostForFullRefinance"); // This test showcases how to submit a task refinancing a Users debt position from // Maker to Compound using Gelato @@ -223,7 +223,7 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B with vault creat ); } - const gasCost = await getGasCostForFullRefinance(route); + const gasCost = await getGasCostForFullRefinance(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/2_ETHA-ETHB.test.js index b00fbf2..4d47bcf 100644 --- a/test/integration/debt_bridge/from_maker/full/2_ETHA-ETHB.test.js +++ b/test/integration/debt_bridge/from_maker/full/2_ETHA-ETHB.test.js @@ -5,7 +5,7 @@ const GelatoCoreLib = require("@gelatonetwork/core"); const setupFullRefinanceMakerToMaker = require("./helpers/setupFullRefinanceMakerToMaker"); const getInstaPoolV2Route = require("../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); -const getGasCostForFullRefinance = require("./helpers/services/getGasCostForFullRefinance"); +const getGasCostForFullRefinance = require("../../../../helpers/services/gelato/getGasCostForFullRefinance"); // This test showcases how to submit a task refinancing a Users debt position from // Maker to Compound using Gelato 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/3_ETHA-ETHB-With-Vault-Closing.test.js index 3925c44..a05e62f 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/3_ETHA-ETHB-With-Vault-Closing.test.js @@ -5,7 +5,7 @@ const GelatoCoreLib = require("@gelatonetwork/core"); const setupFullRefinanceMakerToMaker = require("./helpers/setupFullRefinanceMakerToMaker"); const getInstaPoolV2Route = require("../../../../helpers/services/InstaDapp/getInstaPoolV2Route"); -const getGasCostForFullRefinance = require("./helpers/services/getGasCostForFullRefinance"); +const getGasCostForFullRefinance = require("../../../../helpers/services/gelato/getGasCostForFullRefinance"); // This test showcases how to submit a task refinancing a Users debt position from // Maker to Compound using Gelato @@ -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); + const gasCost = await getGasCostForFullRefinance(route, true); const gasFeesPaidFromCol = ethers.BigNumber.from(gasCost).mul( gelatoGasPrice diff --git a/test/integration/debt_bridge/from_maker/full/helpers/services/getGasCostForFullRefinance.js b/test/integration/debt_bridge/from_maker/full/helpers/services/getGasCostForFullRefinance.js deleted file mode 100644 index 15a6106..0000000 --- a/test/integration/debt_bridge/from_maker/full/helpers/services/getGasCostForFullRefinance.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = async function (route) { - switch (route) { - case 0: - return 2519000; // 2290000 * 1,1 // gas left method measure : 2290000 - 2106637 = 183363 | gas reporter : 2290000 - 1789126 = 500874 - case 1: - return 3140500; // 2855000 * 1,1 // gas left method measure : 2855000 - 2667325 = 187675 | gas reporter : 2855000 - 2244814 = 610186 - case 2: - return 3971000; // 3610000 * 1,1 // gas left method measure : 3610000 - 3423279 = 186721 | gas reporter : 3610000 - 3031103 = 578897 - case 3: - return 4345000; // 3950000 * 1,1 // gas left method measure : 3950000 - 3764004 = 185996 | gas reporter : 3950000 - 3313916 = 636084 - default: - break; - } -}; diff --git a/test/unit/functions/0_FGelatoDebtBridge.test.js b/test/unit/functions/0_FGelatoDebtBridge.test.js index 57c1e2f..097e0ac 100644 --- a/test/unit/functions/0_FGelatoDebtBridge.test.js +++ b/test/unit/functions/0_FGelatoDebtBridge.test.js @@ -3,6 +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 DAI = hre.network.config.DAI; describe("FGelatoDebtBridge Unit Tests", function () { @@ -74,52 +75,60 @@ describe("FGelatoDebtBridge Unit Tests", function () { ).to.be.revertedWith("FGelatoDebtBridge._getFlashLoanRoute: illiquid"); }); - it("getGasCostMakerToMaker should return 2519000 gas limit for route 0 (Dydx) and new vault", async function () { + it("getGasCostMakerToMaker should return 3142800 gas limit for route 0 (Dydx) and new vault", async function () { + const expectedGasCost = await getGasCostForFullRefinance(0, true); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(true, 0) - ).to.be.equal(2519000); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToMaker should return 2519000 gas limit for route 0 (Dydx)", async function () { + it("getGasCostMakerToMaker should return 3022800 gas limit for route 0 (Dydx)", async function () { + const expectedGasCost = await getGasCostForFullRefinance(0); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(false, 0) - ).to.be.equal(2519000); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToMaker should return 3140500 gas limit for route 1 (maker) and new vault", async function () { + it("getGasCostMakerToMaker should return 3888600 gas limit for route 1 (maker) and new vault", async function () { + const expectedGasCost = await getGasCostForFullRefinance(1, true); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(true, 1) - ).to.be.equal(3140500); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToMaker should return 3140500 gas limit for route 1 (maker)", async function () { + it("getGasCostMakerToMaker should return 3768600 gas limit for route 1 (maker)", async function () { + const expectedGasCost = await getGasCostForFullRefinance(1); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(false, 1) - ).to.be.equal(3140500); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToMaker should return 3971000 gas limit for route 2 (compound) and new vault", async function () { + it("getGasCostMakerToMaker should return 4885200 gas limit for route 2 (compound) and new vault", async function () { + const expectedGasCost = await getGasCostForFullRefinance(2, true); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(true, 2) - ).to.be.equal(3971000); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToMaker should return 3971000 gas limit for route 2 (compound)", async function () { + it("getGasCostMakerToMaker should return 4765200 gas limit for route 2 (compound)", async function () { + const expectedGasCost = await getGasCostForFullRefinance(2); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(false, 2) - ).to.be.equal(3971000); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToMaker should return 4345000 gas limit for route 3 (aave) and new vault", async function () { + it("getGasCostMakerToMaker should return 5334000 gas limit for route 3 (aave) and new vault", async function () { + const expectedGasCost = await getGasCostForFullRefinance(3, true); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(true, 3) - ).to.be.equal(4345000); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToMaker should return 4345000 gas limit for route 3 (aave)", async function () { + it("getGasCostMakerToMaker should return 5214000 gas limit for route 3 (aave)", async function () { + const expectedGasCost = await getGasCostForFullRefinance(3); expect( await fGelatoDebtBridgeMock.getGasCostMakerToMaker(false, 3) - ).to.be.equal(4345000); + ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToMaker should revert with invalid route index when the inputed route exceed 4", async function () { @@ -130,28 +139,32 @@ describe("FGelatoDebtBridge Unit Tests", function () { ); }); - it("getGasCostMakerToCompound should return 2519000 gas limit for route 0 (Dydx)", async function () { + it("getGasCostMakerToCompound should return 3022800 gas limit for route 0 (Dydx)", async function () { + const expectedGasCost = await getGasCostForFullRefinance(0); expect( await fGelatoDebtBridgeMock.getGasCostMakerToCompound(0) - ).to.be.equal(2519000); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToCompound should return 3140500 gas limit for route 1 (Maker)", async function () { + it("getGasCostMakerToCompound should return 3768600 gas limit for route 1 (Maker)", async function () { + const expectedGasCost = await getGasCostForFullRefinance(1); expect( await fGelatoDebtBridgeMock.getGasCostMakerToCompound(1) - ).to.be.equal(3140500); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToCompound should return 3971000 gas limit for route 2 (Compound)", async function () { + it("getGasCostMakerToCompound should return 4765200 gas limit for route 2 (Compound)", async function () { + const expectedGasCost = await getGasCostForFullRefinance(2); expect( await fGelatoDebtBridgeMock.getGasCostMakerToCompound(2) - ).to.be.equal(3971000); + ).to.be.equal(expectedGasCost); }); - it("getGasCostMakerToCompound should return 4345000 gas limit for route 3 (Aave)", async function () { + it("getGasCostMakerToCompound should return 5214000 gas limit for route 3 (Aave)", async function () { + const expectedGasCost = await getGasCostForFullRefinance(3); expect( await fGelatoDebtBridgeMock.getGasCostMakerToCompound(3) - ).to.be.equal(4345000); + ).to.be.equal(expectedGasCost); }); it("getGasCostMakerToCompound should revert with invalid route index when the inputed route exceed 4", async function () {