mirror of
https://github.com/Instadapp/Gelato-automations.git
synced 2024-07-29 22:28:07 +00:00
progress save
This commit is contained in:
parent
e33a622fa8
commit
7ce48fd5ea
|
@ -33,6 +33,7 @@ module.exports = {
|
||||||
ConnectCompound: "0x07F81230d73a78f63F0c2A3403AD281b067d28F8",
|
ConnectCompound: "0x07F81230d73a78f63F0c2A3403AD281b067d28F8",
|
||||||
DAI: "0x6b175474e89094c44da98b954eedeac495271d0f",
|
DAI: "0x6b175474e89094c44da98b954eedeac495271d0f",
|
||||||
DAI_UNISWAP: "0x2a1530C4C41db0B0b2bB646CB5Eb1A67b7158667",
|
DAI_UNISWAP: "0x2a1530C4C41db0B0b2bB646CB5Eb1A67b7158667",
|
||||||
|
CDAI: "0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
solc: {
|
solc: {
|
||||||
|
|
|
@ -7,7 +7,10 @@ contract MockCDAI {
|
||||||
// CDAI uses supplyRatePerBlock with 10**18 precision
|
// CDAI uses supplyRatePerBlock with 10**18 precision
|
||||||
// Because MakerDAO dsr is rate per second with 10**27 precision,
|
// Because MakerDAO dsr is rate per second with 10**27 precision,
|
||||||
// we also adopt this for CDAI.
|
// we also adopt this for CDAI.
|
||||||
uint256 public supplyRatePerSecond = 1000000000627937192491029810; // per second==2% annually
|
//uint256 public supplyRatePerSecond = 1000000000627937192491029810; // per second==2% annually
|
||||||
|
|
||||||
|
uint256 public supplyRatePerSecond;
|
||||||
|
constructor(uint256 _sRPS) public { supplyRatePerSecond = _sRPS; }
|
||||||
|
|
||||||
/// @dev Use this during tests to simulate changing CDAI.supplyRatePerBlock conditions
|
/// @dev Use this during tests to simulate changing CDAI.supplyRatePerBlock conditions
|
||||||
/// @param _rate CDAI.supplyRatePerBlock but in seconds and 10**27 precision
|
/// @param _rate CDAI.supplyRatePerBlock but in seconds and 10**27 precision
|
||||||
|
|
|
@ -9,7 +9,10 @@ contract MockDSR {
|
||||||
// - can be set by Maker governance on the Pot contract in the RatesModule.
|
// - can be set by Maker governance on the Pot contract in the RatesModule.
|
||||||
// - returns annual percentage value as 10**27 [ray]
|
// - returns annual percentage value as 10**27 [ray]
|
||||||
// - e.g. dsr=1000000000627937192491029810 == 2 % annually
|
// - e.g. dsr=1000000000627937192491029810 == 2 % annually
|
||||||
uint256 public dsr = 1000000000627937192491029810; // per second==2% annually
|
/// uint256 public dsr = 1000000000627937192491029810; // per second==2% annually
|
||||||
|
|
||||||
|
uint256 public dsr;
|
||||||
|
constructor(uint256 _dsr) public { dsr = _dsr; }
|
||||||
|
|
||||||
/// @dev Use this during tests to simulate changing DSR conditions
|
/// @dev Use this during tests to simulate changing DSR conditions
|
||||||
/// @param _dsr The dsr to set.
|
/// @param _dsr The dsr to set.
|
||||||
|
|
|
@ -145,11 +145,12 @@ describe("Move DAI lending from DSR to Compound", function () {
|
||||||
|
|
||||||
// Deploy Mocks for Testing
|
// Deploy Mocks for Testing
|
||||||
const MockCDAI = await ethers.getContractFactory("MockCDAI");
|
const MockCDAI = await ethers.getContractFactory("MockCDAI");
|
||||||
mockCDAI = await MockCDAI.deploy();
|
mockCDAI = await MockCDAI.deploy(APY_2_PERCENT_IN_SECONDS);
|
||||||
await providerModuleDSA.deployed();
|
await providerModuleDSA.deployed();
|
||||||
|
|
||||||
const MockDSR = await ethers.getContractFactory("MockDSR");
|
const MockDSR = await ethers.getContractFactory("MockDSR");
|
||||||
mockDSR = await MockDSR.deploy();
|
mockDSR = await MockDSR.deploy(APY_2_PERCENT_IN_SECONDS);
|
||||||
|
await mockDSR.deployed();
|
||||||
|
|
||||||
// Deploy Gelato Conditions for Testing
|
// Deploy Gelato Conditions for Testing
|
||||||
const ConditionCompareUintsFromTwoSources = await ethers.getContractFactory(
|
const ConditionCompareUintsFromTwoSources = await ethers.getContractFactory(
|
||||||
|
@ -207,7 +208,7 @@ describe("Move DAI lending from DSR to Compound", function () {
|
||||||
// ======= Condition setup ======
|
// ======= Condition setup ======
|
||||||
// We instantiate the Rebalance Condition:
|
// We instantiate the Rebalance Condition:
|
||||||
// Compound APY needs to be 10000000 per second points higher than DSR
|
// Compound APY needs to be 10000000 per second points higher than DSR
|
||||||
const MIN_SPREAD = 10000000;
|
const MIN_SPREAD = "10000000";
|
||||||
const rebalanceCondition = new GelatoCoreLib.Condition({
|
const rebalanceCondition = new GelatoCoreLib.Condition({
|
||||||
inst: conditionCompareUints.address,
|
inst: conditionCompareUints.address,
|
||||||
data: await conditionCompareUints.getConditionData(
|
data: await conditionCompareUints.getConditionData(
|
||||||
|
@ -321,6 +322,9 @@ describe("Move DAI lending from DSR to Compound", function () {
|
||||||
expect(await gelatoCore.providerFunds(dsa.address)).to.be.gte(
|
expect(await gelatoCore.providerFunds(dsa.address)).to.be.gte(
|
||||||
TASK_AUTOMATION_FUNDS
|
TASK_AUTOMATION_FUNDS
|
||||||
);
|
);
|
||||||
|
expect(
|
||||||
|
await gelatoCore.isProviderLiquid(dsa.address, GAS_LIMIT, GAS_PRICE_CEIL)
|
||||||
|
);
|
||||||
expect(await gelatoCore.executorByProvider(dsa.address)).to.be.equal(
|
expect(await gelatoCore.executorByProvider(dsa.address)).to.be.equal(
|
||||||
userAddress
|
userAddress
|
||||||
);
|
);
|
||||||
|
@ -328,6 +332,79 @@ describe("Move DAI lending from DSR to Compound", function () {
|
||||||
await gelatoCore.isModuleProvided(dsa.address, providerModuleDSA.address)
|
await gelatoCore.isModuleProvided(dsa.address, providerModuleDSA.address)
|
||||||
).to.be.true;
|
).to.be.true;
|
||||||
|
|
||||||
// ======= TASK SUBMISSION =========
|
// ======= 📣 TASK SUBMISSION 📣 =========
|
||||||
|
// In Gelato world our DSA is the User. So we must submit the Task
|
||||||
|
// to Gelato via our DSA and hence use ConnectGelato again.
|
||||||
|
const expiryDate = 0;
|
||||||
|
await expect(
|
||||||
|
dsa.cast(
|
||||||
|
[connectGelato.address], // targets
|
||||||
|
[
|
||||||
|
await bre.run("abi-encode-withselector", {
|
||||||
|
abi: require("../artifacts/ConnectGelato.json").abi,
|
||||||
|
functionname: "submitTask",
|
||||||
|
inputs: [
|
||||||
|
gelatoSelfProvider,
|
||||||
|
taskRebalanceDSRToCDAIifBetter,
|
||||||
|
expiryDate,
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
], // datas
|
||||||
|
userAddress, // origin
|
||||||
|
{
|
||||||
|
gasLimit: 5000000,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
).to.emit(gelatoCore, "LogTaskSubmitted");
|
||||||
|
|
||||||
|
// Task Receipt: a successfully submitted Task in Gelato
|
||||||
|
// is wrapped in a TaskReceipt. For testing we instantiate the TaskReceipt
|
||||||
|
// for our to be submitted Task.
|
||||||
|
const taskReceiptId = await gelatoCore.currentTaskReceiptId();
|
||||||
|
const taskReceipt = new GelatoCoreLib.TaskReceipt({
|
||||||
|
id: taskReceiptId,
|
||||||
|
userProxy: dsa.address,
|
||||||
|
provider: gelatoSelfProvider,
|
||||||
|
tasks: [taskRebalanceDSRToCDAIifBetter],
|
||||||
|
expiryDate,
|
||||||
|
});
|
||||||
|
|
||||||
|
// ======= 📣 TASK EXECUTION 📣 =========
|
||||||
|
// This stuff is normally automated by the Gelato Network and Dapp Developers
|
||||||
|
// and their Users don't have to take care of it. However, for local testing
|
||||||
|
// we simulate the Gelato Execution logic.
|
||||||
|
|
||||||
|
// Let's first check if our Task is executable. Since both MockDSR and MockCDAI
|
||||||
|
// start with a normalized per second rate of APY_2_PERCENT_IN_SECONDS
|
||||||
|
// (1000000000627937192491029810 in 10**27 precision) in both of them
|
||||||
|
expect(
|
||||||
|
await gelatoCore.canExec(taskReceipt, GAS_LIMIT, GAS_PRICE_CEIL)
|
||||||
|
).to.be.equal("ConditionNotOk:ANotGreaterOrEqualToBbyMinspread");
|
||||||
|
|
||||||
|
// We defined a MIN_SPREAD of 10000000 points in the per second rate
|
||||||
|
// for our ConditionCompareUintsFromTwoSources. So we now
|
||||||
|
// set the CDAI.supplyRatePerSecond to be 10000000 higher than MockDSR.dsr
|
||||||
|
// and expect it to mean that our Task becomes executable.
|
||||||
|
await mockCDAI.setSupplyRatePerSecond(
|
||||||
|
(await mockDSR.dsr()).add(MIN_SPREAD)
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
await gelatoCore.canExec(taskReceipt, GAS_LIMIT, GAS_PRICE_CEIL)
|
||||||
|
).to.be.equal("OK");
|
||||||
|
|
||||||
|
// To verify whether the execution of DSR=>CDAI has been successful in this Testing
|
||||||
|
// we look at changes in the CDAI balance of the DSA
|
||||||
|
const cDAI = await ethers.getContractAt(
|
||||||
|
IERC20.abi,
|
||||||
|
bre.network.config.CDAI
|
||||||
|
);
|
||||||
|
const dsaCDAIBefore = await cDAI.balanceOf(dsa.address);
|
||||||
|
|
||||||
|
// For testing we now simulate automatic Task Execution ❗
|
||||||
|
await expect(gelatoCore.exec(taskReceipt)).to.emit("LogExecSuccess");
|
||||||
|
|
||||||
|
// Since the Execution was successful, we now expect our DSA to hold more
|
||||||
|
// CDAI then before. This concludes our testing.
|
||||||
|
expect(await cDAI.balanceOf(dsa.address)).to.be.gt(dsaCDAIBefore);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user