All expertise

09

Blockchain and Web3

On a chain you don't fix code with a patch: what is written is what counts, and it counts in real money. That is why the longest part of the work here is not writing the contracts, it is proving they do only what they should.

Code is money, so you prove it

Unit tests as the base, then static analysis across every contract, fuzzing on invariants (properties that must never break, tested against thousands of random sequences), and symbolic execution plus formal verification on the critical rules.

These tools find different things: static analysis catches known bad patterns, fuzzing finds sequences nobody would have written by hand, formal verification proves a rule holds for every possible input rather than the ones you thought to test.

Upgradeable but not arbitrary

Contracts that must evolve use upgradeable proxies, but every change goes through a mandatory delay: whoever holds funds has time to see what is about to change and to leave. Contracts that must not change — the coin, the wrapper — stay immutable and role-less.

Withdrawals carry explicit limits (a maximum daily share, for instance) and use pull instead of push: the recipient withdraws, so one badly behaved account cannot block everyone else.

A chain is infrastructure too

Behind a Layer 2 there are processes that must stay up: sequencer, public RPC node, the component posting batches to the layer below, explorer, indexing and monitoring. It is systems work as much as Solidity work, with separate networks for development, testnet and mainnet.

Portfolio

What I did on this, project by project.

Manora

Layer 2 platform with a native gas coin

  • Seven Solidity 0.8.28 contracts on OpenZeppelin 5: immutable fixed-supply coin, wrapper, pricer reimbursing the batch poster, vesting with cliffs, treasury with delayed withdrawals and a daily cap, five-tier staking with gas fee discounts from 10% to 70%.
  • A shared abstract base with UUPS proxies, a 48-hour timelock on every upgrade, role-based access control and an emergency pause.
  • 487 automated tests at 99.4% statement coverage; formal verification through symbolic execution (27 of 29) and an SMT solver (50 of 51 rules), fuzzing of the staking invariants (4 of 4), static analysis with no true positives.
  • Network on Arbitrum Nitro with a custom gas coin: depositing on the layer below mints native coin on the chain, with distinct chain ids between development and mainnet for replay protection.
  • Phased deployment script with a JSON manifest and post-deploy verification checks, plus a document package for the external audit.
  • Solidity 0.8.28
  • OpenZeppelin 5
  • Hardhat
  • Foundry
  • Halmos
  • Certora
  • Echidna
  • Slither
  • Arbitrum Nitro

Need this?

Tell me the problem and I'll tell you how I would tackle it — and if it isn't worth doing, I'll tell you that too.

Let's talk