SkillAgentSearch skills...

Evmcodegen

A synthetic evm bytecode generation library and cmdline utility to fuzz the ethereum stack machine

Install / Use

/learn @ethereum/Evmcodegen
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

evmcodegen

Ever wanted to generate and manipulate ethereum evm bytecode? This is your chance.

Use various strategies to generate Instructions, fix the stack layout, fix jump addresses, balance the stack and manipulate the code before serializing Instruction objects to bytecode.

library

import evmdasm
# import distribution and random codegen strategy
from evmcodegen.distributions import EVM_CATEGORY
from evmcodegen.generators.distribution import GaussDistrCodeGen
# import main codegen class
from evmcodegen.codegen import CodeGen

# prepare random number generators for stack arg generator

# Rnd is just a utility class providing random byte and number generators. see codegen.py
VALUEMAP ={
    evmdasm.argtypes.Address: lambda: Rnd.byte_sequence(20),
    evmdasm.argtypes.Word: lambda: Rnd.byte_sequence(32),
    evmdasm.argtypes.Timestamp: lambda: Rnd.byte_sequence(4),
    evmdasm.argtypes.Data: lambda: Rnd.byte_sequence(Rnd.uni_integer(0, Rnd.opcode())),
    evmdasm.argtypes.CallValue: lambda: Rnd.uni_integer(0,1024),
    evmdasm.argtypes.Gas: lambda: Rnd.uni_integer(0,1024),
    evmdasm.argtypes.Length: lambda: Rnd.small_memory_length_1024(),
    evmdasm.argtypes.MemOffset: lambda: Rnd.small_memory_length_1024(),
    evmdasm.argtypes.Index256: lambda: Rnd.uni_integer(1,256),
    evmdasm.argtypes.Index64: lambda: Rnd.uni_integer(1,64),
    evmdasm.argtypes.Index32: lambda: Rnd.length_32(),
    evmdasm.argtypes.Byte: lambda: Rnd.byte_sequence(1),
    evmdasm.argtypes.Bool: lambda: Rnd.byte_sequence(1),
    evmdasm.argtypes.Value: lambda: Rnd.uni_integer(),
    #evmdasm.argtypes.Label: lambda: 0xc0fefefe,  # this is handled by fix_code_layout (fix jumps)
}

# create random number generator
rnd_codegen = GaussDistrCodeGen(distribution=EVM_CATEGORY)

# generate code, fix stack arguments, make jumps land on jumpdests, fix stack balance
evmcode = CodeGen()\
            .generate(generator=rnd_codegen, length=None, min_gas=20)\
            .fix_stack_arguments(valuemap=VALUEMAP)\
            .fix_jumps().fix_stack_balance()

# print evmcode as string
print("0x%s" % evmcode.assemble().as_hexstring)

# disassemble and print listing
print(evmcode.reassemble().instructions.as_string)

# print some stats
print(CodeGen.stats(evmcode))

cmdline

python -m evmcodegen [--disassemble] [--count 1] [--stats]

Usage: __main__.py [options]

Options:
  -h, --help            show this help message and exit
  -v VERBOSITY, --verbosity=VERBOSITY
                        available loglevels:
                        critical,fatal,error,warning,warn,info,debug,notset
                        [default: critical]
  -g GENERATOR, --generator=GENERATOR
                        select generator (default: DistrCategory)
  -d, --disassemble     show disassembly
  -c COUNT, --count=COUNT
                        number of evmcodes to generate
  -m MIN_GAS, --min-gas=MIN_GAS
                        generate instructions consuming at least this amount
                        of gas
  -l LENGTH, --length=LENGTH
                        instructions per generated code
  -s, --stats           show statistics
  -b, --balance         balance the stack
