#javascript #node.js #ethereum #web3 #web3js
#javascript #node.js #ethereum #web3js
Вопрос:
Я хочу установить значение, вызвав функцию смарт-контракта. Смарт-контракт развернут в Ropsten Testnet. Я использую Infura вместо запуска узла.
Я уже читал, что .send() не поддерживается Infura. Итак, какие варианты у меня есть?
Вот мой код:
web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/xxxxxxxxxxxxxxxxxxxxx'));
const abi = PrinterMarketplace;
const contractAddress = '0xa498b78b32755xxxxxxxxxxxxxxf3101a1b92'
contract = await new web3.eth.Contract(
abi,
contractAddress);
contract.methods.setOffer(offerprice, fileHash, client, account).send({ from: account, gas: 3000000 })
Я получаю следующую ошибку:
Ошибка: Возвращенная ошибка: метод eth_sendTransaction не существует / недоступен
Ответ №1:
Вызов метода, использующего Infura в качестве поставщика, требует, чтобы вы либо отправили rawTransaction, либо подписали его перед отправкой.
Если вы используете truffle, вы можете использовать @truffle / hdwallet-provider для подписания транзакций
Вот фрагмент кода, который должен решить вашу проблему
const Web3 = require('web3')
const HDWallet = require('@truffle/hdwallet-provider')
const abi = PrinterMarketplace;
const contractAddress = '0xa498b78b32755xxxxxxxxxxxxxxf3101a1b92'
const web3 = new Web3(new HDWallet('YOUR_PRIVATE_KEY', 'INFURA_ROPSTEN_URL'))
const yourContract = new web3.eth.Contract(abi, contractAddress)
yourContract.methods
.setOffer(offerprice, fileHash, client, account)
.send({ from: account, gas: 3000000 })
.on('confirmation', (confirmations, receipt) => {
console.log('CONFIRMATION');
console.log(confirmations);
console.log(receipt);
})
.on('error', (error, receipt, confirmations) => {
console.log('ERROR');
console.log(error);
console.log(receipt);
console.log(confirmations);
})