Issue deploying a contract using .deploy()

Viewed 18

My code:

exports.deployContract = async function (account, contractData) {
  var contract = new web3.eth.Contract(contractData.abi);
  const randomID = getUUID();

  toReturn = {
    contractAddress: "",
  };

  const mainAccount = {
    address: account.address,
    privateKey: account.privateKey,
  };

  // Deploy contract
  const executed = await contract
    .deploy({ data: contractData.evm.bytecode.object, arguments: [randomID] })
    .send({ gas: 900000, from: mainAccount.address });

  console.log("Contract deployed to", executed.options.address);
  var storedId = "";
  await executed.methods
    .id()
    .call()
    .then((result) => {
      storedId = result;
      console.log("ID: ", result);
    });

  return {
    address: executed.options.address,
    someid: storedId,
  };
};

When I pass an account created using web3.eth.accounts.create(), contract.deploy().send() failed with the error - "Uncaught Error Error: Returned error: sender account not recognized".

How do I resolve this error?

1 Answers

I made it work by rewriting it using sendSignedTransaction.

exports.deployContract = async function (account, contractData) {
  var contract = new web3.eth.Contract(contractData.abi);
  const randomID = getUUID();

  toReturn = {
    contractAddress: "",
  };

  const mainAccount = {
    address: account.address,
    privateKey: account.privateKey,
  };

  // console.log("Bytecode: ", contractData.evm.bytecode.object);
  // console.log("ABI: ", contractData.abi);
  const newIdentityContract = new web3.eth.Contract(contractData.abi);
  const newIdentityContractTx = newIdentityContract.deploy({
    data: contractData.evm.bytecode.object,
    arguments: [randomID],
  });

  const encodedABI = newIdentityContractTx.encodeABI();
  const createTransaction = await web3.eth.accounts.signTransaction(
    {
      data: encodedABI,
      gas: 900000,
    },
    mainAccount.privateKey
  );

  const createReceipt = await web3.eth.sendSignedTransaction(
    createTransaction.rawTransaction
  );
  console.log(`Contract deployed at address: ${createReceipt.contractAddress}`);

  return {
    contractAddress: createReceipt.contractAddress,
    someId: randomID,
  };
};
Related