Ethers.js: Function Decode example

Created on 15 Jun 2020  路  2Comments  路  Source: ethers-io/ethers.js

Can someone help me with function data decoding:

I have contract: ###0x2a0c0dbecc7e4d658f48e01e3fa353f44050c208###

And Trade function ABI:

{"constant":false,"inputs":[{"name":"tradeValues","type":"uint256[8]"},{"name":"tradeAddresses","type":"address[4]"},{"name":"v","type":"uint8[2]"},{"name":"rs","type":"bytes32[4]"}],"name":"trade","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}

and imputData


How i can get function parameters mapped with this input data using your library?

discussion

Most helpful comment

For this you can use the Interface class directly:

// The ABI is a list of your methods and events
const abi = [ {"constant":false,"inputs":[{"name":"tradeValues","type":"uint256[8]"},{"name":"tradeAddresses","type":"address[4]"},{"name":"v","type":"uint8[2]"},{"name":"rs","type":"bytes32[4]"}],"name":"trade","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"} ];

// An Interface allows encoding and decoding
const iface = new ethers.utils.Interface(abi);

// Your data
const data = "0xef34358800000000000000000000000000000000000000000000000004c9ac80f14d93a000000000000000000000000000000000000000000000007c248edbd15e08d2db000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000038af47900000000000000000000000000000000000000000000000004c9ac80f14d93a00000000000000000000000000000000000000000000000000000000006da63ec00000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000b076a99e0184e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000763fa6806e1acf68130d2d0f0df754c93cc546b20000000000000000000000009fee99fa1eb0c0e7ddbba00ce764ae1fe9bd2684000000000000000000000000bd58cdf2266552d39ad8621793bd60c5b9f97e38000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b97790930819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d28647c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff1015146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a";

// Extract everything
const txInfo = iface.parseTransaction({ data })

// The complete description
console.log(txInfo);
/*
TransactionDescription {
  args:
   [ [ [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber] ],
     [ '0x0000000000000000000000000000000000000000',
       '0x763Fa6806e1acf68130D2D0f0df754C93cC546B2',
       '0x9Fee99FA1eb0C0E7DDbbA00ce764ae1FE9Bd2684',
       '0xbD58cdF2266552D39AD8621793bD60c5b9F97E38' ],
     [ 27, 28 ],
     [ '0x4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b977909',
       '0x30819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d2864',
       '0x7c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff10',
       '0x15146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a' ],
     tradeValues: [ [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber] ],
     tradeAddresses: [ '0x0000000000000000000000000000000000000000',
       '0x763Fa6806e1acf68130D2D0f0df754C93cC546B2',
       '0x9Fee99FA1eb0C0E7DDbbA00ce764ae1FE9Bd2684',
       '0xbD58cdF2266552D39AD8621793bD60c5b9F97E38' ],
     v: [ 27, 28 ],
     rs: [ '0x4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b977909',
       '0x30819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d2864',
       '0x7c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff10',
       '0x15146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a' ] ],
  functionFragment:
   FunctionFragment {
     type: 'function',
     name: 'trade',
     constant: false,
     inputs: [ [ParamType], [ParamType], [ParamType], [ParamType] ],
     outputs: [ [ParamType] ],
     payable: false,
     stateMutability: 'nonpayable',
     gas: null,
     _isFragment: true,
     constructor:
      { [Function: FunctionFragment]
        from: [Function],
        fromObject: [Function],
        fromString: [Function],
        isFunctionFragment: [Function] },
     format: [Function] },
  name: 'trade',
  signature: 'trade(uint256[8],address[4],uint8[2],bytes32[4])',
  sighash: '0xef343588',
  value: BigNumber { _hex: '0x00', _isBigNumber: true } }
*/

// Just the args
console.log(txInfo.args)
/*
[ [ BigNumber { _hex: '0x04c9ac80f14d93a0', _isBigNumber: true },
    BigNumber { _hex: '0x7c248edbd15e08d2db', _isBigNumber: true },
    BigNumber { _hex: '0x2710', _isBigNumber: true },
    BigNumber { _hex: '0x038af479', _isBigNumber: true },
    BigNumber { _hex: '0x04c9ac80f14d93a0', _isBigNumber: true },
    BigNumber { _hex: '0x06da63ec', _isBigNumber: true },
    BigNumber { _hex: '0x038d7ea4c68000', _isBigNumber: true },
    BigNumber { _hex: '0x0b076a99e0184e', _isBigNumber: true } ],
  [ '0x0000000000000000000000000000000000000000',
    '0x763Fa6806e1acf68130D2D0f0df754C93cC546B2',
    '0x9Fee99FA1eb0C0E7DDbbA00ce764ae1FE9Bd2684',
    '0xbD58cdF2266552D39AD8621793bD60c5b9F97E38' ],
  [ 27, 28 ],
  [ '0x4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b977909',
    '0x30819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d2864',
    '0x7c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff10',
    '0x15146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a' ],
  tradeValues: [ BigNumber { _hex: '0x04c9ac80f14d93a0', _isBigNumber: true },
    BigNumber { _hex: '0x7c248edbd15e08d2db', _isBigNumber: true },
    BigNumber { _hex: '0x2710', _isBigNumber: true },
    BigNumber { _hex: '0x038af479', _isBigNumber: true },
    BigNumber { _hex: '0x04c9ac80f14d93a0', _isBigNumber: true },
    BigNumber { _hex: '0x06da63ec', _isBigNumber: true },
    BigNumber { _hex: '0x038d7ea4c68000', _isBigNumber: true },
    BigNumber { _hex: '0x0b076a99e0184e', _isBigNumber: true } ],
  tradeAddresses: [ '0x0000000000000000000000000000000000000000',
    '0x763Fa6806e1acf68130D2D0f0df754C93cC546B2',
    '0x9Fee99FA1eb0C0E7DDbbA00ce764ae1FE9Bd2684',
    '0xbD58cdF2266552D39AD8621793bD60c5b9F97E38' ],
  v: [ 27, 28 ],
  rs: [ '0x4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b977909',
    '0x30819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d2864',
    '0x7c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff10',
    '0x15146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a' ] ]
*/

Hope that helps. :)

