const Web3 = require('web3');
const fs = require('fs');
const solc = require('solc');
let web3;
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/my key'));
}
const source = fs.readFileSync('./contract/coin.sol', 'utf8');
const compile = solc.compile(source, 1);
const contractCompile = Object.values(compile.contracts)[0];
const deployAddr = '0x.....';
const contractByteCode = '0x' + contractCompile.bytecode;
const contractAbi = JSON.parse(contractCompile.interface);
const gasEstimate = web3.eth.estimateGas({data: contractByteCode});
const gasPrice = '20000000000';
const myContract = new web3.eth.Contract(contractAbi, {
from: deployAddr,
gas: '15000000',
gasPrice: gasPrice,
});
const initialSupply = 10000000000;
const tokenName = 'LLT';
const tokenSymbol = 'LLT';
myContract.deploy({
data: contractByteCode,
arguments: [initialSupply, tokenName, tokenSymbol]
}).send({
from: deployAddr,
gas: '15000000',
gasPrice: gasPrice
}, function (error) {
console.log(error);
})
.on('transactionHash', function (transactionHash) {console.log(transactionHash)})
.on('receipt', function (receipt) {
console.log(receipt.contractAddress) // contains the new contract address
}).on('confirmation', function (confirmationNumber, receipt) {
}).then(function (newContractInstance) {
console.log(newContractInstance.options.address) // instance with the new contract address
}).catch(err => {
console.log("Error: failed to deploy, detail:", err)
});
Obtengo Error: Invalid JSON RPC response: ""
cuando uso el nodo para ejecutar este código.
¿Cómo puedo resolver este problema? Gracias
Intenta usar .sendRawTransaction()
en lugar de .send()
, entonces:
myContract.deploy({
data: contractByteCode,
arguments: [initialSupply, tokenName, tokenSymbol]
}).sendRawTransaction({
from: deployAddr,
gas: '15000000',
gasPrice: gasPrice
}, function (error) {
console.log(error);
})
.on('transactionHash', function (transactionHash) {console.log(transactionHash)})
.on('receipt', function (receipt) {
console.log(receipt.contractAddress) // contains the new contract address
}).on('confirmation', function (confirmationNumber, receipt) {
}).then(function (newContractInstance) {
console.log(newContractInstance.options.address) // instance with the new contract address
}).catch(err => {
console.log("Error: failed to deploy, detail:", err)
});
No estoy seguro de que funcione, probablemente tengas que preparar y firmar la transacción antes de enviarla usando Infura.
Supongo que está usando Metamask y en realidad usa su proveedor, por lo tanto, entrando en la verdad de esta condición:
if (typeof web3 !== 'indefinido') {
web3 = new Web3(web3.currentProvider);
}
else {
web3 = new Web3(new Web3.providers.HttpProvider(' https://ropsten.infura.io/my key'));
}
entonces esto podría suceder debido a un problema de sincronización con metamask (lo obtuve varias veces al usar un nodo RPC personalizado)
mi sugerencia es intentar ir a la configuración de MM y restablecer la cuenta (solo eliminará transacciones) y si eso no es así funciona, intente desinstalar y reinstalar metamask
Además del comentario, que indica correctamente la clave infura faltante, esto no puede funcionar, ya que no tiene un componente de código que realmente firme la transacción. La API web3 a la que se hace referencia aquí se basa en clientes de nodo con claves privadas para hacerlo, lo que, por supuesto, no es factible con infura. Pruebe esta solución en su lugar, considere también el último comentario de esa esencia.
Supongo que es porque está intentando implementar un contrato desde una dirección (deployAddr) pero no está enviando ninguna clave privada para verificar la propiedad de esa dirección (deployAddr).
Por lo tanto, debe agregar una clave privada de esa dirección (deployAddr) antes de implementar el contrato, así:
const add = await web3.eth.accounts.wallet.add(privateKeyOfDeployAddr);
Espero eso ayude.
¡Salud!
jaspe
new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/my key'))
debería ser:new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/'))
aunque no sé si esto resolverá el problema.