Получение неперехваченной ошибки: новый BigNumber() не является числом: [object Object]

Я совсем новичок в этом. Пожалуйста, помогите мне. Я пытаюсь создать децентрализованное приложение, используя метеор. У меня небольшие проблемы с вызовом функции контракта с использованием 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.

Я предполагаю, что у вас fromaddressчто-то странное, с чем web3 не знает, как справиться. Ошибка где-то в вашем javascript, а не в вашей солидности. Попробуйте вывести еще несколько переменных.
как переменная fromaddress получает значение? я думаю, что javascript все еще загружен, поэтому иногда вам нужно принудительно обновить, чтобы использовать обновленную версию.
ну, объявил адрес отправителя в начальной части кода. Итак, это просто переменная, которая хранит адрес.

Ответы (5)

Мы получаем их время от времени, когда вносим изменения в 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.
    • (Этот объект является объектом из BigNumber.js)

Если вы сделаете все это, вы обнаружите место, где вы думали, что что-то было чем-то, но на самом деле это было что-то Другое. Тогда это легко исправить.

Спасибо за помощь в решении этой проблемы, ты прекрасный человек :D

Я также столкнулся с подобной проблемой, возможной причиной может быть то, что вы вводите какой-либо параметр неправильно. Пожалуйста, проверьте, правильно ли вы указываете значения:

  • Контракт ABI
  • Адрес контракта
  • от (адрес)
  • адресовать)
  • количество

Позаботьтесь о любой опечатке. Как и в моем случае, я написал formвместо from .

Я внес некоторые изменения в свои контракты. Я удалил свои скомпилированные файлы и перекомпилировал их. Казалось, это помогло.

Ну, я пробовал все возможности, упомянутые выше, ни один не работал. Собирался сдаться и просто возился с кодом и изменил название функции в моем контракте, никаких других изменений не делал. Неожиданно это действительно сработало! Я до сих пор не могу понять, в чем была проблема и какая была связь между bignumber и именем функции, но это действительно сработало.!

Может быть вы не myContractправильно инициализировали или у вас было несоответствие между ABI и байт-кодом? Затем, после изменения имени и, возможно, повторного развертывания, это сработало?
Что ж, я попытался повторно развернуть тот же контракт, использовать этот ABI и повторно инициализировать его. Но да, то, что вы сказали, может быть возможностью, и я мог проследить за деталями. Спасибо..

для меня я получал ошибку, потому что я использовал

web3.eth.getBalance.request(address)

вместо

web3.eth.getBalance(address)