Skip to content

Lesson6: fund_and_withdraw - ValueError: Gas estimation failed #1449

Open
@DorianDaSilva

Description

@DorianDaSilva

Hi!

I am trying to deploy fund_and_withdraw.py to Rinkeby using brownie but I run into the follwoing error:

ValueError: Gas estimation failed: 'execution reverted: You need to spend more ETH!'. This transaction will likely revert. If you wish to broadcast, you must set the gas limit manually.

I previously tried deploying it on ganache-cli but get a "Index out of range" issue as described on my previous issue.

Now, I am trying to run it on Rinkeby (Ganache UI is not connecting to my Brownie and is throwing off the entire contract) but it returns the "ValueError".

Also, tried changing the decimals in FundMe.py.

I tried deploying on Rinkby and I no longer get "Index out of range" but instead i get "ValueError"

My code below:

fund_and_withdraw

from brownie import FundMe
from scripts.helpful_scripts import get_account

        def fund():
            fund_me = FundMe[-1]
            account = get_account()
            entrance_fee = fund_me.getEntranceFee()
            print(entrance_fee)
            print(f"The current entry fee is {entrance_fee}")
            print("funding")
            fund_me.fund(
                {
                    "from": account,
                    "value": entrance_fee,
                }
            )
            # 0.025000000000000000

        def main():
            fund()

`

Helpful_scripts.py

from brownie import network, config, accounts, MockV3Aggregator
from web3 import Web3

        # Create Variable to store dev network list (Ex: ["development", "ganache", etc...])
        LOCAL_BLOCKCHAIN_ENVIRONMENTS = "development"
        DECIMALS = 8
        STARTING_PRICE = 200000000000


        def get_account():
            # if network.show_active == "development":
            if network.show_active() in LOCAL_BLOCKCHAIN_ENVIRONMENTS:
                return accounts[0]
            else:
                return accounts.add(config["wallets"]["from_key"])


        def deploy_mocks():
            print(f"The active network is {network.show_active()}")
            print("Deploying Mocks...")
            if len(MockV3Aggregator) <= 0:
                MockV3Aggregator.deploy(
                    # DECIMALS, Web3.toWei(STARTING_PRICE, "ether"), {"from": get_account()}
                    DECIMALS,
                    STARTING_PRICE,
                    {"from": get_account()},
                )
            print("Mocks Deployed!")

`

FundMe.py
contract FundMe {
using SafeMath96 for uint256;

            mapping(address => uint256) public addressToAmountFunded;
            address[] public funders;
            address public owner;
            AggregatorV3Interface public priceFeed;

            //constructor(address _priceFeed) public {
            constructor(address _priceFeed) {
                priceFeed = AggregatorV3Interface(_priceFeed);
                owner = msg.sender;
            }

            function fund() public payable {
                uint256 minimumUSD = 50 * 10**18;
                require(
                    getConversionRate(msg.value) >= minimumUSD,
                    "You need to spend more ETH!"
                );
                addressToAmountFunded[msg.sender] += msg.value;
                funders.push(msg.sender);
            }

            function getVersion() public view returns (uint256) {
                return priceFeed.version();
            }

            function getPrice() public view returns (uint256) {
                (, int256 answer, , , ) = priceFeed.latestRoundData();
                //return uint256(answer * 10000000000);
                return uint256(answer * 100000000);
            }

            // 1000000000
            function getConversionRate(uint256 ethAmount)
                public
                view
                returns (uint256)
            {
                uint256 ethPrice = getPrice();
                //uint256 ethAmountInUsd = (ethPrice * ethAmount) / 1000000000000000000;
                uint256 ethAmountInUsd = (ethPrice * ethAmount) / 100000000;
                return ethAmountInUsd;
            }

            function getEntranceFee() public view returns (uint256) {
                // minimumUSD
                uint256 minimumUSD = 50 * 10**18;
                uint256 price = getPrice();
                uint256 precision = 1 * 10**18;
                // return (minimumUSD * precision) / price;
                // We fixed a rounding error found in the video by adding one!
                return ((minimumUSD * precision) / price) + 1;
            }

            modifier onlyOwner() {
                require(msg.sender == owner);
                _;
            }

            function withdraw() public payable onlyOwner {
                payable(msg.sender).transfer(address(this).balance);

                for (
                    uint256 funderIndex = 0;
                    funderIndex < funders.length;
                    funderIndex++
                ) {
                    address funder = funders[funderIndex];
                    addressToAmountFunded[funder] = 0;
                }
                funders = new address[](0);
            }
        }

`

Deploy.py

from brownie import FundMe, MockV3Aggregator, network, config
from scripts.helpful_scripts import (
get_account,
deploy_mocks,
LOCAL_BLOCKCHAIN_ENVIRONMENTS,
)

        def deploy_fund_me_2():
            account = get_account()
            #if network.show_active() != "development":
            if network.show_active() not in LOCAL_BLOCKCHAIN_ENVIRONMENTS:
                price_feed_address = config["networks"][network.show_active()][
                    "eth_usd_price_feed"
                ]
            else:
                deploy_mocks()
                price_feed_address = MockV3Aggregator[-1].address

            fund_me = FundMe.deploy(
                price_feed_address,
                {"from": account},
                publish_source=config["networks"][network.show_active()].get("verify"),
            )
            print(f"Contract deployed to {fund_me.address}")


        def main():
            deploy_fund_me_2()

`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions