ethjs / ethjs-abi

Just the encoding and decoding from the ethers-wallet module.
MIT License
32 stars 31 forks source link

TypeError thrown when event received. #15

Open kybernetikos opened 6 years ago

kybernetikos commented 6 years ago

TypeError thrown when event received.

Running in nodejs, I watch for the following event:

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

When the event occurs, an exception is thrown:

Error: [ethjs-filter] while decoding filter change event data from RPC '[{"logIndex":"0","transactionIndex":"0","transactionHash":"0x6b0d1c8f2b072615aab822459b6318bfad01dca4663c2c4d41c6cdd1d84b3033","blockHash":"0x1f603b873f6e016ce99a2f4a34b13e877cbdd94308e4fc4fbd42f1d8a132cb1a","blockNumber":"17","address":"0x345ca3e014aaf5dca488057592ee47305d9b3e10","data":"0x0000000000000000000000000000000000000000000000001bc16d674ec80000","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57","0x000000000000000000000000f17f52151ebef6c7334fad080c5704d77216b732"],"type":"mined"}]': TypeError: Cannot read property 'slice' of undefined
    at C:\Development\sandbox\ethereum\repl-alliance\node_modules\ethjs-filter\lib\index.js:29:31
    at C:\Development\sandbox\ethereum\repl-alliance\node_modules\ethjs-query\lib\index.js:101:16
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:160:7)

The problem appears to be caused in the decodeEvent function. My topics array contains only a single value -0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. This was set by eth-contract v0.1.9 and is the hash of the signature of the Transfer event. However, the code in decodeEvent looks for a value in topics[1].

The event has two indexed 'inputs' and is not anonymous, but there is only a single item in the topics array (the signature), so the .slice is called on undefined, and the exception is thrown.

SilentCicero commented 6 years ago

Ah, nice catch! This module will eventually be moved over to ethers.js module, but do you have a fix in the meantime?

Sent from my iPhone

On Apr 8, 2018, at 11:34 PM, kybernetikos notifications@github.com wrote:

TypeError thrown when event received.

Running in nodejs, I watch for the following event:

event Transfer(address indexed _from, address indexed _to, uint256 _value);

When the event occurs, an exception is thrown:

Error: [ethjs-filter] while decoding filter change event data from RPC '[{"logIndex":"0","transactionIndex":"0","transactionHash":"0x6b0d1c8f2b072615aab822459b6318bfad01dca4663c2c4d41c6cdd1d84b3033","blockHash":"0x1f603b873f6e016ce99a2f4a34b13e877cbdd94308e4fc4fbd42f1d8a132cb1a","blockNumber":"17","address":"0x345ca3e014aaf5dca488057592ee47305d9b3e10","data":"0x0000000000000000000000000000000000000000000000001bc16d674ec80000","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000627306090abab3a6e1400e9345bc60c78a8bef57","0x000000000000000000000000f17f52151ebef6c7334fad080c5704d77216b732"],"type":"mined"}]': TypeError: Cannot read property 'slice' of undefined at C:\Development\sandbox\ethereum\repl-alliance\node_modules\ethjs-filter\lib\index.js:29:31 at C:\Development\sandbox\ethereum\repl-alliance\node_modules\ethjs-query\lib\index.js:101:16 at at process._tickCallback (internal/process/next_tick.js:160:7) The problem appears to be caused in the decodeEvent function. My topics array contains only a single value -0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. This was set by eth-contract v0.1.9 and is the hash of the signature. However, the code in decodeEvent looks for a value in topics[1].

The event has two indexed 'inputs' and is not anonymous, but there is only a single item in the topics array (the signature), so the .slice is called on undefined, and the exception is thrown.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

kybernetikos commented 6 years ago

do you have a fix in the meantime?

That depends a little. I don't have enough background in the code to be confident with suggesting a fix at the moment.

