# BL127 deployment record

BL127 v9 (Blockulator 3.0) is five Yul objects generated from one source
(`contracts/src/bl127/BL127.yul.src`), one idea each, deployed with CREATE2
through Arachnid's deterministic-deployment proxy, so the same source at the
same compiler settings lands at the same address on every chain that proxy
exists on. Machine-readable copies: `BL127.json`, `BL127E.json`,
`BL127H.json`, `BL127N.json`, `BL127S.json`, with each raw receipt
(`*.sepolia.receipt.json`) beside them.

| object | ops | address | salt | runtime | tx | block | gas |
|---|---|---|---|---:|---|---:|---:|
| BL127 | 32 | `0x0DF738d125677550a80A46BaF254386C66f96E0d` | `FP127 v9` | 3,728 | [`0x0685478d…`](https://sepolia.etherscan.io/tx/0x0685478dc4f61f667e78f99704b86f9546b80f7eb53830f6ea8aa840b68edb7c) | 12,017,693 | 5,974,719 |
| BL127E | 12 | `0xc16F4C45B78D90A4D4C030cABF4f2A34c1Fb0808` | `FP127E v9` | 18,808 | [`0xc20211eb…`](https://sepolia.etherscan.io/tx/0xc20211ebd15a53ce49c901872c0e428b3e1545ad316ff9658b9412989264b472) | 12,017,695 | 29,301,191 |
| BL127H | 4 | `0xf2F99947aD1cC370bD5388a2997A5E4963a0B27B` | `FP127H v9` | 13,093 | [`0x217ab95b…`](https://sepolia.etherscan.io/tx/0x217ab95bacdff59e4748a9d33f122769faab27968bd7fc18add18621d014e510) | 12,017,697 | 20,462,167 |
| BL127N | 3 | `0xAA7Cd9635aE8630379636F533f23DBf2C193d296` | `FP127N v9` | 9,088 | [`0xf957ebcc…`](https://sepolia.etherscan.io/tx/0xf957ebcc4f5c18b16e47cfa478a91210cb1e27fa9149a76312ac54e3eb2953ba) | 12,017,699 | 14,267,698 |
| BL127S | 2 | `0xB9C2583a7Ad2251444DC7752658B6C1107C25036` | `FP127S v9` | 11,817 | [`0x4a970c90…`](https://sepolia.etherscan.io/tx/0x4a970c90906d6d83127cca1071b2d1e98e7f479a4b29c1cf37c5b59528c7e137) | 12,017,701 | 18,488,849 |

| | |
|---|---|
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salts | ASCII `FP127 v9`, `FP127E v9`, `FP127H v9`, `FP127N v9`, `FP127S v9`, right-padded to 32 bytes (the full words are in the JSON records) |
| init code hashes | BL127 `0x3c663aca27b46991b0b81c2e1056ec9b270da4b37b5ae1944b5f40a79dbb5316`, BL127E `0x0da7d80e4469909ba3f123c57ca3fe9a12fc6c0b98ab4b610a54266d2124b53a`, BL127H `0x36b4fc7d8cc4259ad009528153a98bc95498b2a5ce5bfae736d750067fa98b04`, BL127N `0x309676e81990d33207b764828936bf2ac9e44ef54ff7875c6544e4d5769daf1a`, BL127S `0x8d8f956b3f84791ebcc17089587f208d0b48e9361d1e1fe672db918f1299a4ac` |
| runtime keccak256 | BL127 `0x2841130456eac80bb73cf869aded1898e3acaaaa2c36d385f076145a7695f6ee`, BL127E `0x53e1da91fd45449e58c6bd44a3c9bc229cfcb56b473b67695b078deb30e51380`, BL127H `0xf96ea5b4567c8da0be00b59a99a94a225cc042f140d43e2e87ea1ad298ac4e4d`, BL127N `0x32a5950ab66711104034ead00c746254bb56d34fb8f87fabcb3c17f335f81a72`, BL127S `0x8ee51feb9380a02a002dd3e1d2c49459ef431c78114430deb8ea65b4816ece9a` |
| source | `contracts/src/bl127/BL127.yul`, `BL127E.yul`, `BL127H.yul`, `BL127N.yul`, `BL127S.yul`, generated from `BL127.yul.src` |
| compiler | solc 0.8.38+commit.1835d247, language Yul, optimizer on, 200 runs, evm osaka, with solc 0.8.24's Yul optimizer sequence pinned (`scripts/bl127/stdjson.py`) |
| deployed | 2026-10-29 (UTC), gas at Sepolia's code pricing (the deploy limit is 40M) |
| source commit | `80d0656` (master after PR #211) |
| verification | Sourcify ([BL127](https://repo.sourcify.dev/11155111/0x0DF738d125677550a80A46BaF254386C66f96E0d), [BL127E](https://repo.sourcify.dev/11155111/0xc16F4C45B78D90A4D4C030cABF4f2A34c1Fb0808), [BL127H](https://repo.sourcify.dev/11155111/0xf2F99947aD1cC370bD5388a2997A5E4963a0B27B), [BL127N](https://repo.sourcify.dev/11155111/0xAA7Cd9635aE8630379636F533f23DBf2C193d296), [BL127S](https://repo.sourcify.dev/11155111/0xB9C2583a7Ad2251444DC7752658B6C1107C25036)) and Blockscout ([BL127](https://eth-sepolia.blockscout.com/address/0x0DF738d125677550a80A46BaF254386C66f96E0d?tab=contract), [BL127E](https://eth-sepolia.blockscout.com/address/0xc16F4C45B78D90A4D4C030cABF4f2A34c1Fb0808?tab=contract), [BL127H](https://eth-sepolia.blockscout.com/address/0xf2F99947aD1cC370bD5388a2997A5E4963a0B27B?tab=contract), [BL127N](https://eth-sepolia.blockscout.com/address/0xAA7Cd9635aE8630379636F533f23DBf2C193d296?tab=contract), [BL127S](https://eth-sepolia.blockscout.com/address/0xB9C2583a7Ad2251444DC7752658B6C1107C25036?tab=contract)); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode, all five |
| smoke test | `make smoke-sepolia`: every committed vector across the 53 ops matches the live objects, each equal to the inline library |

Version 9 (2026-10-29, Blockulator 3.0) has the same 53 ops as versions 6 to 8, in five objects by idea, as
BL19's are: **BL127**, the number (the arithmetic and its directed forms, the conversions, `sqrt`, `cbrt`,
`gavg`, `hypot`, `inv`, `factorial`, the comparisons and the rounding ops; 32 ops), **BL127E** the elementary
functions on one exp/log kernel (`exp`, `exp2`, `exp10`, `expm1`, `ln`, `log2`, `log10`, `log2Up`, `log1p`,
`pow`, `powu`, `compound`), **BL127H** the hyperbolic functions (`sinh`, `cosh`, `tanh`, `atanh`), **BL127N**
the normal distribution (`erf`, `erfc`, `normCdf`) and **BL127S** Lambert W (`lambertW0`, `lambertWm1`);
`contracts/src/bl127/ops.json` names each op's object, and each object has its own interface and ABI
(`IBL127.sol`, `IBL127E.sol`, …, `abi.json`, `abiE.json`, …). Every op is correctly rounded on every input:
each transcendental's fast value carries an error bound derived in the source, measured against 120-digit truth
and tested before the one rounding, and where the bound could reach a midpoint a wider stage decides (the release
gate's `make sweep`: 59 BL127 rows, 212,119 inputs, 0 misrounded, plain and with every rounding test forced);
`gavg` and `hypot` are the nearest root of the exact product or sum of squares; the arithmetic is exact in its
stated direction, as before. Version 8 rounded each transcendental's value with no test, `pow` could miss at
extreme exponents and rounded exact ties down, and `gavg` and `hypot` were the Huff's floored compositions, so
results can differ from version 8 by their last bit; the split gave each object room for its second stages. Version
8 (one object, 23,797 bytes), sent on 2026-10-28 as Blockulator 3.0's BL127 with ladder v13, is superseded before
mainnet, as version 7 was by version 8; both stay deployed and verified and are recorded below. The ladder's
version 14 `LadderBL127` calls the five objects. See `CHANGELOG.md`.

Version 6 (2026-10-22, Blockulator 2.2) has 53 ops: `pi(terms)` became the
constant `BL127Lib.PI` (the word nearest π) and `gcd` was removed. It is the
first CLZ build (evm osaka): it runs only on chains with EIP-7939, listed in
`README.md` beside this file. Every other op returns the same word as
version 5; the gas falls (sweep medians, v5 → v6: `ln` 3,410 → 1,934,
`pow` 6,121 → 3,375, `cbrt` 6,019 → 1,948, `cosh` 10,651 → 5,207,
`lambertWm1` 23,977 → 11,101, `lambertW0` 18,607 → 11,308) from the one-word exp/log kernels by table and minimax polynomial,
precision-doubling Newton for `sqrt`, `div`, `inv` and `cbrt`, the
hyperbolics on the exp/log kernels, Lambert W without series and CLZ for
the leading bit. `sinh` is the one op that got dearer (median 2,284 →
5,262), since its series below 1 went. See `CHANGELOG.md`. Versions 1 to 8
stay deployed and verified and are recorded below; the ladder's version 10
and 11 adapters call version 6.

address = keccak256(0xff ++ proxy ++ salt ++ keccak256(initCode))[12:]. There
are no constructor arguments, so the init code is the artifact's
`.bytecode.object` unchanged.

## Reproduce the bytecode

```sh
make build                              # generates the five objects and compiles them
uv run scripts/bl127/stdjson.py check   # solc standard-json (language Yul) == Foundry artifact
make predict                            # BL127's address above, from the artifact alone (predict-bl127e, -bl127h, -bl127n, -bl127s for the others)
uv run scripts/bl127/stdjson.py onchain https://ethereum-sepolia-rpc.publicnode.com 0x0DF738d125677550a80A46BaF254386C66f96E0d
```

The last command fetches the live runtime and compares its keccak256 with
the artifact's. That comparison, not an explorer badge, is the proof that
what is on chain is what is in this repository.

## Gas note

Sepolia is on the Amsterdam fork, where depositing contract code costs
about 1,550 gas per byte rather than 200 (measured: a 256-byte deposit
estimates at 615k gas, a 6,512-byte one at 10.34M). Forge 1.7.1's local
EVM still uses the old schedule and estimated 2.14M for this transaction,
which ran out of gas inside the proxy's CREATE2 (tx
`0xe4d91708…896d55`). `make deploy-sepolia` therefore sends the proxy call
with an explicit limit (`DEPLOY_GAS`) instead of trusting the estimate. The
limit was 20M until version 5, whose 19,863 bytes need about 31M: its first
send reverted out of gas, and the limit is now 40M. Every deploy target
rejects a receipt with status 0 before it replaces the previous one.

## Explorer verification

Etherscan's verification API accepts only Solidity (single file or
standard-json) and has no path for a Yul object, so Etherscan shows the
contract as unverified. Sourcify supports Yul and Blockscout's verifier
accepts standard-json with `language: Yul`; both receive the exact input
that `stdjson.py check` proves reproduces the artifact
(`make verify-sepolia`).

## Trust model

The object has no storage, no owner, no upgrade path and no selfdestruct;
it reads calldata and returns a word or reverts with one of three custom
errors. A CREATE2 deployment of such a contract is immutable by
construction. There is nothing to freeze after an audit and nothing to
register in an append-only list, because the address already commits to
the bytecode: anyone can recompute it from the source and the salt.

A new version is a new source, a new init-code hash and therefore a new
address, published here with a new salt string. Nothing can change the
code behind an address that has been published.

## Other chains

The proxy exists on mainnet and most L2s. Running `make deploy-sepolia`
with a different RPC (and chainId in the Makefile targets) lands the same
bytecode at the same address there. The address is recorded here only for
the chains it has actually been deployed to.

## Legacy

The Huff-era contract at `0xfae694D0c2c44181791F838c54Ed64C3151FfE30`
(plain CREATE, `uint256` ABI with `*Raw` names) stays live on Sepolia as
the equivalence baseline; see `contracts/archive/huff/README.md`. The site
at blockulator.com still calls it until the site rewrite.

## Version 8 (factorial, compound and the erfc tail, superseded before mainnet)

| | |
|---|---|
| address | `0x466eCEde5Dc25189AD9ED999d0B4D41Cb022510B` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650313237207638000000000000000000000000000000000000000000000000` (ASCII `FP127 v8`, right-padded) |
| init code hash | `0xd9a0b653b3f36c53a228ea732733b8ab1e042c014eef4603bd7dd6b9ab0ff1e6` |
| runtime keccak256 | `0x168c7ac4fa0f0dac8a5a0ac20c4f943b202e4050030ed9dffae134934cbfcadb` (23,797 bytes) |
| compiler | solc 0.8.38+commit.1835d247, language Yul, optimizer on, 200 runs, evm osaka, with solc 0.8.24's Yul optimizer sequence pinned |
| deployment tx | [`0x5e9cf0bd…fc71bc5`](https://sepolia.etherscan.io/tx/0x5e9cf0bdd83b24d002cf1f74c74b5ac1d026260639e961abfea11bbbbfc71bc5), block 12,015,304, 37,016,246 gas, 2026-10-28 |
| source commit | `81e4771` (master after PR #198) |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0x466eCEde5Dc25189AD9ED999d0B4D41Cb022510B), [Blockscout](https://eth-sepolia.blockscout.com/address/0x466eCEde5Dc25189AD9ED999d0B4D41Cb022510B?tab=contract); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode |
| smoke test | `make smoke-sepolia`: every committed vector across the 53 ops matched the live contract at its deploy |

Version 8 (2026-10-28) has the same 53 ops and returns the same word as versions 6 and 7 on every
op; `factorial`, `compound` and the erfc tail take new paths. `factorial` reads its 34 values from a table, two to a word: about 400 gas at every n
(v6 and v7 multiplied: 190 to 1,918). `compound` for |n| ≥ 16 takes n log2(1 + rate) from the one-word log and 2^t
through `pow2t` (sweep median, p99, max: 9,245, 10,913, 33,268 → 3,360, 9,344, 41,484). erfc for 4 < x ≤ 9.5 is
e^(−x²) times a degree-43 minimax polynomial in place of the continued fraction: 7,650 gas at every x of that tail,
and the maximum over erf, erfc and normCdf falls from 35,352 to 20,746. The object is 23,797 bytes (v7: 20,603).
It was sent as Blockulator 3.0's BL127 and superseded the next day by version 9 (five objects, every op
correctly rounded), before mainnet; it stays live and verified, and the ladder's version 13 `LadderBL127` calls
it. Recorded as `previous.v8` in `BL127.json`.

## Version 7 (exp and div, superseded before mainnet)

| | |
|---|---|
| address | `0xb97E0b824d86470BfAA52fe44f09363755d52591` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650313237207637000000000000000000000000000000000000000000000000` (ASCII `FP127 v7`, right-padded) |
| init code hash | `0x56308d1df3d96346359321f46fb4ed6c5f027c740104fab1cbee0bc8f053fe38` |
| runtime keccak256 | `0xc9624463573f8d54f0d64c1f96afba97dea8e00527940d9874c6b3763024c615` (20,603 bytes) |
| compiler | solc 0.8.38+commit.1835d247, language Yul, optimizer on, 200 runs, evm osaka, with solc 0.8.24's Yul optimizer sequence pinned |
| deployment tx | [`0xb4d1bba0…f7acf7`](https://sepolia.etherscan.io/tx/0xb4d1bba0248e2944422c98c6fa30f9c1429d74991bc5b6f2512c22f741f7acf7), block 12,008,542, 32,077,543 gas, 2026-10-27 |
| source commit | `598efc7` (branch `release-3.0`) |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0xb97E0b824d86470BfAA52fe44f09363755d52591), [Blockscout](https://eth-sepolia.blockscout.com/address/0xb97E0b824d86470BfAA52fe44f09363755d52591?tab=contract); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode |
| smoke test | `make smoke-sepolia`: every committed vector across the 53 ops matches the live contract |

Version 7 (2026-10-27) returns the same word as version 6 on every op and costs less: `exp` is
on three table levels and a minimax corrector, and `div` on one exact core (typical inline gas `exp` 5,360 → 2,716,
`exp2` 5,687 → 2,668, `div` 649 → 412). The object is 20,603 bytes (v6: 21,858). It was sent as Blockulator 3.0's
BL127 and superseded the next day by version 8, before mainnet; it stays live and verified, and the ladder's
version 12 `LadderBL127` calls it. Recorded as `previous.v7` in `BL127.json`.

## Version 6 (Blockulator 2.2)

| | |
|---|---|
| address | `0xb349DB36D51b0BC10Dd43aF70009b7B6E7c1CBe4` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650313237207636000000000000000000000000000000000000000000000000` (ASCII `FP127 v6`, right-padded) |
| init code hash | `0x1f5de2e6ea4d6228991aa3b3fb7df165ecf6e86266bf2b38bf0578633c093085` |
| runtime keccak256 | `0xbf0c83bc03cf9da6303a7a2105dd64e59963c6ac7e8baa1d4863d9c98c838815` (21,858 bytes) |
| deployment tx | [`0x1d4fc704…09237`](https://sepolia.etherscan.io/tx/0x1d4fc704b6380c88f541cdc0e2c38330c502c16aa23411f79b3be01b3d709237), block 11,974,968, 34,018,991 gas, 2026-10-22 |
| source commit | `d37c8b1` (branch `release-2.2`) |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0xb349DB36D51b0BC10Dd43aF70009b7B6E7c1CBe4), [Blockscout](https://eth-sepolia.blockscout.com/address/0xb349DB36D51b0BC10Dd43aF70009b7B6E7c1CBe4?tab=contract); Etherscan unverified (no Yul support) |

Version 6 was the BL127 of Blockulator 2.2 (see above). Recorded as `previous.v6` in `BL127.json`.

## Version 5 (nearest transcendentals, directed ops)

| | |
|---|---|
| address | `0x619176d72D7a12390F8970802943D344c0fd3fE2` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650313237207635000000000000000000000000000000000000000000000000` (ASCII `FP127 v5`, right-padded) |
| init code hash | `0x4337fe5d341951788574ed83d274b9c25ce7c8b36e111d8b65205bf430fa89dd` |
| runtime keccak256 | `0xc353cc0fe4e71b0881198bab2ccad4ef19776ccabd2a99380b18cc6f3e9a6ace` (19,863 bytes) |
| compiler | solc 0.8.24+commit.e11b9ed9, language Yul, optimizer on, 200 runs, evm shanghai |
| deployment tx | [`0xe4e46ff5…0fbc2`](https://sepolia.etherscan.io/tx/0xe4e46ff5669ab33ea29f49c1b4f93bb46d5717b14dafcade0856c18f5cd0fbc2), block 11,966,457, 30,932,587 gas, 2026-10-21 |
| first send | [`0xcbb6cd5b…5d01af`](https://sepolia.etherscan.io/tx/0xcbb6cd5ba9afb10b5e582b126ff6d588863c4acc68704c26dc02e729f75d01af), block 11,966,218, reverted out of gas (16,520,574 gas used under the old 20M limit); no code was created, and the tx above deployed the same address. Recorded as `previous.v5-reverted` in `BL127.json` |
| source commit | `1bfa758` (master after PR #113) |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0x619176d72D7a12390F8970802943D344c0fd3fE2), [Blockscout](https://eth-sepolia.blockscout.com/address/0x619176d72D7a12390F8970802943D344c0fd3fE2?tab=contract); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode |
| smoke test | `make smoke-sepolia`: every committed vector across 55 ops matches the live contract |

Version 5 (2026-10-21) has 55 ops. It was the BL127 of Blockulator 2.1 and
stays live and verified; the ladder's version 9 adapters call it. Every
transcendental returns the nearest word (on the random-input sweep v4 was
off by up to 4.8e34 ULPs in `pow` and 4.0e32 in `exp`); `pow` at extreme
exponents is the one exception, within 2^-299 (1 + |y|) relative. It adds
the directed ops `mulUp`, `mulDown`, `divUp`, `divDown`, `toFixed18Up` and
`toFixed18Down`; `mul`, `div`, `sqrt` and `toFixed18` return the same words
as version 4. The domain ends round to nearest (`exp` returns 0 below -90,
`tanh` is ±1 from 46), and the object dispatches by binary search on the
selector.

## Version 4 (eleven new ops)

| | |
|---|---|
| address | `0x6cFbCB928Ac068E84Ef793Dd1DFce4f8e9Cac1d1` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650313237207634000000000000000000000000000000000000000000000000` (ASCII `FP127 v4`, right-padded) |
| init code hash | `0x5072119edae80c3d8e9749feb81e944c4d29caf87c4a244cf49b4a2d706b5d78` |
| runtime keccak256 | `0xacdbc10ba70c1086706d2ba9334582b3fb04022c97eefcf130afe0a79075aeeb` (10,401 bytes) |
| deployment tx | [`0x6d3f4ebc…9bbcd`](https://sepolia.etherscan.io/tx/0x6d3f4ebc8606d07f419ee628eed570172f375ff5a9e540c88f7be792f999bbcd), block 11,921,624, 16,297,813 gas, 2026-10-15 |
| source commit | `d757b9b` (master after PR #68) |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0x6cFbCB928Ac068E84Ef793Dd1DFce4f8e9Cac1d1), [Blockscout](https://eth-sepolia.blockscout.com/address/0x6cFbCB928Ac068E84Ef793Dd1DFce4f8e9Cac1d1?tab=contract); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode |
| smoke test | `make smoke-sepolia`: every committed vector across 49 ops matches the live contract |

Version 4 (2026-10-15) adds eleven ops (`powu`, `compound`, `log1p`,
`expm1`, `sinh`, `cosh`, `tanh`, `atanh`, `erf`, `erfc`, `normCdf`) and
forms `pow`'s exponent product at 2^-192, so `pow` and `cbrt` results can
differ from version 3 by their last bits (closer to the truth); every
other op is bit-identical to version 3. It was the BL127 of Blockulator 2.0;
the ladder's version 5 to 8 adapters call it.

## Version 3 (pi)

| | |
|---|---|
| address | `0xe43F720861074497db2e974E5c4554E4A3b341B9` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650313237207633000000000000000000000000000000000000000000000000` (ASCII `FP127 v3`, right-padded) |
| init code hash | `0x67362c4ef1771ae6109a3d8a8291ab42dcde9619a2f1deb849292c81823a65e8` |
| runtime keccak256 | `0xab019bcc0e8ce61720b018c96fae06f7b05cc7caaf7c30550c095f82922db496` (7,593 bytes) |
| deployment tx | [`0xc7eabd1f…89a002`](https://sepolia.etherscan.io/tx/0xc7eabd1f47f64f53b26c0299ece0564c286a2fdbef38f461d432f0093489a002), block 11,861,162, 11,955,003 gas, 2026-10-07 |
| source commit | `7b74fbc` (master after PR #61) |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0xe43F720861074497db2e974E5c4554E4A3b341B9), [Blockscout](https://eth-sepolia.blockscout.com/address/0xe43F720861074497db2e974E5c4554E4A3b341B9?tab=contract); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode |
| smoke test | `make smoke-sepolia`: every committed vector across 38 ops matches the live contract |

Version 3 (2026-10-07) adds `pi(terms)`, Ramanujan's series; every other
op is bit-identical to version 2.

## Version 2 (guard-bit transcendentals)

| | |
|---|---|
| address | `0xD8688E72dD6745719484da894C63Cd2685fD7E71` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650313237207632000000000000000000000000000000000000000000000000` (ASCII `FP127 v2`, right-padded) |
| init code hash | `0x3d5cbdd04fe4c0d6df04201f2ec936f06fc0078cc9fc6f402f38340a41620715` |
| runtime keccak256 | `0x2d357104a339080c80a3145d4070d6df90d03e2196f2149dbcd436461016fb16` (7,783 bytes) |
| source | `contracts/src/bl127/BL127.yul`, generated from `BL127.yul.src` |
| compiler | solc 0.8.24+commit.e11b9ed9, language Yul, optimizer on, 200 runs, evm shanghai |
| deployment tx | [`0x02e012ea…a5b64a`](https://sepolia.etherscan.io/tx/0x02e012ead20235e8241b8e84eb93ac70e3fa65af1de74291ce573bb016a5b64a), block 11,860,704, 12,248,539 gas, 2026-10-07 (a first attempt at the old 12M limit ran out of gas; the default is now 16M) |
| source commit | `209b476` (master after PR #57) |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0xD8688E72dD6745719484da894C63Cd2685fD7E71), [Blockscout](https://eth-sepolia.blockscout.com/address/0xD8688E72dD6745719484da894C63Cd2685fD7E71?tab=contract); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode (a Yul object carries no metadata hash) |
| smoke test | `make smoke-sepolia`: all 6,928 committed vectors across 37 ops match the live contract |

Version 2 (2026-10-07) changed the transcendental kernels: `exp2`, `exp`,
`exp10`, `log2`, `ln` and `log10` compute with 64 guard bits and round to
nearest once, where version 1 floored every step (issue #50). Every other
op is bit-identical to version 1. Version 1 stays deployed and verified and
is recorded below; the ladder's version 2 adapters still call it.

## Version 1 (floor kernels)

| | |
|---|---|
| address | `0xA7Fb462A3733f24785a9AE8d7FbD4F87D8BC4c28` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650313237207631000000000000000000000000000000000000000000000000` (ASCII `FP127 v1`, right-padded) |
| init code hash | `0x5d86a72291f2abba6b311a94d55253789b0cd17ba1020e1120f7d41ec96dfbc2` |
| runtime keccak256 | `0xea2e14cacd103541f26ee0bd599375e890bbdc302a86a0074fcb8b28657159e2` (6,512 bytes) |
| source | `contracts/src/bl127/BL127.yul`, generated from `BL127.yul.src` |
| compiler | solc 0.8.24+commit.e11b9ed9, language Yul, optimizer on, 200 runs, evm shanghai |
| deployment tx | [`0x578ac853…c5bbd0`](https://sepolia.etherscan.io/tx/0x578ac85389cd1143202fd4761282592b5177d393833181b5d49ca9a625c5bbd0), block 11,859,242, 10,283,867 gas, 2026-10-06 |
| source commit | `3bc3c5a` (master after PR #41) |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0xA7Fb462A3733f24785a9AE8d7FbD4F87D8BC4c28), [Blockscout](https://eth-sepolia.blockscout.com/address/0xA7Fb462A3733f24785a9AE8d7FbD4F87D8BC4c28?tab=contract); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on both creation and runtime bytecode (a Yul object carries no metadata hash, so `exact_match` cannot apply) |
| smoke test | `make smoke-sepolia`: all 6,928 committed vectors across 37 ops match the live contract |

