Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@ethereum-sourcify/contract-call-decoder

ethereum46MIT0.2.12TypeScript support: included

Library to decode Ethereum smart contract calls into human-readable descriptions using ABI and NatSpec

sourcify, ethereum, call, contract, smart-contract, metadata, solidity, ipfs

readme

contract-call-decoder

Package to decode Ethereum transactions into human-readable format using the ABI JSON and the NatSpec documentation, which are both found in the Solidity contract metadata.

The decoder will also evaluate the NatSpec Dynamic Expressions meaning it will fill in the values of the parameters found in the call. So for the function:

/// @dev Has to be called by the owner. The _index value `_index` can't be larger than the people array length.
function chooseFavoritePerson(uint256 _index) public returns (Person memory, uint) {

the decoding of chooseFavoritePerson(1) call will be:

Has to be called by the owner. The _index value 1 can't be larger than the people array length.

Install

yarn add @ethereum-sourcify/contract-call-decoder

Usage

Example below given for the chooseFavoritePerson(3) method of the contract SimpleStorageNatSpec (verified at Sepolia 0x09aFa1879fa654226D522f7099583d54ee8F18f4)

import {
  decodeContractCall,
  MetadataSources,
} from '@ethereum-sourcify/contract-call-decoder';

// ethers and web3 transactions are compatible
const tx = {
  to: '0x09aFa1879fa654226D522f7099583d54ee8F18f4',
  data: '0xae7cd3ce0000000000000000000000000000000000000000000000000000000000000001', // chooseFavoritePerson(3)
};

// Using metadata fetched from Sourcify API https://repo.sourcify.dev...
let decodedObj: DecodedContractCall;

// async function
decodedObj = await decodeContractCall(tx, { chainId: 11155111 });

import provider from 'eth-provider';

// Using metadata fetched from the embeded IPFS hash inside contract's bytecode
decodedObj = await decodeContractCall(tx, {
  source: MetadataSources.BytecodeMetadata,
  rpcProvider: provider('https://rpc.sepolia.dev');, // RPC Provider to fetch the contract bytecode
});

Returned DecodedContractCall is slightly different than the userdoc and devdoc output in the metadata and grouped under "contract" and the "method" being called.

// Output:
{
  "contract": {
    // @author field above the contract
    "author": "John Doe",
    // @title field above the contract
    "title": "A simple example contract to demonstrate NatSpec",
    // @dev field above the contract
    "details": "This message is intended for contract developers. Add technical details etc. here",
    // @custom:experimental
    "custom": {
      "experimental": "This is an experimental tag."
    }
  },
  "method": {
    // Required, Canonical function selector string
    "selector": "chooseFavoritePerson(uint256)",
    // Required
    "abi": {...},
    // @dev field above the function
    "details": "Has to be called by the owner. The _index value 1 can't be larger than the people array length.",
    // @param fields
    "params": {
      "_index": "The index of the favorite person"
    },
    // @return fields
    "returns": {
      "_0": "Newly chosen favorite Person",
      "_1": "The index of the new favorite Person",
    },
    // @notice field
    "notice": "Chooses the person at index 1 as the favorite person",
    // TODO: This output is incorrect?
    // Required
    "decodedParams": [
      1n,
    ],
    // @custom:status
    "custom": {
      "status": "production-ready"
    }
  }
}

Right now the contract-call-decoder uses @blossom-labs/rosette-radspec to interpret the notice, but it's experimental. This feature might change in the future.

changelog

Changelog for @ethereum-sourcify/contract-call-decoder

All notable changes to this project will be documented in this file.

@ethereum-sourcify/contract-call-decoder@0.2.12 - 2024-05-14

  • fix tests

@ethereum-sourcify/contract-call-decoder@0.2.11 - 2024-03-28

  • Bump @ethereum-sourcify/bytecode-utils to 1.2.7

@ethereum-sourcify/contract-call-decoder@0.2.10 - 2024-02-26

  • Fix fsevents to the optionalDependencies for Linux builds.

@ethereum-sourcify/contract-call-decoder@0.2.9 - 2024-02-22

  • Bump @ethereum-sourcify/bytecode-utils to 1.2.6

@ethereum-sourcify/contract-call-decoder@0.2.8 - 2023-12-19

  • Bump @ethereum-sourcify/bytecode-utils to 1.2.5

@ethereum-sourcify/contract-call-decoder@0.2.7 - 2023-12-19

  • Bump Typscript version and move the dependency to project root.

@ethereum-sourcify/contract-call-decoder@0.2.6 - 2023-11-03

  • Fix linter

@ethereum-sourcify/contract-call-decoder@0.2.5 - 2023-10-19

  • Bump to sync the tags on master

@ethereum-sourcify/contract-call-decoder@0.2.4 - 2023-10-09

  • Remove package-lock.json as it is managed by root package.json by lerna

@ethereum-sourcify/contract-call-decoder@0.2.3 - 2023-09-04

No changes this release. This marks the start of the changelog for this module.

Older releases

Previously, the releases were not done one separate modules of Sourcify but for the repository as a whole. You can find the changelog for those releases in older releases for this repository.