All 2 comments

For this you can use the Interface class directly:

// The ABI is a list of your methods and events
const abi = [ {"constant":false,"inputs":[{"name":"tradeValues","type":"uint256[8]"},{"name":"tradeAddresses","type":"address[4]"},{"name":"v","type":"uint8[2]"},{"name":"rs","type":"bytes32[4]"}],"name":"trade","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"} ];

// An Interface allows encoding and decoding
const iface = new ethers.utils.Interface(abi);

// Your data
const data = "0xef34358800000000000000000000000000000000000000000000000004c9ac80f14d93a000000000000000000000000000000000000000000000007c248edbd15e08d2db000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000038af47900000000000000000000000000000000000000000000000004c9ac80f14d93a00000000000000000000000000000000000000000000000000000000006da63ec00000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000b076a99e0184e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000763fa6806e1acf68130d2d0f0df754c93cc546b20000000000000000000000009fee99fa1eb0c0e7ddbba00ce764ae1fe9bd2684000000000000000000000000bd58cdf2266552d39ad8621793bd60c5b9f97e38000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b97790930819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d28647c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff1015146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a";

// Extract everything
const txInfo = iface.parseTransaction({ data })

// The complete description
console.log(txInfo);
/*
TransactionDescription {
  args:
   [ [ [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber] ],
     [ '0x0000000000000000000000000000000000000000',
       '0x763Fa6806e1acf68130D2D0f0df754C93cC546B2',
       '0x9Fee99FA1eb0C0E7DDbbA00ce764ae1FE9Bd2684',
       '0xbD58cdF2266552D39AD8621793bD60c5b9F97E38' ],
     [ 27, 28 ],
     [ '0x4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b977909',
       '0x30819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d2864',
       '0x7c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff10',
       '0x15146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a' ],
     tradeValues: [ [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber],
       [BigNumber] ],
     tradeAddresses: [ '0x0000000000000000000000000000000000000000',
       '0x763Fa6806e1acf68130D2D0f0df754C93cC546B2',
       '0x9Fee99FA1eb0C0E7DDbbA00ce764ae1FE9Bd2684',
       '0xbD58cdF2266552D39AD8621793bD60c5b9F97E38' ],
     v: [ 27, 28 ],
     rs: [ '0x4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b977909',
       '0x30819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d2864',
       '0x7c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff10',
       '0x15146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a' ] ],
  functionFragment:
   FunctionFragment {
     type: 'function',
     name: 'trade',
     constant: false,
     inputs: [ [ParamType], [ParamType], [ParamType], [ParamType] ],
     outputs: [ [ParamType] ],
     payable: false,
     stateMutability: 'nonpayable',
     gas: null,
     _isFragment: true,
     constructor:
      { [Function: FunctionFragment]
        from: [Function],
        fromObject: [Function],
        fromString: [Function],
        isFunctionFragment: [Function] },
     format: [Function] },
  name: 'trade',
  signature: 'trade(uint256[8],address[4],uint8[2],bytes32[4])',
  sighash: '0xef343588',
  value: BigNumber { _hex: '0x00', _isBigNumber: true } }
*/

