I feel like I must be missing something trivial here. I have a smart contract that populates an array of structs shown below. When trying to call addNewQuestion('0x12345')
or getQuestionListSize()
it seems like it is never adding a new Question struct to questionList
. When calling getQuestionListSize()
it should be returning the counter which I named questionId
but it is always just returning "1". Any help greatly appreciated.
Contract:
pragma solidity ^0.4.11;
contract EthUpVoting {
struct Question {
bytes32 ipfsHash;
uint upvotes;
address user;
}
uint private questionId;
mapping (uint => Question) public questionList;
event AddedQuestion(bytes32 ipfs_hash, uint qId);
function EthUpVoting() public {
questionId = 1;
questionList[questionId] = Question({
ipfsHash: "Hello, World!",
upvotes: 0,
user: msg.sender
});
}
function addNewQuestion(bytes32 questionHash) public {
questionId += 1;
questionList[questionId] = Question({
ipfsHash: questionHash,
upvotes: 0,
user: msg.sender
});
AddedQuestion(questionHash, questionId);
}
function voteForQuestion(uint qId) public {
questionList[qId].upvotes += 1;
questionId += 1;
}
function getQuestionTextAtIndex(uint qId) public constant returns (bytes32 ipfsHashReturn) {
return questionList[qId].ipfsHash;
}
function getQuestionListSize() public constant returns (uint size) {
return questionId;
}
}
NodeJS:
const web3 = new Web3(Web3.givenProvider || "ws://127.0.0.1:8546")
const ethUpVotingContract = new web3.eth.Contract(config.eth.abi, config.eth.contractAddr);
ethUpVotingContract.methods.addNewQuestion('foo').send(ethOptions, (err, resp) => {
if (err) {
console.log(err)
} else {
// successfully returns transaction hash
console.log(resp);
}
}).then(resp => {
// successfully returns transaction receipt
console.log(resp);
});
ethUpVotingContract.methods.getQuestionListSize().call().then(function (resp) {
// this always returns "1"
console.log(resp);
});