PatrickAlphaC / hardhat-fund-me-fcc

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

"before each" hook for "sets the aggregator addresses correctly": TypeError: (0 , ethers_1.getAddress) is not a function

kartik01112004 opened this issue · comments

I am getting TypeError: (0 , ethers_1.getAddress) is not a function when i run yarn hardhat test on the first part of unit testing

here is FundMe.tets.js

const { assert } = require("chai")
const { deployments, ethers, getNamedAccounts } = require("hardhat")

describe("FundMe", async function () {
    let fundMe
    let deployer
    let mockV3Aggregator
    beforeEach(async function () {
        //depoying all contracts using fixture

        deployer = (await getNamedAccounts()).deployer
        await deployments.fixture(["all"])
        fundMe = await ethers.getContractAt("FundMe", deployer)
        mockV3Aggregator = await ethers.getContractAt(
            "MockV3Aggregator",
            deployer,
        )
    })
    describe("constructor", function () {
        it("sets the aggregator addresses correctly", async () => {
            const response = await fundMe.getPriceFeed()
            assert.equal(response, mockV3Aggregator.target)
        })
    })
})

here is 01-deploy-fund-me.js

// function deployFunc() {
//     console.log("hello")
// }

const { network } = require("hardhat")
const { verify } = require("../utils/verify")
// module.exports.default = deployFunc

// module.exports = async (hre) => {
//     const { getNamedAccounts, deployments } = hre
//same thing!

const { networkConfig, developmentChains } = require("../helper-hardhat-config")
// const {helperConfig}= require("../helper-hardhat-config")

//adding pricefeeds as per the network we are on

module.exports = async ({ getNamedAccounts, deployments }) => {
    const { deploy, log } = deployments
    const { deployer } = await getNamedAccounts()
    const chainId = network.config.chainId

    // const ethUsdPriceFeedAddress =
    //     networkConfig(chainId)["ethUsdPriceFeedAddress"]
    let ethUsdPriceFeedAddress
    if (developmentChains.includes(network.name)) {
        const ethUsdAggregator = await deployments.get("MockV3Aggregator")
        ethUsdPriceFeedAddress = ethUsdAggregator.address
    } else {
        ethUsdPriceFeedAddress =
            networkConfig[chainId]["ethUsdPriceFeedAddress"]
    }
    const args = [ethUsdPriceFeedAddress]
    const fundMe = await deploy("FundMe", {
        from: deployer,
        args: args,
        log: true,
        waitConfermations: network.config.blockConfirmations || 1,
    })
    if (
        !developmentChains.includes(network.name) &&
        process.env.ETHERSCAN_API_KEY
    ) {
        await verify(fundMe.address, args)
    }

    log("----------------------------------------------------------")
}

module.exports.tags = ["all", "fundme"]

here is FundM.sol

// SPDX-License-Identifier: MIT
//pragma
pragma solidity ^0.8.7;

import "./PriceConverter.sol";

//we wanna widhraw funds
//we wanna get funds
//say a minimun funding value in USD

// constant, immutable === using them saves gas
//after using constant 944,608 gas, before using constant 966,825 gas

//error codes
error FundMe__NotOwner();

// interfaces, libraries, contracts

/** @title A contract for crowd funding
 * @author Kartik Goel
 * @notice it is to demo a sample funding contract
 * @dev implimets pricefeeds as our library
 */
