# evmabiless

> Detect ABI from contract EVM bytecode

Latest version **0.1.13** (published 2024-01-27) · MIT license · 0 weekly downloads

## Install

```sh
npm install evmabiless
pnpm add evmabiless
yarn add evmabiless
bun add evmabiless
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned.

## Facts

| | |
|---|---|
| Version | 0.1.13 |
| Published | 2024-01-27 |
| First published | 2022-04-13 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 294.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | Mark Karpeles |
| Maintainers | magicaltux |

## Links

- npm: https://www.npmjs.com/package/evmabiless
- Repository: https://github.com/KarpelesLab/evmabiless
- Homepage: https://github.com/KarpelesLab/evmabiless#readme
- Issues: https://github.com/KarpelesLab/evmabiless/issues
- npm.io page: https://npm.io/package/evmabiless

## Recent versions

- 0.1.13 (latest) — 2024-01-27
- 0.1.12 — 2024-01-27
- 0.1.11 — 2024-01-27
- 0.1.10 — 2024-01-27
- 0.1.9 — 2024-01-27
- 0.1.8 — 2024-01-25
- 0.1.7 — 2022-11-08
- 0.1.6 — 2022-10-30
- 0.1.5 — 2022-05-17
- 0.1.4 — 2022-05-17
- 0.1.3 — 2022-04-13
- 0.1.2 — 2022-04-13
- 0.1.1 — 2022-04-13
- 0.1.0 — 2022-04-13

## README

[![GoDoc](https://godoc.org/github.com/KarpelesLab/evmabiless?status.svg)](https://godoc.org/github.com/KarpelesLab/evmabiless)

# 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:

```js
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).

---
_Source: https://npm.io/package/evmabiless · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
