evmabiless
v0.1.13
Published
Detect ABI from contract EVM bytecode
Downloads
20
Readme
ABI-less contract invocation
This is based on a known list of ABIs, and the contract's bytecode.
Usage
abiList
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:
import { abiObjectList } from 'evmabiless';
// ...
const erc20 = new ethers.Contract(address, abiObjectList(await provider.getCode(address)), provider);
scanContract
scanContract will return all methods in a contract, and hashes for unknown methods.
Parameter is the contract's bytecode (hex encoded).
Bytecode
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 hash
of the method signature), and go to BBBB
if that's the case. This pattern can
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).