// Just the args
console.log(txInfo.args)
/*
[ [ BigNumber { _hex: '0x04c9ac80f14d93a0', _isBigNumber: true },
    BigNumber { _hex: '0x7c248edbd15e08d2db', _isBigNumber: true },
    BigNumber { _hex: '0x2710', _isBigNumber: true },
    BigNumber { _hex: '0x038af479', _isBigNumber: true },
    BigNumber { _hex: '0x04c9ac80f14d93a0', _isBigNumber: true },
    BigNumber { _hex: '0x06da63ec', _isBigNumber: true },
    BigNumber { _hex: '0x038d7ea4c68000', _isBigNumber: true },
    BigNumber { _hex: '0x0b076a99e0184e', _isBigNumber: true } ],
  [ '0x0000000000000000000000000000000000000000',
    '0x763Fa6806e1acf68130D2D0f0df754C93cC546B2',
    '0x9Fee99FA1eb0C0E7DDbbA00ce764ae1FE9Bd2684',
    '0xbD58cdF2266552D39AD8621793bD60c5b9F97E38' ],
  [ 27, 28 ],
  [ '0x4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b977909',
    '0x30819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d2864',
    '0x7c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff10',
    '0x15146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a' ],
  tradeValues: [ BigNumber { _hex: '0x04c9ac80f14d93a0', _isBigNumber: true },
    BigNumber { _hex: '0x7c248edbd15e08d2db', _isBigNumber: true },
    BigNumber { _hex: '0x2710', _isBigNumber: true },
    BigNumber { _hex: '0x038af479', _isBigNumber: true },
    BigNumber { _hex: '0x04c9ac80f14d93a0', _isBigNumber: true },
    BigNumber { _hex: '0x06da63ec', _isBigNumber: true },
    BigNumber { _hex: '0x038d7ea4c68000', _isBigNumber: true },
    BigNumber { _hex: '0x0b076a99e0184e', _isBigNumber: true } ],
  tradeAddresses: [ '0x0000000000000000000000000000000000000000',
    '0x763Fa6806e1acf68130D2D0f0df754C93cC546B2',
    '0x9Fee99FA1eb0C0E7DDbbA00ce764ae1FE9Bd2684',
    '0xbD58cdF2266552D39AD8621793bD60c5b9F97E38' ],
  v: [ 27, 28 ],
  rs: [ '0x4627017b1356f69eeb22be5714a776eb22444aab1f1f06aaf73db2649b977909',
    '0x30819bcbf2d30aced3194e0a67f111a30a17d3b8d947bea28173be705b5d2864',
    '0x7c18f4f245bf99ef360fbe036296b141920e6f4927aa1ce9d72e9a07af5aff10',
    '0x15146825ccd28ba8a0cd9ebaa9811039e4a31c94c3b5f9e1ceecd13d0060559a' ] ]
*/

Hope that helps. :)

works like a charm. Thank you

Was this page helpful?
0 / 5 - 0 ratings