#solidity #smartcontracts #truffle #web3js #binance-smart-chain
Вопрос:
Вот код, который я запускаю, чтобы получить баланс контракта, который я ранее развернул в смарт-цепочке Binance:
let Web3 = require('web3');
const fs = require('fs');
let web3 = new Web3('https://data-seed-prebsc-1-s1.binance.org:8545');
const contractAddress = '0x43045f0Cec750eEb70478B023885d1956588438E';
const contractAbi = JSON.parse(fs.readFileSync("scripts/contract_abi.json").toString())
const contract = new web3.eth.Contract(contractAbi, contractAddress);
contract.methods.balanceOf(contractAddress).call().then(result=>console.log(result)).catch(err => console.log(err));
Этот код выдает мне ошибку:
Error: Returned error: execution reverted
at Object.ErrorResponse (/home/zuber/Projects/HelloBSC/HelloCoin/node_modules/web3-core-helpers/lib/errors.js:28:19)
at /home/zuber/Projects/HelloBSC/HelloCoin/node_modules/web3-core-requestmanager/lib/index.js:303:36
at XMLHttpRequest.request.onreadystatechange (/home/zuber/Projects/HelloBSC/HelloCoin/node_modules/web3-providers-http/lib/index.js:98:13)
at XMLHttpRequestEventTarget.dispatchEvent (/home/zuber/Projects/HelloBSC/HelloCoin/node_modules/xhr2-cookies/dist/xml-http-request-event-target.js:34:22)
at XMLHttpRequest._setReadyState (/home/zuber/Projects/HelloBSC/HelloCoin/node_modules/xhr2-cookies/dist/xml-http-request.js:208:14)
at XMLHttpRequest._onHttpResponseEnd (/home/zuber/Projects/HelloBSC/HelloCoin/node_modules/xhr2-cookies/dist/xml-http-request.js:318:14)
at IncomingMessage.<anonymous> (/home/zuber/Projects/HelloBSC/HelloCoin/node_modules/xhr2-cookies/dist/xml-http-request.js:289:61)
at IncomingMessage.emit (events.js:387:35)
at endReadableNT (internal/streams/readable.js:1317:12)
at processTicksAndRejections (internal/process/task_queues.js:82:21) {
data: null}
Контракт копируется с https://github.com/binance-chain/bsc-genesis-contract/blob/master/contracts/bep20_template/BEP20Token.template (добавлен onlyOwner
модификатор только в строку 332)
Конфигурация трюфеля, используемая для развертывания контракта в BSC:
const HDWalletProvider = require('@truffle/hdwallet-provider');
const fs = require('fs');
const mnemonic = fs.readFileSync(".secret").toString().trim();
module.exports = {
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 8545, // Standard BSC port (default: none)
network_id: "*", // Any network (default: none)
},
testnet: {
provider: () => new HDWalletProvider(mnemonic, `https://data-seed-prebsc-1-s1.binance.org:8545`),
network_id: 97,
confirmations: 10,
timeoutBlocks: 200,
skipDryRun: true
},
bsc: {
provider: () => new HDWalletProvider(mnemonic, `https://bsc-dataseed1.binance.org`),
network_id: 56,
confirmations: 10,
timeoutBlocks: 200,
skipDryRun: true
},
},
// Set default mocha options here, use special reporters etc.
mocha: {
// timeout: 100000
},
// Configure your compilers
compilers: {
solc: {
version: "0.5.16", // A version or constraint - Ex. "^0.5.0"
}
}
}
Комментарии:
1. Можете ли вы изменить
let result = getBalance();
getBalance().then(result => console.log(result)).catch(err => console.log(err))
и опубликовать выходные данные2. Обновленный код и ошибка
Ответ №1:
Это общая ошибка, возникающая в результате смарт-контракта, когда контракт создает необработанное исключение.
Несмотря на то, что вы не опубликовали исходный код контракта, мы можем получить некоторую базовую информацию о его содержимом из декомпилированного кода.
Это показывает, что нет balanceOf()
(что вы пытаетесь вызвать), и что fallback()
(который используется, если вы пытаетесь вызвать несуществующую функцию) всегда создает исключение.
Отсюда наиболее вероятная возможность заключается в том, что вы намеревались развернуть другой контракт (содержащий balanceOf()
функцию), но вместо этого по ошибке развернули этот.
Или, если вы хотели получить баланс BNB (не баланс токенов) адреса контракта, вы можете использовать метод web3 getBalance (). Пример:
const balance = await web3.eth.getBalance(contractAddress);
Комментарии:
1. Здравствуйте и спасибо за ваш ответ! Как вы узнали, что декомпилированный код не содержит
balanceOf
? Я предоставил исходный код контракта, который я развернул, и он определенно содержитbalanceOf
. Вот оно: github.com/binance-chain/bsc-genesis-contract/blob/master/…2. @Василий Нажмите «Декомпилировать байт-код» на BscScan по ссылке. Вы увидите декомпилированный код… Поскольку он отличается от источника, представленного здесь в комментарии, я предполагаю, что вы просто развернули неправильный контракт (возможно, другой контракт из того же файла).
3. У вас есть идея, почему трюфель развертывает неправильный контракт? Я убедился, что в каталоге /contracts есть точно такой же код, но вместо развертывания моего контракта BEP20 он развертывает базовый контракт