Я совсем новичок в этом. Пожалуйста, помогите мне. Я пытаюсь создать децентрализованное приложение, используя метеор. У меня небольшие проблемы с вызовом функции контракта с использованием web3. Вот фрагмент кода, который пытается вызвать функцию контракта:
myContract.startAFunc.sendTransaction(
"Name",{from: fromaddress, value: 500000000000000000},
function(err,address) {
if(!err)
console.log(address);});
//myContract is the ABI array at the contract address, startAFunc is the function name
Прототип функции выглядит следующим образом:
function startABet(string _Input} payable
Я получаю эту ошибку:
Uncaught Error: new BigNumber() не является числом: [object Object]
Код работал некоторое время назад. Я хотел сделать небольшую модификацию, отправив переменную вместо жестко закодированного значения, но не смог этого сделать. Позже я попытался вернуться назад, теперь это тоже не работает. Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю не так. Я потратил дни на это, но не смог понять это. Я запускаю его в браузере Chrome с расширением метамаски на машине с Ubuntu.
Мы получаем их время от времени, когда вносим изменения в MyEtherWallet, и мы не используем Solidity или web3. Это JS-вещь в библиотеке BigNumber.js, которую также использует web3.
Где-то у вас есть что-то, что вы считаете числом, но на самом деле это строка, ноль, массив, объект или что-то еще. Это был какой-то код для отправки подписанного TX через вкладку offline. Ошибка в нашем случае была BigNumber Error: new BigNumber() not a number: 0x
. И исправление:
$scope.tx.value = etherUnits.toEther('0x'+eTx.value.toString('hex'),'wei');
$scope.tx.value = eTx.value.toString('hex')!='' ? etherUnits.toEther('0x'+eTx.value.toString('hex'),'wei') : 0;
Итак, раньше мы просто говорили: «Возьми это значение и делай с ним что-то». Исправление заключалось в том, что «если это значение не пусто, то делайте с ним что-то, иначе верните 0
.
Так. Что попробовать...
console.log ваши переменные до И после, с ошибкой или без ошибки, а также регистрируйте их типы:console.log(typeof myContract)
Убедитесь, что вы перехватываете любые пустые или нулевые значения и либо перенастраиваете число (например 0
, ), либо не продолжаете
Убедитесь, что вы проходите то, что, как вы думаете, вы проходите. Например, вы действительно передаете address
, или fromaddress
, или contract.address
, или что-то еще?
В вашем случае это говорит [Объект объект], что заставляет меня думать, что что-то является объектом. В этом случае сделайте то же самое console.log( JSON.stringify(myContract) )
, чтобы вы могли увидеть, что это такое.
Все, что вы регистрируете, возвращает что-то странное вроде Object { s: 1, e: 0, c: Array1 }
, вам нужно либо
toString
чтобы получить его значение в виде десятичной строкиtoNumber
чтобы аппроксимировать его как номер JS.Если вы сделаете все это, вы обнаружите место, где вы думали, что что-то было чем-то, но на самом деле это было что-то Другое. Тогда это легко исправить.
Я также столкнулся с подобной проблемой, возможной причиной может быть то, что вы вводите какой-либо параметр неправильно. Пожалуйста, проверьте, правильно ли вы указываете значения:
Позаботьтесь о любой опечатке. Как и в моем случае, я написал form
вместо from .
Я внес некоторые изменения в свои контракты. Я удалил свои скомпилированные файлы и перекомпилировал их. Казалось, это помогло.
Ну, я пробовал все возможности, упомянутые выше, ни один не работал. Собирался сдаться и просто возился с кодом и изменил название функции в моем контракте, никаких других изменений не делал. Неожиданно это действительно сработало! Я до сих пор не могу понять, в чем была проблема и какая была связь между bignumber и именем функции, но это действительно сработало.!
myContract
правильно инициализировали или у вас было несоответствие между ABI и байт-кодом? Затем, после изменения имени и, возможно, повторного развертывания, это сработало?для меня я получал ошибку, потому что я использовал
web3.eth.getBalance.request(address)
вместо
web3.eth.getBalance(address)
АФ
fromaddress
что-то странное, с чем web3 не знает, как справиться. Ошибка где-то в вашем javascript, а не в вашей солидности. Попробуйте вывести еще несколько переменных.Бадр Беллай
Анки