# Hardhat Guide: How to Interact With Aave Using a Forked Mainnet
In this guide we will use Hardhat to fork the Ethereum main network. We will then use the forked version to interact with Aave smart contracts to:
- deposit DAI into the AAVE mainnet lending pool (on our forked version provided to us by Hardhat)
- actually test to make sure that interest accrues successfully
This guide will cover:
- how to impersonate an account on the main network
- how to use Hardhat helper methods for testing on a forked network
## Guide Requirements
- **[Hardhat](https://hardhat.org/)**: Hardhat is an Ethereum development platform that provides all the tools needed to build, debug and deploy smart contracts.
- **[Alchemy](https://www.alchemy.com/)**: Alchemy is a blockchain development platform from which we will use some APIs to help query the Ethereum blockchain.
## Step 1: Clone and Set Up the AAVE-DAI Escrow Repo
1. In a directory of your chocie, run `git clone git@github.com:ChainShot/AAVEDaiEscrow.git`
2. `cd` into the cloned repo and run `npm init -y`
3. Run `npm install`
4. Run `npm install dotenv hardhat chai ethers`
5. Run `touch .env`
6. In your `.env` file, copy-paste an Alchemy **mainnet** key as a variable called `FORKING_URL`
7. Open the `hardhat.config.js` file and copy-paste the following:
```javascript
require("@nomiclabs/hardhat-waffle");
require('dotenv').config();
module.exports = {
solidity: "0.7.5",
networks: {
hardhat: {
forking: {
url: process.env.FORKING_URL,
blockNumber: 11395144
}
}
},
paths: {
artifacts: "./app/artifacts",
}
};
```
> Notice the `FORKING_URL` is used in the `hardhat.config.js` file!
## Step 2: Create Test: Impersonate Account to Acquire DAI
Since we are looking to test that our `Escrow.sol` contract is able to deposit DAI into the AAVE lending pool, we need some DAI!
Let's use the `hardhat_impersonateAccount` helper function to use an account that has DAI in our forked version of the blockchain.
We are working with a blockchain forked at block #11395144 (check the `hardhat.config.js` to see this!). So we need any EOA that had some DAI during that block.
Here is one: https://etherscan.io/address/0x47ac0Fb4F2D84898e4D9E7b4DaB3C24507a6D503 - this person has $191,000,000+ DAI woah! Let's impersonate them :)
Now, let's add our first test. You will see a `test.js` file already in there, we will use it for reference as we build out more specific tests!
1. In your `test` folder, run `touch testDeposit.js`
2. In the `testDeposit.js`, copy-paste the following:
```javascript
const { assert } = require("chai");
const { network } = require("hardhat");
const poolAddress = "0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9";
const aDaiAddress = "0x028171bCA77440897B824Ca71D1c56caC55b68A3";
const daiAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F";
describe("Escrow", function () {
let signer0, address0, daiContract;
let daiAmount = ethers.utils.parseEther("1000");
let depositorAddr = "0x47ac0Fb4F2D84898e4D9E7b4DaB3C24507a6D503";
before(async () => {
await hre.network.provider.request({
method: "hardhat_impersonateAccount",
params: [depositorAddr]
});
await network.provider.send("hardhat_setBalance", [
depositorAddr,
"0x56bc75e2d63100000"
]);
let richGuySigner = await ethers.provider.getSigner(depositorAddr);
daiContract = await ethers.getContractAt("IERC20", daiAddress);
signer0 = await ethers.provider.getSigner(0);
address0 = await signer0.getAddress();
daiContract.connect(richGuySigner).transfer(address0, daiAmount);
});
it("should hold dai in our account", async function () {
const balance = await daiContract.balanceOf(address0);
assert.equal(daiAmount.toString(), balance.toString());
});
});
```
> Notice we are using the helper methods from Hardhat? Check out the [Hardhat Helper Methods](https://hardhat.org/hardhat-network/reference/#hardhat-network-methods).
3. Save the file.
4. Run `npx hardhat test` in order to run your tests using the forked mainnet!
## Step 3: Create Test: Deposit DAI to (Forked) Main Network Lending Pool
1. Add the following `describe` scope to your file:
```javascript
```