contract FundMe {
    //type declarations
    using PriceConverter for uint256;

    address[] public funders;
    mapping(address => uint256) public addressToAmountFunded;
    uint256 public constant MINIMUM_USD = 50 * 1e18;

    address public immutable i_owner;
    AggregatorV3Interface public priceFeed;

    modifier onlyOwner() {
        //require(msg.sender==i_owner,"sender is not owner");
        if (msg.sender != i_owner) {
            revert FundMe__NotOwner();
        }
        _; //do rest of the code present in the function that uses it
    }

    constructor(address priceFeedAddress) {
        i_owner = msg.sender;
        priceFeed = AggregatorV3Interface(priceFeedAddress);
    }

    receive() external payable {
        fund();
    }

    fallback() external payable {
        fund();
    }

    /// @notice Funds our contract based on the ETH/USD price
    function fund() public payable {
        //we wanna be able to set a minimum fund amount in USD
        //after this lesson try to make in rupees
        //1. how do we send ETH to this contract?
        require(
            msg.value.getConversionRate(priceFeed) >= MINIMUM_USD,
            "didnt send enough"
        ); // 1e18 == 1* 10**18 wei or 1 ETH
        //18 decimals
        funders.push(msg.sender);
        addressToAmountFunded[msg.sender] += msg.value;
        //what is reverting?
        //Undo any action before,and send remaining gas back
    }

    function withdraw() public onlyOwner {
        //require( msg.sender==owner,"sender is ot owner"); //this makes the withraw function only accessible to the owner but there is a better way
        for (
            uint256 funderIndex = 0;
            funderIndex < funders.length;
            funderIndex = funderIndex + 1
        ) {
            address funder = funders[funderIndex];
            addressToAmountFunded[funder] = 0;
        }
        funders = new address[](0); //resets the array

        // actually withraw the funds

        //transfer
        //msg.sender= address type
        //payable(msg.sender) = paybale address type. Transfer only works with payable address
        //payable(msg.sender).transfer(address(this).balance);

        //send
        //bool sendSuccess= payable (msg.sender).send(address(this).balance);
        //require(sendSuccess, "send failed");

        //call
        (bool callSuccess, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(callSuccess, "call failed");
    }
}

here is packge.json

{
    "name": "hardhat-fund-me",
    "version": "1.0.0",
    "license": "MIT",
    "devDependencies": {
        "@chainlink/contracts": "^0.3.1",
        "@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
        "@nomicfoundation/hardhat-ethers": "^3.0.0",
        "@nomicfoundation/hardhat-network-helpers": "^1.0.0",
        "@nomicfoundation/hardhat-toolbox": "^3.0.0",
        "@nomicfoundation/hardhat-verify": "^1.0.0",
        "@nomiclabs/hardhat-ethers": "^2.2.3",
        "@nomiclabs/hardhat-waffle": "^2.0.6",
        "@typechain/ethers-v6": "^0.4.0",
        "@typechain/hardhat": "^8.0.0",
        "@types/mocha": ">=9.1.0",
        "@types/sinon-chai": "^3.2.3",
        "chai": "^4.3.4",
        "dotenv": "^16.3.1",
        "ethereum-waffle": "^3.4.0",
        "ethers": "^5.7.2",
        "hardhat": "^2.17.4",
        "hardhat-deploy": "^0.11.37",
        "hardhat-gas-reporter": "^1.0.9",
        "prettier": "^3.0.2",
        "prettier-plugin-solidity": "^1.1.3",
        "solidity-coverage": "^0.8.5",
        "ts-node": ">=8.0.0",
        "typechain": "^8.1.0",
        "typescript": ">=4.5.0",
        "solhint": "^3.6.2"
    }
}

here is hardhat.config.js

require("@nomicfoundation/hardhat-toolbox")
require("hardhat-deploy")
require("hardhat-gas-reporter")
require("dotenv").config()
require("solidity-coverage")

/** @type import('hardhat/config').HardhatUserConfig */
const COINMARKETCAP_API_KEY = process.env.COINMARKETCAP_API_KEY || ""
const SEPOLIA_RPC_URL =
    process.env.SEPOLIA_RPC_URL ||
    "https://eth-sepolia.g.alchemy.com/v2/3FoXafsGZG26BuLiWnplFRIkKv71Chf2"
const PRIVATE_KEY =
    process.env.PRIVATE_KEY ||
    "0x11ee3108a03081fe260ecdc106554d09d9d1209bcafd46942b10e02943effc4a"
const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY || ""

module.exports = {
    defaultNetwork: "hardhat",
    networks: {
        hardhat: {
            chainId: 31337,
            // gasPrice: 130000000000,
        },
        sepolia: {
            url: SEPOLIA_RPC_URL,
            accounts: [PRIVATE_KEY],
            chainId: 11155111,
            blockConfirmations: 6, // teling how many block we wanna wait
        },
    },
    solidity: {
        compilers: [
            {
                version: "0.8.7",
            },
            {
                version: "0.6.6",
            },
        ],
    },
    etherscan: {
        apiKey: ETHERSCAN_API_KEY,
        // customChains: [], // uncomment this line if you are getting a TypeError: customChains is not iterable
    },
    gasReporter: {
        enabled: true,
        currency: "USD",
        outputFile: "gas-report.txt",
        noColors: true,
        coinmarketcap: COINMARKETCAP_API_KEY,
    },
    namedAccounts: {
        deployer: {
            default: 0, // here this will by default take the first account as deployer
            1: 0, // similarly on mainnet it will take the first account as deployer.
            //Note though that depending on how hardhat network are configured, the account 0 on one network can be different than on another
        },
    },
}

the error comes when i write the 1st it block...
i have tried my best to resolve this error by using repo and by using stackexchange and stackoverflow ..

can anyone assist me??

for hardhat version above 2.15.0 install these dependencies and it must work fine then

yarn add --dev hardhat @nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers ethers

for hardhat version above 2.15.0 install these dependencies and it must work fine then

yarn add --dev hardhat @nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers ethers

TypeError: fundMe.getPriceFeed is not a function
error continuous to exists

I think, firstly you are using, getContractAt() function rather than getContract, the difference could be:
getContract: (name: string, signer?: ethers.Signer | string) => Promise;

getContract takes two arguments name of the contract and the signer, whereas the getContractAt function takes:
getContractAt: (
nameOrAbi: string | any[],
address: string | ethers.Addressable,
signer?: ethers.Signer
) => Promise<ethers.Contract>;

address also, and address is generated after we deploy the contract,
secondly, i also tried this:
yarn add --dev hardhat @nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers ethers

but this doesn't worked for me too.

When I use getContract I get error as it's not a function....

New error AssertionError: expected '0x5FbDB2315678afecb367f032d93F642f641…' to equal undefined

commented

When I use getContract I get error as it's not a function....
Me too

So in order to complete this section of course i have just downgraded all of the dependencies to of the patric's in the course .. i dont think its a god way to go forward but i couldnt seem to arrange all dependencies in a way that they all work and the code work as intended and not give random errors with no relation what so ever ...