When I return a string array with web3 I don't get the original array as expected, but rather I get an array of the same size, with the index off by one. So instead of `["One","Two","Three"]` I get `["","One","Two"]` I am certain my contract is correct, because when I call the function on remix.ethereum.org I correctly get `["One","Two","Three"]` as the return value. Contract: pragma experimental ABIEncoderV2; pragma solidity ^0.5.0; contract ProblemDemo { string[] private myStringArray; constructor () public { myStringArray.push("One"); myStringArray.push("Two"); myStringArray.push("Three"); } function addToMyStringArray (string memory newEntry) public { myStringArray.push(newEntry); } function getMyStringArray () public view returns (string[] memory) { return myStringArray; } } Simple HTML displaying the issue: <!DOCTYPE html> <html lang="en"> <head></head> <body> <script src="https://github.com/ethereum/web3.js/blob/develop/dist/web3.min.js" type="text"></script> <h1>My Test</h1> <div id="output"></div> <button id="button">Click</button> <script src="./script.js" type="text/javascript"></script> <script> window.addEventListener('load', function() { if(typeof web3 !== undefined) web3js = new Web3(web3.currentProvider); document.getElementById("button").addEventListener("click", function() { getMyStringArray(); }, function(error, result){}, false); }); var contractInstance; var contractABI = [{"constant": false,"inputs": [{"name": "newEntry","type": "string"}],"name": "addToMyStringArray","outputs": [],"payable": false,"stateMutability": ","type": "function"},{"inputs": [],"payable": false,"stateMutability": "nonpayable","type": "constructor"},{"constant": true,"inputs": [],"name": "getMyStringArray","outputs": [{"name": "","type": "string[]"}],"payable": false,"stateMutability": "view","type": "function"}]; var contractAddress = "0x8fcb440a8ba9df8ea91493be3bd27ab562d04386"; <!-- Contract Address is on the Rinkeby Test Network --> contractInstance = web3.eth.contract(contractABI).at(contractAddress); function getMyStringArray() { contractInstance.getMyStringArray(function(error, result){ document.getElementById("output").innerHTML = result; }); } </script> </body> </html>