evmabiless

package module
v0.1.15 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 7, 2024 License: MIT Imports: 1 Imported by: 0

README

GoDoc

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

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Abi

type Abi struct {
	ABI             string   `json:"abi"`
	Compact         string   `json:"compact"`
	Inputs          []*AbiIO `json:"inputs"`
	Name            string   `json:"name"`
	Outputs         []*AbiIO `json:"outputs"`
	StateMutability string   `json:"stateMutability"`
	Type            string   `json:"type"`
}

Abi is the struct type used to represent a function or event ABI

func AbiList

func AbiList(bytecode []byte) []*Abi

AbiList returns a list of ABIs found in the provided bytecode, ignoring any unknown ABIs

func LookupAbi

func LookupAbi(pfx MethodPrefix) *Abi

LookupAbi will return the ABI matching the provided prefix, or nil if no such ABI is known

type AbiIO

type AbiIO struct {
	InternalType string `json:"internalType"`
	Name         string `json:"name"`
	Type         string `json:"type"`
	Indexed      bool   `json:"indexed,omitempty"`
}

type MethodPrefix

type MethodPrefix [4]byte

func ScanContract

func ScanContract(bytecode []byte) []MethodPrefix

ScanContract will scan the bytecode of a contract and return a list of method hash prefixes

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL