TypeError: невозможно установить свойство «метод» неопределенного при использовании WebsocketProvider

Я использую:

  • веб3 v0.20.6
  • web3-провайдеры-ws v1.0.0-beta.34

Первый вопрос - можно web3-providers-wsли использовать с web3 v0.20.*?

Второй вопрос (проблема) - я получаю сообщение об ошибке, когда, возможно, пытаюсь отправить транзакцию (чтение и просмотр событий через этого провайдера совершенно нормально).

Запрос на вытягивание: https://github.com/ethereum-alarm-clock/timenode-core/pull/146

E2E-тесты рабочего HTTP-провайдера:

https://travis-ci.org/ethereum-alarm-clock/timenode-core/jobs/406823597

Неудачные тесты E2E провайдера WS:

https://travis-ci.org/ethereum-alarm-clock/timenode-core/jobs/406823603

Фактическая ошибка:

5 passing (4s)
  3 failing
  1) ScheduleTx
       schedules a basic transaction:
     TypeError: Cannot set property 'method' of undefined
      at WebsocketProvider._addResponseCallback (node_modules/web3-providers-ws/src/index.js:197:39)
      at WebsocketProvider.send (node_modules/web3-providers-ws/src/index.js:252:10)
      at RequestManager.send (node_modules/web3/lib/web3/requestmanager.js:58:32)
      at Eth.get [as accounts] (node_modules/web3/lib/web3/property.js:107:62)
      at Object.<anonymous> (test/e2e/TestScheduleTx.ts:75:34)
      at Generator.next (<anonymous>)
      at fulfilled (test/e2e/TestScheduleTx.ts:4:58)
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:188:7)

Единственная разница между поставщиком HTTP и поставщиком WS заключается в использовании ws://localhost:5454вместо http://localhost:8545. RPC, с которым я говорю, это ganache-cli 6.1.6.

Ответы (2)

Убедитесь, что вы ganache-cli@betaустановили

Вы должны взломать sendи sendAsyncрешить проблему при настройке провайдера.

так:

export const setProvider = (provider: any) => 
    Contracts.concat(HumanFriendlyToken).forEach((contract) => {
        contract.setProvider(provider)
        if (typeof contract.currentProvider.sendAsync !== "function") {
            contract.currentProvider.sendAsync = function() {
                return contract.currentProvider.send.apply(contract.currentProvider, arguments)
            }
        }
    })

^ Удостоверьтесь, что НЕ используете функцию стрелки () => выше, так как она привязывает это к области, а нам это не нужно.

Должно работать после этого

Знаете ли вы, что API для RPC и WS отличается? Не уверен, поддерживает ли это ганаш, с «нормальным» гетом нужно запускать как geth --ws. Это свяжет API веб-сокета с портом 8546по умолчанию.