Lesson 9: AssertionError: expected Promise{…} to equal '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb…' #6310
-
My Unit Test File : const { network, ethers, deployments, getNamedAccounts } = require("hardhat")
const { developmentChains } = require("../../helper-hardhat-config")
const { assert, expect } = require("chai")
!developmentChains.includes(network.name)
? describe.skip
: describe("Raffle Unit Test", function () {
let raffle,
raffleContract,
VRFCoordinatorV2Mock,
raffleEnteranceFee,
deployer,
interval,
player
beforeEach(async () => {
accounts = await ethers.getSigners()
deployer = accounts[0]
player = accounts[1]
await deployments.fixture(["all"])
raffleContract = await ethers.getContract("Raffle")
VRFCoordinatorV2Mock = await ethers.getContract("VRFCoordinatorV2Mock")
raffle = raffleContract.connect(player)
raffleEnteranceFee = await raffle.getEnteranceFee()
interval = await raffle.getInterval()
})
describe("constructor", () => {
it("initializes the raffle correctly", async () => {
const raffleState = await raffle.getRaffleState()
assert.equal(raffleState.toString(), "0")
})
})
describe("enter raffle", () => {
it("reverts when you don't pay enough", async () => {
await expect(raffle.enterRaffle()).to.be.revertedWith(
"Raffle__NotEnoughETHEntered",
)
})
it("records player when they enter", async () => {
const tx = await raffle.enterRaffle({ value: raffleEnteranceFee })
await tx.wait(1)
const playerFromContract = raffle.getPlayer(0)
assert.equal(playerFromContract, player.address)
})
it("emits event on enter", async () => {
await expect(raffle.enterRaffle({ value: raffleEnteranceFee })).to.emit(
raffle,
"RaffleEnter",
)
})
it("doesn't allow entrance when raffle is calculating", async () => {
await raffle.enterRaffle({ value: raffleEnteranceFee })
await network.provider.send("evm_increaseTime", [interval.toNumber() + 1])
await network.provider.send("evm_mine", [])
// Now we pretend to be a chainlink keeper
await raffle.performUpkeep([])
await expect(
raffle.enterRaffle({ value: raffleEnteranceFee }),
).to.be.revertedWith("Raffle__LotteryClosed")
})
})
describe("checkUpkeep", function () {
it("", async () => {})
})
}) My config file: require("@nomiclabs/hardhat-waffle")
require("@nomiclabs/hardhat-etherscan")
require("hardhat-deploy")
require("solidity-coverage")
require("hardhat-gas-reporter")
require("hardhat-contract-sizer")
require("dotenv").config()
const SEPOLIA_RPC_URL = process.env.SEPOLIA_RPC_URL
const SEPOLIA_PRIVATE_KEY = process.env.SEPOLIA_PRIVATE_KEY
const ETHERSCAN_API = process.env.ETHERSCAN_API
const COINMARKET_API = process.env.COINMARKET_API
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: {
compilers: [
{
version: "0.8.8",
},
{
version: "0.4.24",
},
],
},
defaultNetwork: "hardhat",
networks: {
hardhat: {
chainId: 1337,
blockConfirmation: 1,
},
sepolia: {
url: SEPOLIA_RPC_URL,
accounts: [SEPOLIA_PRIVATE_KEY],
chainId: 11155111,
blockConfirmations: 6,
saveDeployments: true,
},
},
gasReporter: {
enabled: false,
currency: "USD",
coinmarketcap: COINMARKET_API,
outputFile: "gas-report.txt",
noColors: true,
},
namedAccounts: {
deployer: {
default: 0,
1: 0,
},
player: {
default: 1,
},
},
etherscan: {
apiKey: ETHERSCAN_API,
customChains: [
{
name: "sepolia",
url: SEPOLIA_RPC_URL,
chainId: 1337,
},
],
},
} My contract file: //SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol";
import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol";
import "@chainlink/contracts/src/v0.8/KeeperCompatible.sol";
error Raffle__NotEnoughETHEntered();
error Raffle__TransferFailed();
error Raffle__LotteryClosed();
error Raffle__UpkeepNotNeeded(uint256 currentBalance, uint256 numPlayers, uint256 raffleState);
/**
* @title A Sample Raffle Contract
* @author Eik
* @notice This contract is for creating is untamperable decentralized smart contract
* @dev This implements Chainlink VRF V2 and Chainlink Keepers
*/
contract Raffle is VRFConsumerBaseV2, KeeperCompatible {
/* Types */
enum RaffleState {
OPEN,
CALCULATING
}
/* State Variables */
uint256 private immutable i_enteranceFee;
address payable[] private s_players;
//For VRFConsumerBaseV2 Constructor
VRFCoordinatorV2Interface private immutable i_vrfCoordinator;
bytes32 private immutable i_gasLane;
uint64 private immutable i_subscriptionId;
uint16 private constant REQUEST_CONFIRMATIONS = 3;
uint32 private immutable i_callbackGasiLimit;
uint32 private constant NUM_WORDS = 1;
/* Lottery Variables */
address private s_recentWinner;
RaffleState private s_raffleState;
uint256 private s_lastTimeStamp;
uint256 private immutable i_interval;
/* Events */
event RaffleEnter(address indexed player);
event RequestedRaffleWinner(uint256 indexed requestId);
event WinnerPicked(address indexed winner);
constructor(
address vrfCoordinatorV2,
uint256 enteranceFee,
bytes32 gasLane,
uint64 subscriptionId,
uint32 callbackGasiLimit,
uint256 interval
) VRFConsumerBaseV2(vrfCoordinatorV2) {
i_enteranceFee = enteranceFee;
i_vrfCoordinator = VRFCoordinatorV2Interface(vrfCoordinatorV2);
i_gasLane = gasLane;
i_subscriptionId = subscriptionId;
i_callbackGasiLimit = callbackGasiLimit;
s_raffleState = RaffleState.OPEN;
s_lastTimeStamp = block.timestamp;
i_interval = interval;
}
function enterRaffle() public payable {
if (msg.value < i_enteranceFee) {
revert Raffle__NotEnoughETHEntered();
}
if (s_raffleState != RaffleState.OPEN) {
revert Raffle__LotteryClosed();
}
s_players.push(payable(msg.sender)); //we type cast msg.sender to payable as s_players is payable
emit RaffleEnter(msg.sender);
}
/**
* @dev This is the function that Chainlink Keeper nodes call as they look for the
* 'checkUpkeep()' to return true.
* Following should be true in order to return true:
* 1. Our time inerval should have passed
* 2. The lottery should have atleast one player and some ETH
* 3. Our subscription is funded with LINK
* 4. Lottery should be in "Open" state
*/
function checkUpkeep(
bytes memory /*checkData*/
) public override returns (bool upkeepNeeded, bytes memory /*performData*/) {
bool isOpen = (RaffleState.OPEN == s_raffleState);
bool timePassed = ((block.timestamp - s_lastTimeStamp) > i_interval);
bool hasPlayers = (s_players.length > 0);
bool hasBalance = address(this).balance > 0;
upkeepNeeded = (isOpen && timePassed && hasPlayers && hasBalance);
}
function performUpkeep(bytes calldata /* performData */) external override {
(bool upkeepNeeded, ) = checkUpkeep("");
if (!upkeepNeeded) {
revert Raffle__UpkeepNotNeeded(
address(this).balance,
s_players.length,
uint256(s_raffleState)
);
}
s_raffleState = RaffleState.CALCULATING;
uint256 requestId = i_vrfCoordinator.requestRandomWords(
i_gasLane,
i_subscriptionId,
REQUEST_CONFIRMATIONS,
i_callbackGasiLimit,
NUM_WORDS
);
emit RequestedRaffleWinner(requestId);
}
function fulfillRandomWords(
uint256 /* requestId */,
uint256[] memory randomWords
) internal override {
uint256 indexOfWinner = randomWords[0] % s_players.length;
address payable recentWinner = s_players[indexOfWinner];
s_recentWinner = recentWinner;
s_raffleState = RaffleState.OPEN;
s_players = new address payable[](0);
s_lastTimeStamp = block.timestamp;
(bool success, ) = recentWinner.call{value: address(this).balance}("");
if (!success) {
revert Raffle__TransferFailed();
}
emit WinnerPicked(recentWinner);
}
/* Getter Functions */
function getEnteranceFee() public view returns (uint256) {
return i_enteranceFee;
}
function getPlayer(uint256 index) public view returns (address payable) {
return s_players[index];
}
function getRecenetWinner() public view returns (address) {
return s_recentWinner;
}
function getRaffleState() public view returns (RaffleState) {
return s_raffleState;
}
function getNumWords() public pure returns (uint256) {
return NUM_WORDS;
}
function getNumOfPlayers() public view returns (uint256) {
return s_players.length;
}
function getLatestTimeStamp() public view returns (uint256) {
return s_lastTimeStamp;
}
function getRequestConfirmations() public pure returns (uint256) {
return REQUEST_CONFIRMATIONS;
}
function getInterval() public view returns (uint256) {
return i_interval;
}
}
Every other test is running rn, it is just causing problem with the player recording test. |
Beta Was this translation helpful? Give feedback.
Answered by
HexiangLiu
Nov 30, 2023
Replies: 1 comment 1 reply
-
Try adding an await before your contract method call |
Beta Was this translation helpful? Give feedback.
1 reply
Answer selected by
eik-1
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Try adding an await before your contract method call