Voting blockchain smart contract, transaction dropped or replaced when interacting with contract using metamask but not with remix vm

46 views Asked by At

Please point me to the right direction.

Below is the code for my voting contract that I have created in remix IDE. When interacting with addCandidate Method on remix VM it is working properly but when I try to use metamask with sepolia test network, I am always getting the error Transaction Failed! Tranasaction replaced or dropped

Transaction failed message, metamask

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

error CandidateAlreadyExists();
error AlreadyVoted();
error InvalidCandidate();
error NotRegisteredVoter();
error VoterAlreadyRegistered();
error OnlyManagerCanCall();
error InvalidAddress();
error InvalidName();
error InsufficientCandidates();

contract BlockchainVoting {
    address private manager;
    mapping(address => Voter) private voters;
    mapping(address => Candidate) private candidateLookup;
    Candidate[] private candidates;
    address[] private voterAddresses;

    constructor() {
        manager = msg.sender;
    }

    struct Voter {
        string name;
        address voterAddress;
        bool hasVoted;
    }

    struct Candidate {
        string name;
        address candidateAddress;
        uint256 votes;
    }

    function registerVoter(string memory voterName, address voterAddress) external onlyManager {
        if (voterAddress == address(0)) {
            revert InvalidAddress();
        }
        if (bytes(voterName).length == 0) {
            revert InvalidName();
        }
        if (voters[voterAddress].voterAddress != address(0)) {
            revert VoterAlreadyRegistered();
        }
        voters[voterAddress] = Voter(voterName, voterAddress, false);
        voterAddresses.push(voterAddress);
    }

    function registerVoters(string[] memory voterNames, address[] memory voterAddressesArray) external onlyManager {
        require(voterNames.length == voterAddressesArray.length, "Array length mismatch");

        for (uint256 i = 0; i < voterAddressesArray.length; i++) {
            address voterAddress = voterAddressesArray[i];
            string memory voterName = voterNames[i];

            if (voterAddress == address(0)) {
                revert InvalidAddress();
            }
            if (bytes(voterName).length == 0) {
                revert InvalidName();
            }
            if (voters[voterAddress].voterAddress != address(0)) {
                revert VoterAlreadyRegistered();
            }

            voters[voterAddress] = Voter(voterName, voterAddress, false);
            voterAddresses.push(voterAddress);
        }
    }

    function addCandidate(address candidateAddress, string memory name) external onlyManager {
        if (candidateAddress == address(0)) {
            revert InvalidAddress();
        }
        if (bytes(name).length == 0) {
            revert InvalidName();
        }
        if (candidateLookup[candidateAddress].candidateAddress != address(0)) {
            revert CandidateAlreadyExists();
        }

        Candidate memory newCandidate = Candidate({ name: name, candidateAddress: candidateAddress, votes: 0 });
        candidates.push(newCandidate);
        candidateLookup[candidateAddress] = newCandidate;
    }

    function addCandidates(address[] memory candidateAddresses, string[] memory names) external onlyManager {
        require(candidateAddresses.length == names.length, "Array length mismatch");

        for (uint256 i = 0; i < candidateAddresses.length; i++) {
            address candidateAddress = candidateAddresses[i];
            string memory name = names[i];

            if (candidateAddress == address(0)) {
                revert InvalidAddress();
            }
            if (bytes(name).length == 0) {
                revert InvalidName();
            }
            if (candidateLookup[candidateAddress].candidateAddress != address(0)) {
                revert CandidateAlreadyExists();
            }

            Candidate memory newCandidate = Candidate({ name: name, candidateAddress: candidateAddress, votes: 0 });
            candidates.push(newCandidate);
            candidateLookup[candidateAddress] = newCandidate;
        }
    }

    function vote(address candidateAddress) external {
        if (candidates.length < 2) {
            revert InsufficientCandidates();
        }
        Voter storage senderVoter = voters[msg.sender];

        if (senderVoter.voterAddress == address(0)) {
            revert NotRegisteredVoter();
        }
        if (senderVoter.hasVoted) {
            revert AlreadyVoted();
        }

        Candidate storage candidate = candidateLookup[candidateAddress];
        if (candidate.candidateAddress == address(0)) {
            revert InvalidCandidate();
        }

        candidate.votes++;
        senderVoter.hasVoted = true;
    }

    function getAllCandidates() external view returns (Candidate[] memory) {
        return candidates;
    }

    function getAllVoters() external view returns (Voter[] memory) {
        Voter[] memory voterList = new Voter[](voterAddresses.length);
        for (uint256 i = 0; i < voterAddresses.length; i++) {
            voterList[i] = voters[voterAddresses[i]];
        }
        return voterList;
    }

    modifier onlyManager() {
        if (msg.sender != manager) {
            revert OnlyManagerCanCall();
        }
        _;
    }
}
0

There are 0 answers