Detect ABI from contract EVM bytecode
npm install evmabiless
This is based on a known list of ABIs, and the contract's bytecode.
abiList returns a list of all known ABIs in a contract in human readable format.
Parameter is the contract's bytecode (hex encoded).
For a very basic sample:
``js
import { abiObjectList } from 'evmabiless';
// ...
const erc20 = new ethers.Contract(address, abiObjectList(await provider.getCode(address)), provider);
`
scanContract will return all methods in a contract, and hashes for unknown methods.
Parameter is the contract's bytecode (hex encoded).
EVM contracts will have a entry point that will read the function being called
from the stack and go to the right part of the code. The bytecode involved is
fairly simple, and while it might be prefixed from some range checks (in order
to make the code run faster) it will always perform the same checks:
``
DUP1
PUSH4 0xAAAAAAAA
EQ
PUSH2 0xBBBB
JUMPI
This code will check if the calldata starts with AAAAAAAA (the keccak256 hashBBBB` if that's the case. This pattern can
of the method signature), and go to
be easily recognized and made into a regexp:
/8063([0-9a-fA-F]{8})1461([0-9a-fA-F]{4})57/
A future version of this library will actually parse bytecode and return more
information such as whether a contract is payable or not, and possibly
recognize methods having the same 4 bytes keccak256 hash, but for now this
should work with all contracts generated by Solidity (to be tested).