Consensys / Consensys/abi-decoder

Invalid continuation byte and Invalid UTF-8 detected

Open
#32 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
641
Forks
215
PR merge metrics
No merged PRs in 30d

Description

I am having trouble decoding transaction inputs to older transactions found on the blockchain. I am digging through the history of various smart contracts as a kind of "archeological" investigation.

Here is my test program showing the issue for a variety of contracts (APIKey deliberately omitted):

```
const abiDecoder = require( 'abi-decoder' ) ;
const etherscanApi = require( 'etherscan-api' ).init( APIKey ) ;
const web3Utils = require( "web3-utils" ) ;
const Web3 = require( 'web3' );

async function test( contractName, contractAddress, txHash ) {
const web3 = new Web3( new Web3.providers.HttpProvider( 'https://mainnet.infura.io/v3/d53c56d7964b40f4b1ed47dec984de12' ) ) ;
const tx = await web3.eth.getTransaction( txHash ) ;
const receipt = await web3.eth.getTransactionReceipt( txHash ) ;
const encodedInput = tx.input ;

console.log( '\ncontractName', contractName ) ;
console.log( 'contractAddress', contractAddress ) ;
console.log( 'txHash', txHash ) ;
console.log( 'receipt.status', receipt.status ) ;
console.log( 'encodedInput', encodedInput ) ;

const encodedAbi = await etherscanApi.contract.getabi( contractAddress ) ;
var decodedAbi = JSON.parse( encodedAbi.result ) ;

abiDecoder.addABI( decodedAbi ) ;
var decodedInput ;
try{
decodedInput = abiDecoder.decodeMethod( encodedInput ) ;
} catch( error ) {
decodedInput = error.message ;
}

console.log( 'decodedInput', decodedInput ) ;
console.log( 'encodedInput.slice( 2, 10 )', encodedInput.slice( 2, 10 ) ) ;
}

async function main() {
await test ('StakeDice', '0x4420974a2d98b8b5ee990fc4b32ca66b1c184100', '0xc9d62a2cf62abb1c6726dc64bcba87f39d93d330ebd008ed8d6b3ac76104d9e8' ) ;
await test( 'Cillionaire', '0x02b97cca6d6a5227e464b2a60ee1a580ea4f7da9', '0xa2a4d1a082a9ee3fb2f9fa33979a0247b0dcf6a47295d281789c02bed49e70b8' ) ;
await test( 'EOSBetSlots', '0x4a3e0c60f7fa67e8b65c401ddbbf7c17fea5fe40', '0x269d51fd6a00228c76e9a57c40f719292807ef29335d9281e75c51dc8aecab72' ) ;
await test( 'EtherFlipGold', '0x48d8f22d45e40F34cB7C10799F31246F134E9B7f', '0xc1214a3722ca61685f92dd680846551cdb841fe3fa4d198e6e520023e17007c3' ) ;
await test( 'EthereumPot', '0x5a13caa82851342e14cd2ad0257707cddb8a31b7', '0x492e1c40d6e8a26bb8b226bb79b815b1a7f6b2a5b17c530912c2f7f938b440b6' ) ;
}

main() ;
```

Running the code I get:

