test: _cast

This commit is contained in:
gitpusha 2020-11-25 11:50:24 +01:00 committed by Twin Fish
parent 8c7ac0ed3c
commit 673dada3bb
25 changed files with 393 additions and 111 deletions

12
.example.env Normal file
View File

@ -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=""

View File

@ -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;

View File

@ -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()
// );
}
}

View File

@ -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();

View File

@ -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,
});
}

View File

@ -75,7 +75,7 @@ module.exports = {
{
version: "0.6.0",
settings: {
optimizer: { enabled: process.env.DEBUG ? false : true },
optimizer: { enabled: false },
},
},
{

View File

@ -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",

View File

@ -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,

View File

@ -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,

View File

@ -1,6 +0,0 @@
module.exports = async () => {
return {
PREMIUM: 20,
VAULT_CREATION_COST: 100000,
};
};

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,4 @@
module.exports = {
PREMIUM: 20,
VAULT_CREATION_COST: 100000,
};

View File

@ -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;
};

View File

@ -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 () {

View File

@ -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;
});
});

View File

@ -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);

View File

@ -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: