I am trying to run estimateGas
function on mainnet like the following to send erc721 cryptokitties from one account to another:
data.from = <my address>
data.to = <destination address>
data.token = 0x06012c8cf97bead5deae237070f9587f8e7a266d (cryptokitties contract address)
data.tokenId = 1148166
var getDataForERC721 = function(from, to, contractAddress, tokenId){
var abi = <myerc721abi>;
var contract = web3.eth.contract(abi).at(contractAddress);
var data = contract.safeTransferFrom.getData(from, to, tokenId);
return data;
}
var txdata = getDataForERC721(data.from, data.to, data.token, data.tokenId;
getEstimateGas = async function(from, to, data, value){
var self = this;
return new Promise((resolve, reject) => {
web3.eth.estimateGas({
'from': from,
'to': to,
'data': data,
'value': value
}, function(err, tx){
console.log("errror is -> " + err);
if( err ) resolve(null);
else resolve(tx);
});
});
getEstimateGas(data.from, data.to , txdata, 0x00);
I get this error Error: gas required exceeds allowance or always failing transaction
. This function works well on Ropsten network, but gives the above error on mainnet.
I am using web3 version ^0.20.6
EDIT
I have made sure that contract.ownerOf(tokenId)
returns the correct address.
I have also tried replacing contract.safeTransferFrom.getData(from, to, tokenId)
with contract.transferFrom.getData(from, to, tokenId)
.
However, I still get the same error.
console.log(contract.transferFrom.getData(from, to, tokenId))
prints the following:
0x23b872dd00000000000000000000000057e7674b1c58a0edce5a62af228ab34f09c00fca000000000000000000000000ae08cf4e3678843bbeb39d0608029b1daa4d51210000000000000000000000000000000000000000000000000000000000118506
The data that I am now passing to getEstimateGas
is as follows:
{ from: '0x57E7674B1c58A0edce5a62AF228ab34f09C00Fca',
to: '0x06012c8cf97bead5deae237070f9587f8e7a266d',
data: '0x23b872dd00000000000000000000000057e7674b1c58a0edce5a62af228ab34f09c00fca000000000000000000000000ae08cf4e3678843bbeb39d0608029b1daa4d51210000000000000000000000000000000000000000000000000000000000118506',
value: '0x00' }
Here from
is the address which contains the token, to
is the contract address (cryptokitties)
and data
is the data returned from contract.transferFrom.getData
function.
Here the from
address is also the owner of the token. So, I guess I don't need to use the approve
function.
I gained this token with this transaction https://etherscan.io/tx/0x5119c2d5eae0fdc4a0e000b84231cfb5db075efd30fcca3fabe91d2bbfdc9006