I look at decodeEvent, and I see that it separates indexed values from nonindexed values. I don't really understand why it needs to read some values from the topics (the indexed values) and some values from the data (the nonindexed values). Is it because data doesn't include indexed values?

If data doesn't include indexed values, and they're not in the topics array either, then I'm not sure where they can be read from. Or does data sometimes include indexed values and not other times? In which case, we could check to see if the values are in topics and use them from there, and if not, try to read them from data.

SilentCicero commented 6 years ago

I'll take a closer look today, can you provide what network you are on? (Eg rinkeby)

Sent from my iPhone

On Apr 9, 2018, at 9:45 AM, kybernetikos notifications@github.com wrote:

do you have a fix in the meantime?

That depends a little. I don't have enough background in the code to be confident with suggesting a fix at the moment.

I look at decodeEvent, and I see that it separates indexed values from nonindexed values. I don't really understand why it needs to read some values from the topics (the indexed values) and some values from the data (the nonindexed values). Is it because data doesn't include indexed values?

If data doesn't include indexed values, and they're not in the topics array either, then I'm not sure where they can be read from. Or does data sometimes include indexed values and not other times? In which case, we could check to see if the values are in topics and use them from there, and if not, try to read them from data.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.

kybernetikos commented 6 years ago

I've been running against ganache and ganache-cli.

(which incidentally shows another problem - the first 16 watchers for the node don't seem to work properly - I think the watcher ids are being set without a leading 0 which ganache expects, or something like that)

My smart contract is https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20.sol and my listen code is

            // e.g. event = EIP20.Transfer
            const filter = event({ delay:10000 });

            filter.new({
                "fromBlock": "latest",
                "toBlock": "latest"
            }).then((filterId) => {
                console.log('\nFilter id ' + filterId + ' created.');
                filter.watch((err, result) => {
                    if (err) {
                        console.log('\nEvent error:', err);
                    } else {
                        console.log('\nEvent:', name + '.' + evtName, result);
                    }
                });
            });
SilentCicero commented 6 years ago

Will review tomorrow.

Sent from my iPhone

On Apr 9, 2018, at 2:51 PM, kybernetikos notifications@github.com wrote:

I've been running against ganache and ganache-cli.

(which incidentally shows another problem - the first 16 watchers for the node don't seem to work properly - I think the watcher ids are being set without a leading 0 which ganache expects, or something like that)

My smart contract is https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20/EIP20.sol which and my listen code is

        // e.g. event = EIP20.Transfer
        const filter = event({ delay:10000 });

        filter.new({
            "fromBlock": "latest",
            "toBlock": "latest"
        }).then((filterId) => {
            console.log('\nFilter id ' + filterId + ' created.');
            filter.watch((err, result) => {
                if (err) {
                    console.log('\nEvent error:', err);
                } else {
                    console.log('\nEvent:', name + '.' + evtName, result);
                }
            });
        });

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.

coinsandsteeldev commented 6 years ago

its gone

olivier-nerot commented 6 years ago

I'm faced to the same error. Trying to understand it, to make my project work.

In ethjs-contract (https://github.com/ethjs/ethjs-contract/blob/master/dist/ethjs-contract.js) On line 7398, we have return abi.decodeEvent(methodObject, logData, filterTopcis); With filterTopcis defined on line 7388

      var filterTopic = '0x' + keccak256(methodObject.name + '(' + filterInputTypes.join(',') + ')');
      var filterTopcis = [filterTopic];

So abi.decodeEvent is called with a filterTopcis with a single element.

But in eth-abi (https://github.com/ethjs/ethjs-abi/blob/master/src/index.js), on line 147 : const topic = new Buffer(topics[i + topicOffset].slice(2), 'hex'); with const topicOffset = eventObject.anonymous ? 0 : 1;

So the decodeEvent may look for topics[1] if the event is not anonymous, which leads to the error seen. I still wonder how this could be solved...

(by the way, may be filterTopcis should be modified to filterTopics in ethjs-contract.js...)