ethereum-input-data-decoder
Advanced tools
Comparing version 0.0.15 to 0.0.16
@@ -41,2 +41,3 @@ 'use strict'; | ||
var obj = this.abi[i]; | ||
if (obj.type !== 'constructor') { | ||
@@ -86,5 +87,5 @@ continue; | ||
var dataBuf = new Buffer(data.replace(/^0x/, ''), 'hex'); | ||
var methodId = dataBuf.slice(0, 4).toString('hex'); | ||
var inputsBuf = dataBuf.slice(4); | ||
var dataBuf = Buffer.from(data.replace(/^0x/, ''), 'hex'); | ||
var methodId = dataBuf.subarray(0, 4).toString('hex'); | ||
var inputsBuf = dataBuf.subarray(4); | ||
@@ -100,7 +101,3 @@ var result = this.abi.reduce(function (acc, obj) { | ||
if (hash === methodId) { | ||
// https://github.com/miguelmota/ethereum-input-data-decoder/issues/8 | ||
if (methodId === 'a9059cbb') { | ||
inputsBuf = Buffer.concat([new Buffer(12), inputsBuf.slice(12, 32), inputsBuf.slice(32)]); | ||
} | ||
inputsBuf = normalizeAddresses(types, inputsBuf); | ||
var inputs = ethabi.rawDecode(types, inputsBuf); | ||
@@ -134,2 +131,37 @@ | ||
function normalizeAddresses(types, input) { | ||
var offset = 0; | ||
for (var i = 0; i < types.length; i++) { | ||
var type = types[i]; | ||
if (type === 'address') { | ||
input.set(Buffer.alloc(12), offset); | ||
} | ||
if (isArray(type)) { | ||
var size = parseTypeArray(type); | ||
if (size && size !== 'dynamic') { | ||
offset += 32 * size; | ||
} else { | ||
offset += 32; | ||
} | ||
} else { | ||
offset += 32; | ||
} | ||
} | ||
return input; | ||
} | ||
function parseTypeArray(type) { | ||
var tmp = type.match(/(.*)\[(.*?)\]$/); | ||
if (tmp) { | ||
return tmp[2] === '' ? 'dynamic' : parseInt(tmp[2], 10); | ||
} | ||
return null; | ||
} | ||
function isArray(type) { | ||
return type.lastIndexOf(']') === type.length - 1; | ||
} | ||
module.exports = InputDataDecoder; |
45
index.js
@@ -74,4 +74,4 @@ const fs = require('fs') | ||
const dataBuf = Buffer.from(data.replace(/^0x/, ''), 'hex') | ||
const methodId = dataBuf.slice(0, 4).toString('hex') | ||
var inputsBuf = dataBuf.slice(4) | ||
const methodId = dataBuf.subarray(0, 4).toString('hex') | ||
var inputsBuf = dataBuf.subarray(4) | ||
@@ -85,7 +85,3 @@ const result = this.abi.reduce((acc, obj) => { | ||
if (hash === methodId) { | ||
// NOTE: https://github.com/miguelmota/ethereum-input-data-decoder/issues/8 | ||
if (methodId === 'a9059cbb') { | ||
inputsBuf = Buffer.concat([new Buffer(12), inputsBuf.slice(12, 32), inputsBuf.slice(32)]) | ||
} | ||
inputsBuf = normalizeAddresses(types, inputsBuf) | ||
const inputs = ethabi.rawDecode(types, inputsBuf) | ||
@@ -116,2 +112,37 @@ | ||
function normalizeAddresses (types, input) { | ||
let offset = 0 | ||
for (let i = 0; i < types.length; i++) { | ||
const type = types[i] | ||
if (type === 'address') { | ||
input.set(Buffer.alloc(12), offset) | ||
} | ||
if (isArray(type)) { | ||
const size = parseTypeArray(type) | ||
if (size && size !== 'dynamic') { | ||
offset += 32 * size | ||
} else { | ||
offset += 32 | ||
} | ||
} else { | ||
offset += 32 | ||
} | ||
} | ||
return input | ||
} | ||
function parseTypeArray (type) { | ||
const tmp = type.match(/(.*)\[(.*?)\]$/) | ||
if (tmp) { | ||
return tmp[2] === '' ? 'dynamic' : parseInt(tmp[2], 10) | ||
} | ||
return null | ||
} | ||
function isArray (type) { | ||
return type.lastIndexOf(']') === type.length - 1 | ||
} | ||
module.exports = InputDataDecoder |
{ | ||
"name": "ethereum-input-data-decoder", | ||
"version": "0.0.15", | ||
"version": "0.0.16", | ||
"description": "Ethereum smart contract transaction input data decoder", | ||
@@ -11,3 +11,4 @@ "main": "dist/index.js", | ||
"lint": "standard index.js test/*.js", | ||
"lint:fix": "standard --fix index.js test/*.js" | ||
"lint:fix": "standard --fix index.js test/*.js", | ||
"prepublishOnly": "npm run lint:fix && npm run build" | ||
}, | ||
@@ -14,0 +15,0 @@ "repository": { |
const fs = require('fs') | ||
const test = require('tape') | ||
const InputDataDecoder = require('../') | ||
const InputDataDecoder = require('../index') | ||
// NOTE: Example input data from this transaction | ||
// https://etherscan.io/tx/0xa6f019f2fc916bd8df607f1c99148ebb06322999ff08bc88927fe8406acae1b2 | ||
test('decoder', t => { | ||
// https://etherscan.io/tx/0xa6f019f2fc916bd8df607f1c99148ebb06322999ff08bc88927fe8406acae1b2 | ||
const data = '0x67043cae0000000000000000000000005a9dac9315fdd1c3d13ef8af7fdfeb522db08f020000000000000000000000000000000000000000000000000000000058a20230000000000000000000000000000000000000000000000000000000000040293400000000000000000000000000000000000000000000000000000000000000a0f3df64775a2dfb6bc9e09dced96d0816ff5055bf95da13ce5b6c3f53b97071c800000000000000000000000000000000000000000000000000000000000000034254430000000000000000000000000000000000000000000000000000000000' | ||
@@ -65,2 +63,17 @@ | ||
}) | ||
// https://etherscan.io/tx/0x94fadf5f5c7805b8ceb8a13a0a7fbce06054ff08cdfdc2fd555a7902592aebe6 | ||
t.test('erc721 transferFrom', t => { | ||
t.plan(3) | ||
const abi = JSON.parse(fs.readFileSync(`${__dirname}/data/erc721_abi.json`)) | ||
const decoder = new InputDataDecoder(abi) | ||
const data = fs.readFileSync(`${__dirname}/data/erc71_transferfrom_tx_data.txt`) | ||
const result = decoder.decodeData(data) | ||
t.equal(result.inputs[0].toString(16), '10017ca37b1257ac0771e24652aa28c758e378eb') | ||
t.equal(result.inputs[1].toString(16), 'e7a632d89104385bdd3992eeb82cffeb48e4e539') | ||
t.equal(result.inputs[2].toString(16), '5dc5') | ||
}) | ||
}) | ||
@@ -67,0 +80,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
984675
19
26038