describe("POCS", () => {
it("should not allow to create proposals with the same params, but it happens", async () => {
await veToken.mock_setInitialVotingPower(
await owner.getAddress(),
ethers.parseEther("150000")
);
const targets = [await testTarget.getAddress()];
const values = [0];
const calldatas = [
testTarget.interface.encodeFunctionData("setValue", [42])
];
const description = "Test Proposal";
const tx = await governance.connect(owner).propose(
targets,
values,
calldatas,
description,
0
);
const receipt = await tx.wait();
const event = receipt.logs.find(
log => governance.interface.parseLog(log)?.name === 'ProposalCreated'
);
let proposalIdONE = event.args.proposalId;
await time.increase(VOTING_DELAY);
await veToken.mock_setVotingPower(await user1.getAddress(), ethers.parseEther("6000000"));
const startTime = await moveToNextTimeframe();
expect(await governance.state(proposalIdONE)).to.equal(ProposalState.Active);
await governance.connect(user1).castVote(proposalIdONE, true);
expect(await governance.state(proposalIdONE)).to.equal(ProposalState.Active);
await time.increaseTo(startTime + VOTING_PERIOD);
await network.provider.send("evm_mine");
expect(await governance.state(proposalIdONE)).to.equal(ProposalState.Succeeded);
await governance.execute(proposalIdONE);
expect(await governance.state(proposalIdONE)).to.equal(ProposalState.Queued);
const timelockDelay = await timelock.getMinDelay();
await time.increase(timelockDelay);
await network.provider.send("evm_mine");
await governance.execute(proposalIdONE);
await logProposalState(governance, proposalIdONE);
expect(await governance.state(proposalIdONE)).to.equal(ProposalState.Executed);
await veToken.mock_setInitialVotingPower(
await owner.getAddress(),
ethers.parseEther("150000")
);
const sameTargets = [await testTarget.getAddress()];
const sameValues = [0];
const sameCalldatas = [
testTarget.interface.encodeFunctionData("setValue", [42])
];
const txTwo = await governance.connect(owner).propose(
sameTargets,
sameValues,
sameCalldatas,
description,
0
);
const receiptTwo = await txTwo.wait();
const eventTwo = receiptTwo.logs.find(
log => governance.interface.parseLog(log)?.name === 'ProposalCreated'
);
let proposalIdTWO = eventTwo.args.proposalId;
await time.increase(VOTING_DELAY);
await veToken.mock_setVotingPower(await user1.getAddress(), ethers.parseEther("6000000"));
const startTimeTwo = await moveToNextTimeframe();
expect(await governance.state(proposalIdTWO)).to.equal(ProposalState.Active);
await governance.connect(user1).castVote(proposalIdTWO, true);
expect(await governance.state(proposalIdTWO)).to.equal(ProposalState.Active);
await time.increaseTo(startTimeTwo + VOTING_PERIOD);
await network.provider.send("evm_mine");
expect(await governance.state(proposalIdTWO)).to.equal(ProposalState.Succeeded);
await expect(governance.execute(proposalIdTWO)).to.be.revertedWithCustomError(timelock, "OperationAlreadyScheduled");
expect(proposalIdTWO).to.be.gt(proposalIdONE);
const proposalDataIDOne = await governance.getProposalData(proposalIdONE);
const proposalDataIDTwo = await governance.getProposalData(proposalIdTWO);
expect(proposalDataIDOne.targets[0]).to.equal(proposalDataIDTwo.targets[0]);
expect(proposalDataIDOne.values[0]).to.equal(proposalDataIDTwo.values[0]);
expect(proposalDataIDOne.calldatas[0]).to.equal(proposalDataIDTwo.calldatas[0]);
expect(proposalDataIDOne.description).to.equal(proposalDataIDTwo.description);
})
})