```
contractName StakeDice
contractAddress 0x4420974a2d98b8b5ee990fc4b32ca66b1c184100
txHash 0xc9d62a2cf62abb1c6726dc64bcba87f39d93d330ebd008ed8d6b3ac76104d9e8
receipt.status true
encodedInput 0x27dc297ef998bc28180fb745edd710cd10930dd88e6d60d749d0309580c5f45786e6da2800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000004c1099aec00000000000000000000000000000000000000000000000000000000
decodedInput Invalid continuation byte
encodedInput.slice( 2, 10 ) 27dc297e

contractName Cillionaire
contractAddress 0x02b97cca6d6a5227e464b2a60ee1a580ea4f7da9
txHash 0xa2a4d1a082a9ee3fb2f9fa33979a0247b0dcf6a47295d281789c02bed49e70b8
receipt.status undefined
encodedInput 0x38bbfa50f1d9916f002d89d9d5bf0db716d1b232d5efe39bc01cd3175744d6f8f07f58ff000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000007658858778c7c140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c14c50010498c36fc999f7a37ffffe7e4207142d9f708b96f190cfaed75133dba388ac694c2f6db039f926344c918a1d96142a95c332a5403b21e94953a9c75bc27d4290a33044022003bd07a86cb31b9beabbeefa55f9343fdff77afd840da1a43a714948c32e70d1022004f86513ff6689c5553599ccc60da62e063411e484e250545f844a0ba3d1e57ffd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c9034ee368594c76fc4a7cd1faa63873389c910ace310f7926defdbed0df9335a0000000000000000070376ad70262059f46bd8c1a68209d87c5fc7a5ab1ee794ed96c72e210b8cb036304402201928a7176a07cd12634b792760d770eb1b20516f2bb45536fbf8d8f7f6b5ae14022016fc7bd2310822b01a7cfd6ee6945d7ae61d817564e8312534dbd138516329c204089c95cc443809b64b0d21991f613a2d3cf2d60e2c961770814ab715f1273dac90855d05d9ae9d193e7f5f7ad53715eb39ee66de62f443bd42a1b73b5eeaf8e33045022100986406c9e5a118a043c67ff21d4bae45905802843a613fb7f3e9650d275ade9d02202593bd41512c220268c5890892e5adfb3c99e42c425923db49a79c9cc03bd34c00000000000000000000000000000000000000000000000000000000000000
decodedInput Invalid UTF-8 detected
encodedInput.slice( 2, 10 ) 38bbfa50

contractName EOSBetSlots
contractAddress 0x4a3e0c60f7fa67e8b65c401ddbbf7c17fea5fe40
txHash 0x269d51fd6a00228c76e9a57c40f719292807ef29335d9281e75c51dc8aecab72
receipt.status false
encodedInput 0x38bbfa503dd56c1618aff7380e778bf4798377a9975e48f29c30bdcddd57b685d8cf1e4b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001e48ef0cedd2a26b1530d36d2a509449d8850988416c6cf3340d6ef9167c72000000000000000000000000000000000000000000000000000000000000000001c14c50010498c36fc999f7a37ffffe7e4207142d9f708b96f190cfaed75133dba388ac694c2f6db039f926344c918a1d96142a95c332a5403b21e94953a9c75bc27d4290a33044022003bd07a86cb31b9beabbeefa55f9343fdff77afd840da1a43a714948c32e70d1022004f86513ff6689c5553599ccc60da62e063411e484e250545f844a0ba3d1e57ffd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505ca050cf2a4e30f7667cbdc450e34618f07f8a62611261a2efa97b8f9c701826fd00000000000000001efebb1674c4f6c18db3f1edff0f5d61bd8826b321b1e7327b9c9579b7bde14a8b30440220722eb459dc38a54421f9e517c0cde71d1f2db790f4cba0974b77e578739accdc022050c207f8a2e8392015b13a9fb11be0a3cb22f70ae21a63f3a265b280e099c7af04def38033713f0c5b3bea0f0eeb027f6f50936fe535f841ef1fe305d4fea55884d9a251254e6256c896d4331586ff55449cadb48eddb4470aed039144741e87a13045022100fd4cef1f790222a005e3a353d39ae1e43e5986f30a7f3de56fec1d5c1321035102206463046b56634a52727878b57b8104d23ba1b3326bc40147e50075125fff371600000000000000000000000000000000000000000000000000000000000000
decodedInput Invalid continuation byte
encodedInput.slice( 2, 10 ) 38bbfa50

contractName EtherFlipGold
contractAddress 0x48d8f22d45e40F34cB7C10799F31246F134E9B7f
txHash 0xc1214a3722ca61685f92dd680846551cdb841fe3fa4d198e6e520023e17007c3
receipt.status undefined
encodedInput 0x38bbfa50c300752bf81eb28e5bb5dc0c56a8ab3c5d09b439675fd41507482d1aa20d08b6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002d0e900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c14c50010498c36fc999f7a37ffffe7e4207142d9f708b96f190cfaed75133dba388ac694c2f6db039f926344c918a1d96142a95c332a5403b21e94953a9c75bc27d4290a33044022003bd07a86cb31b9beabbeefa55f9343fdff77afd840da1a43a714948c32e70d1022004f86513ff6689c5553599ccc60da62e063411e484e250545f844a0ba3d1e57ffd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505cef1af03d86a48b764836e68f153a133c41a9b969795e1464da88ed2df58eb0d000000000000000000272bcb2c4e011f02efc6ce21f381b499d4c7fedfaa26de1390415527780ae7bed3044022004dbcbc8e05c03f710b545395561c0a410433504ef25c2a70c3a55bf59eac5bb02205d219f57f6ae9e4de9a80680647cf1fb7fb0510ae553e33a1f6a4971a4980fc20440fa549a41856c4071dc4a7d8953557f7b91bd696d3edc5343150a9d2fffdc68fe5d74407187f55f0a8df82ce750758d60bdc492438c3c7713f1808d424d89b73045022100d8de457e4f7c28e2c38439fc412cf3f7ecd497b9089d143287fdc1d28d58ee6e02204a63347848e5f2c187ade30f560f2eaf736f43f7a5ef36e9cde9dbbf617c644800000000000000000000000000000000000000000000000000000000000000
decodedInput Invalid continuation byte
encodedInput.slice( 2, 10 ) 38bbfa50

contractName EthereumPot
contractAddress 0x5a13caa82851342e14cd2ad0257707cddb8a31b7
txHash 0x492e1c40d6e8a26bb8b226bb79b815b1a7f6b2a5b17c530912c2f7f938b440b6
receipt.status undefined
encodedInput 0x38bbfa50e6ce11cd8c2e4adb88028c5868da63bddd32fb64905c01c2323369e7561fc336000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000a8d61c48665a7db6211740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c24c50010498c36fc999f7a37ffffe7e4207142d9f708b96f190cfaed75133dba388ac694c2f6db039f926344c918a1d96142a95c332a5403b21e94953a9c75bc27d4290a33044022003bd07a86cb31b9beabbeefa55f9343fdff77afd840da1a43a714948c32e70d1022004f86513ff6689c5553599ccc60da62e063411e484e250545f844a0ba3d1e57ffd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c402449d4602050267dfa4acbe43675e02ac8a477d91bbf33fab46a42c58e95ec00000000000000000a1ec1cdd386d0aafee7de13885b2cee69f3974b0829c0858fcf419e9e9ea609253145022100bc6d73b7b83c37c841dd24aec151d2e359f93fcf3df0882b08597bc95c0bc8d40220620c95117d2695c41aa3ec5a8e83297633d1e50af5d1aef37d4e017aa72c1824041a098edd9f3f8a25940bec7a6a28c23e234000c9e6ca961a2fe739aa8b660cc380b2be58a4050eceb5c1d15f7d849a162e3b542076ba9494beec1857a68e77e83045022100e398782df9507367cf0153f8ec25905e436fea91d72044f19671109b0abef89702206ddedfd01fd84c447b027a15dd00cf64a6b88986e0a6ddb598794bfa9eca5381000000000000000000000000000000000000000000000000000000000000
decodedInput Invalid UTF-8 detected
encodedInput.slice( 2, 10 ) 38bbfa50
```

What I need is a way to catch the exceptions at the level of the individual parameters, and not at the level of the whole parameter list. The messages themselves are correct. For example if you look here [https://etherscan.io/tx/0x492e1c40d6e8a26bb8b226bb79b815b1a7f6b2a5b17c530912c2f7f938b440b6#decodetab](url) there are indeed invalid UTF-8 characters in the string. I need that string, with the invalid characters for my "archeological" investigations please.

$ node -v v10.15.0
$ npm -v 6.4.1
$ uname -a 18.2.0 Darwin K

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.