#> python3 -m evmcodegen --disassemble --stats
0x614e7e674fb87cc2d90eda346716ddb46d033b432f1677e1183a7c67c851296d5e7665ca56e7dd2158341bdb43fac760af6103486101546102dc73f9be0ce6ff661facc3be2288534765a056c1ac81610169f46e8d4b95ce3bd940e60687688ec7d9b6771bb0d8b79e269479c5828966eb6449d66f267a852493302062d35abc7c9b12b8365060660f8462edfefc847086df38ccd44a9d262a1dd50555b8692e2eddd62e1cbb07c9a66b9a237026291f95884b8fe26673544d46c8936bea177da53e3c1312bda38f4f3ba068f5e8a91c3bc73e67097af9f36c4e149ef38103c0552d7e092461a137d5c499717f923f5f2f65b6f992507ee17c0b6c470b9a437ad922daacd9285ef18b6edd4eab3613ab326052e3c80268e0b0d6226bb814137a6ac1987fc7638244c9442b4766d5a92878349dd88d67b6eef9a072a2abcd67a13f347c0bb492090a767b52cecf065119c1819a817d07ee8cc663a26ec09c089b682696cf5a850c1df1956fe90bff18d0ff36bfa6f2cc25b1b6084973dacbe5081a45f170b8743ed31da4d868e7932dd672c767f9ac5e9d68488912397af74cf68c291efe6d95e3d53d0037474e40edd89d6800756622c06f5860c016f8a9bbddb445a54a6ea769cc97d77382e2f2409561485dbfc9d3932cdd0fb9eac8151d6705bb89ddcd62ce987295c6dd56a8576d09e0cf2c6f3cc6fdf304d8f46e402e6f145a4c4a18e3cbeb7d6e687c997fc1efa359cdbae6d6e94c6744813fce07d2a7f3383cddb72a4c2023a8f9b13f2160111a672eff1825f5f63a7060381b7ec873b9effc596d42b79b14c4cef32881f60d56d1b91327bd9f6a028fb7f368677d1cfb92b27e2c4567cddfd280cc1ddbe005669629f47fd4dad6716783221dc1365aab2ae1e7bc159e34ec7b5a7ef5cb22fa8d05b913633446eef412e7d0223ec9d074b394243cb6bffe50480964bc6cb6ddf466c8e538144689ea7211c96372ebc885616f7dd41fd042a7ba43924b60326d3acd754d74fa71b796af1a31242865a44b109783b1693c3d2328e1087053765777466acf1d7452e1afb94c796ab44aa15e0de41a68794244498a610175610234605660f4737ddfeaa60e0f7c11a55b0b9ecb916a20b4440321610232fa7616c7d32909fda17ea5607c092368f5688aa4f467419d2a7614af7b38397918168266194e2434a26ea778325032e92f694bc64af97e6a90cd99307286a57fa21f7ed5e4aeb515fa0767cada6e24417c55aec3ab25899625c0ad520fe7bf5677ac7a22c2354b9bc9532bbe3eae77eea0ab6970e7e5428c0e7b512d34d3b6e2de69d16b508c6c6572d362e053e37e0f9f52e65303c6ff3971bb8b7dbd5a625d7242adeaf416ac2456373c1ab8876f9409961b905c1611140503c2e7b9f704643739a023d76e275efe1c6251b587abddcfaeb7deb37790db00fa123831109180c415126d9262c00f769776116be071792053dc741d6e73e636af254454fe9a6e399b725a8485c58eb2878c36f17a310f639dac7f21006724b580b8325975a567d7ca284dbc23d4d3016466dbe5ca2368cfa91172680d19d4136caef0be5d7ed702b37255abd4aa772857ae2297daad62f07a6063ae30908b740a3ac8e2691665799482d82cc63b3b2daed9c2f21957ecff0cd85216892d2e0af5556c0e331fca8ff6e733c2e8a4b7a07a19846867032e5c38a4c5056b055709854d2993b7cd8e697789efeb7d1d7a65f900cf089325cfb8121835a9816eda7549edc1abe985e221e28f0c786d345c855814c11a2abd676c33a780214952e878ec45572302653abe579a1c937063d8bf40b064442432e4cbb9b74d1f132473f771f13bc5f84a7b41096d5401047ba6aa334c39723f03e6e653a59d306946c884c09483c672d14d75abee3419c0f7fa908d937873a33ced37d9d80f8cb3938cb06235121e6f8df92a829997b46037fe84191e5062ce63e4f720cb605d70e48d647f383d36b4133b7d314cc0b326536a46925961523d9ea5334f9c7abde8e68ad35da5b588b3ee872f45e29e6bdeec35cee0b5e2a02efe7657045b3a15e3caba15477789cdfb96faa1e8dc247e81c57a5b7c1018dc480354c9d78bf90d4dbea5d8276a05001bb9757e61858878620ae1d95f3f20137d9ad620d6ec3259229f7e7bbc6a25387a64416c4fdc2c8167a286e57a68fd156667360ca24fc4ef6e6f01586f07a4a68a53095213ac0a1ec4c63b390a67e0702cbc9dd2db4370d1d9c7a5b6c3da0f4b1ef3252f64f631ef70e4b6872c3306d6507bac70dcb6cae75a3d612f81686ac01b77c2385feb636e34578695d41d7fae50b0177d820edb66fa1ae494b0e20f722d7df2f33f71e32b1e492e8c9d7b7029c166108767b7b64cd1d3a5de76676ec74072beacb6d90367d2f8194272b6731167696234bc8e84f3a00a7249c17b5dc6863addf72a8324c58cc01340108171d40d90699aea0adba797accae7e6616c35537ee43b5a12488c9416d52e0f76c8fbc332ef5f3850507d04fcf102d651bb44c66236eaa1658f48355516de7d2c34f78a8cc7862d3fa05b9f8f6852fcd36482d7da0d425b40b215b4573a726ceba7698bf0c62ada3b724ad31ea661f42104657b5370035e108668a88a98c8bc18bb6db678abf4ff881f53f9e3c7a4c7fbe482ab330c98ce7a9eeb2102d06bded846d30d932e36c2ecac02742fbd160a8990ced7c66cc38a83d5bf21ec0e96ceb46ba2dd9b5fdec8c0c7969da667788fab6ab68b7cb6479878e0bcd69adc11fe7ec5c18c5b447b52857ea959de88411e12fa0908f9807461e3fed1116129096a767b492a5fbc958b8275eb0fc381e5604161cebe13effb66844c3030018a47e87b9008ea24ec51ad6e95cb40e61365f2e80e47898ad8749788af7ced6f7ab6b62f9cf38da85bb1e8ea46a7640a4754fcba282e29b9ac24cfdf79342d504c84e11afd0ed5de832538537e0c750ca9855719cf7962606a61b15863a159e3237d5bd94d2d674e3fbf4ccd30b099cb9240745a6715a253216cec32d688251b662fbabe3b84f6b174b1c2a915041018e0238607eb112e0586179759ef676ef04c21885a6d2f480d9bce417bef0c6bf45265629bdc2a1adf86bed5638c6ecdbd648621d8c0597dc818794b717d627ac4eeb85e9e2a9b46560ebd30fec878fd3d5e4649bbd27224415f91cd46fd7c093953fb0c27e86947a5f87c5c7e6ebb18a6b1e471f27fa66459e9474e3c819a9d96b534fd903618b18f7f92c89f3ec163fd638b111005482a5b72a5014bb492f5c5ff747ccf49f41d63e26102ae526965f40937e340da863f81722087d5b5a516f0658563fdd66cbe0fa4e13c08639a31ad4f62d8f9b77597034e0361d3e171443b1e2b3083303e76663431c8c37d453f0cd493f6b9f17e8cd17a058112fc1a20dd0ece0716971afa605b349d7d9c6f785d0400507952790f320d0194a495169976cf5250eefeb4a04113c86ce4b62979b0e9a6dcb70caab216867938c8922d460de3dbcee01ffd7d4f4f551de52b20b75c9862b10861568f61417f72e044009acb3fb9a5fd63413263f22d665683817483729635b6d26dfcaed800ae61c8e8789b5ee2c5006e35ccfc07243e42e6b0fe3c406f15d36766a591da19351ac161997e6a916f3ebfde35c08852ab10701766c26963cc764b44077b54c9ef2413556074782a4492bc74ca6bac70815334e890b5ac92372e6ec9f0506d949a7bb3cd34a9aeb9f5b294c180a5a848007158848c4f666c5a95b9680c6460656cea6adc8128cf52dd2e84bae842768fa76642dc01f2d3a05ac2063028d23d708199fde458b27276475ebf33ec30842bcc380b1279978f166dc17ce4ef2b78f042ee40f6f648f2156e3a5d70d8cd45bd5aeaf00a0fdaccca6ea0546dd6255bd023e3d0c4349feb41768202b9dfdebb598076629896f396f7617bcabd871c4a6f705d7c1a2dbba290c5f78d33e00f984db8f06e5928a2a036dcf8d9847c19329008385b6b8875d837c071af125e4689fa6fabeb05d59f99d91235c9498d9f0b6840612ea7674d3181eb93d392056b0f4fcd6cdfc6c3b52dd7bae577acecb7b89afb3bfa649eb54556c46965c8dd03e2694bf2918f675d56fa78678618b967ede7294a785b8bd50a6439c11e4d4e7564902e8cd1a08463692c006fa0d755fdcb10f41b40446289fbbb77763f4b6e4d4da5f232453836b6d9dda3ec471281995425e369c6e8fe3fa3770b9e1ec47cd694cd5c180e0441808788e7725ff2922f886dfef2d30e3648a3188dec85674c7bca12d270cf0660271d6d8138f0eeef0762bcb3bf6128cb35637864aede6eb33318f9f20a99a2e23cb4ff0390f9624cbd436c9124665f674ccd5e00d8266e3671285192746418db51770305278afbcff92a5f6c61e70a1ec48a4b0f33b4074e817e1d14c1c3a4a41981ee6625d76a019784b20cf96b2dd21848df410f820e06c572b3316b4d3dec7371c7b07f5577d24d8042ee146b866c57ace761707ba5973722682b1d089d8dea40dfcf77380cd370fa76126d75d3fe6732b5d785144b5e6f514cbbfb6eb779942d0cd125b32b3f59eefc4fb5646a620f46b87d10a23b5f4c6476bb89c06a648be10188604678b52ba30f1d383314b07acb8e676850d1b8f7bfd82167a04cc598e9a84bad17784c1e3347755cfd8fd26c4c9b70e719948d1cbc0168cbf8160d70abbe68e9dea8e76fec69c0b534b5808ecc73dd2d492b1b10ffa1
View on GitHub
GitHub Stars27
CategoryDevelopment
Updated19d ago
Forks3

Languages

Python

Security Score

75/100

Audited on Mar 9, 2026

No findings