# BL19 deployment record

BL19 v6 (Blockulator 3.0), the 256-bit float, is five Yul objects
generated from one source (`contracts/src/bl19/BL19.yul.src`), one idea
each, deployed with CREATE2 through Arachnid's deterministic-deployment
proxy exactly as BL127 is (see `BL127.md` for the procedure, the gas note
and the trust model). Machine-readable copies: `BL19.json`, `BL19E.json`,
`BL19H.json`, `BL19N.json`, `BL19S.json`, with each raw receipt beside them.

| object | ops | address | salt | runtime | tx | block | gas |
|---|---|---|---|---:|---|---:|---:|
| BL19 | 44 | `0x94d9d43D6202827429a8058959eeCf6d232b8729` | `FP19 v6` | 17,221 | [`0x818a56ae…`](https://sepolia.etherscan.io/tx/0x818a56ae35291702b511d6d1136357c7fd14fccc8306e71fe257ea9c99937dec) | 12,015,306 | 26,846,147 |
| BL19E | 12 | `0x8e5eE786bDD7c35a2867Fd329441d0BD0fB61092` | `FP19E v6` | 23,621 | [`0x6e4d136e…`](https://sepolia.etherscan.io/tx/0x6e4d136eaf7ccbb2da86dc625ef23363e507ac6dd2ccea6e79568448bf6d595a) | 12,015,308 | 36,748,965 |
| BL19H | 4 | `0xF059611C1c42543DE6EE82353Eb082Fd8999081f` | `FP19H v6` | 13,020 | [`0x98b39d1d…`](https://sepolia.etherscan.io/tx/0x98b39d1d2906651e2b6c287fa4a3d0e4fdd70336d3104692c3c00337e2326abf) | 12,015,310 | 20,350,221 |
| BL19N | 3 | `0xCe9F09D646B37a9100F05ED1FFD14E9f43180214` | `FP19N v6` | 17,962 | [`0x22b510ff…`](https://sepolia.etherscan.io/tx/0x22b510ff8563b8cb7fb2a99bcd09590b46f6f1331f236bca40aeeb31f3068140) | 12,015,312 | 27,995,021 |
| BL19S | 2 | `0xf74ba90535224870830e6e89D2b328d4cc09DE48` | `FP19S v6` | 11,338 | [`0x2da7a9b9…`](https://sepolia.etherscan.io/tx/0x2da7a9b9db8475043e3131e88328fc774706d648e06078824633214b966801a1) | 12,015,314 | 17,748,339 |

| | |
|---|---|
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salts | ASCII `FP19 v6`, `FP19E v6`, `FP19H v6`, `FP19N v6`, `FP19S v6`, right-padded to 32 bytes (the full words are in the JSON records); v5's salts kept the old name (`FP256 v5`, …) |
| init code hashes | BL19 `0x92b09dc2068287399b37c8b1d9c1f962b51b15bfd613afbcb1ef5ac09494a9af`, BL19E `0x7593504bfd3c34e2c6253dc5f5222bf0e37cf5929c1f35219e0f1bce59c70f19`, BL19H `0x1dd6bbf3712bac2639b0916c0142b941daf071ecec960e3755ebfad01c49f978`, BL19N `0xba51b5230ee6d29d957145ec383a665a93924342ba86debe649e32daff6302b8`, BL19S `0x0aaf03a50308599bd1bc14db6e62f553b65f11d70531d5ba838675b842af9e83` |
| runtime keccak256 | BL19 `0xfebbf6fbbd3eee6a4501f2b7ddef98a522d7f39fc9f32345f0012d3a72641814`, BL19E `0x8220e470018093eafbfcc8062b337ca8ce981d363cebbc36b637bb1afdc4e45f`, BL19H `0xd9f025155b7ed2e7eedad44eca60a617ae84d879f012c1b445bccbc02743c7f0`, BL19N `0x9635b2746ce6a81c13fd8fde69e56a0c251e9f2f19ce40d723fb14988d8f38ba`, BL19S `0x8608daa56cd49923e9c6f17f00e81c43cf56d508971c3fca6bbb4b66f13d2405` |
| source | `contracts/src/bl19/BL19.yul`, `BL19E.yul`, `BL19H.yul`, `BL19N.yul`, `BL19S.yul`, generated from `BL19.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-28, gas at Sepolia's code pricing (the deploy limit is 40M) |
| source commit | `81e4771` (master after PR #198) |
| verification | Sourcify ([BL19](https://repo.sourcify.dev/11155111/0x94d9d43D6202827429a8058959eeCf6d232b8729), [BL19E](https://repo.sourcify.dev/11155111/0x8e5eE786bDD7c35a2867Fd329441d0BD0fB61092), [BL19H](https://repo.sourcify.dev/11155111/0xF059611C1c42543DE6EE82353Eb082Fd8999081f), [BL19N](https://repo.sourcify.dev/11155111/0xCe9F09D646B37a9100F05ED1FFD14E9f43180214), [BL19S](https://repo.sourcify.dev/11155111/0xf74ba90535224870830e6e89D2b328d4cc09DE48)) and Blockscout ([BL19](https://eth-sepolia.blockscout.com/address/0x94d9d43D6202827429a8058959eeCf6d232b8729?tab=contract), [BL19E](https://eth-sepolia.blockscout.com/address/0x8e5eE786bDD7c35a2867Fd329441d0BD0fB61092?tab=contract), [BL19H](https://eth-sepolia.blockscout.com/address/0xF059611C1c42543DE6EE82353Eb082Fd8999081f?tab=contract), [BL19N](https://eth-sepolia.blockscout.com/address/0xCe9F09D646B37a9100F05ED1FFD14E9f43180214?tab=contract), [BL19S](https://eth-sepolia.blockscout.com/address/0xf74ba90535224870830e6e89D2b328d4cc09DE48?tab=contract)); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode, all five |
| smoke test | `make smoke-sepolia` (its `Deployed` match runs `make smoke-bl19-sepolia`'s `Deployed19` too): every committed vector across the 65 ops matches the live objects |

Version 6 (2026-10-28): 65 ops, every one correctly rounded or exact (the
release gate's `make sweep`: 76 BL19 rows, 0 misrounded), in five objects
by idea. What moved where: **BL19**, the number, now holds `factorial` as
a table of the 169 correctly rounded words for 2 ≤ n ≤ 170, found by a
binary search (1.07M → 714 gas at the median); its domain stops at 170!,
the largest factorial a binary64 holds, with `Overflow` from 171 (v5: n ≤
20,366 by a 512-bit running product). **BL19N**, a new object, holds the
normal distribution (erf, erfc, normCdf), whose fast path is now a fitted
polynomial (`scripts/bl19/generators/erf19.py`) in place of Taylor anchors
and a continued fraction: on [−6, 6] normCdf 29,937 → 11,330 gas median
and erfc 29,357 → 10,623. **BL19S** keeps Lambert W only (lambertW0,
lambertWm1; 11,338 bytes). **BL19E**'s pow, powu and compound gain a middle
stage, so the second stage runs for 0.005%, 0.017% and 0.067% of the
sweep's inputs instead of 1.2%, 9.8% and 13.5% (p99 gas: pow 54,522 →
15,079, powu 59,027 → 19,098, compound 106,018 → 15,904). **BL19H**
(sinh, cosh, tanh, atanh) changed only by an internal function, 13,020
bytes. Correctly rounded results are the words v5 returned; only
`factorial` above 170 now reverts. The salts drop the library's old name. See
`contracts/src/bl19/README.md` and `CHANGELOG.md`. v5 (Blockulator 2.2),
release four (Blockulator 2.1) and releases one to three stay deployed and
verified and are recorded below; the ladder's version 13
`LadderBL19Deployed` calls the v6 objects.

## Version 5 (Blockulator 2.2)

Blockulator 2.2's BL19: four objects by idea, the first CLZ build. All four
stay live and verified. Machine-readable copies: the entries `"release":
"2.2"` under `previous` in `BL19.json`, `BL19E.json`, `BL19H.json` and
`BL19S.json`.

| object | ops | address | salt | runtime | tx | block | gas |
|---|---|---|---|---:|---|---:|---:|
| BL19 | 43 | `0xAa1f71B7B08d568379b28E1488c6B737a1C6eb52` | `FP19 v5` | 10,333 | [`0x0cdfb53f…`](https://sepolia.etherscan.io/tx/0x0cdfb53f58b261b6895bac0ebf10ed6ef57c9afde85b7a28f9c3eca0a5d26134) | 11,974,969 | 16,193,275 |
| BL19E | 12 | `0x017F68A57dD53a6dF2043c24B712b287F9549AE2` | `FP19E v5` | 21,598 | [`0x45cb7924…`](https://sepolia.etherscan.io/tx/0x45cb792403660f9a9e6e585ba4e8e20165c8075b27e5c63f5ad87716bc532e63) | 11,974,970 | 33,619,670 |
| BL19H | 4 | `0xEfefa2B63A173d56F9db79C5dd8A607F4aA859A5` | `FP19H v5` | 13,021 | [`0x25b3aef8…`](https://sepolia.etherscan.io/tx/0x25b3aef8bf7e9a21f72778413a459eccd23ae835f0906b1bd52d9a0e833fdfe1) | 11,974,971 | 20,351,815 |
| BL19S | 6 | `0x73E8809F163d4358773cc5F25c134997B4b842F4` | `FP19S v5` | 24,263 | [`0xcb6257b6…`](https://sepolia.etherscan.io/tx/0xcb6257b660b4f237b86720aa2d341f7e4a2d24690dd61987027bc315230c6d95) | 11,974,972 | 37,742,027 |

| | |
|---|---|
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salts | ASCII `FP256 v5`, `FP256E v5`, `FP256H v5`, `FP256S v5`, right-padded to 32 bytes (the full words are in the JSON records) |
| init code hashes | BL19 `0x476685947058e5d24adf3a1c1cdff1e30c4e5fee3f31cb82939ab3368881ce7c`, BL19E `0x09d5a094a44639afe8f04dd465a9c4314e19c7dc8e7ff33cc3e627ac5aab24bf`, BL19H `0xde27fe5b9ea1ac6a8cb6505933f3207a3d5610230fde98dd4410b6aca65bce4c`, BL19S `0xd03923031c2c938270a81813883b72261e01a68244f276de5dc39a611db28c4e` |
| runtime keccak256 | BL19 `0xc8e37d8828b81656310c3f66ce7615a0cb14d464c6bc601459b368e379eaed95`, BL19E `0x7a0573d94148024d9baf53aeed4040824fe4c113e4b8969100d0b30cb5b28059`, BL19H `0xb52c16b22ab43a20da93920f6e027381feb433707b9a69d37df64fda66e30861`, BL19S `0x3ca6c971e89ab5b43745236477403fdaaee3d12ea1b63c29e4af85326ee47522` |
| source | `contracts/src/bl19/BL19.yul`, `BL19E.yul`, `BL19H.yul`, `BL19S.yul`, generated from `BL19.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-22, gas at Sepolia's code pricing (the deploy limit is 40M) |
| source commit | `d37c8b1` (branch `release-2.2`: master after PR #132, with the 2.2 salts) |
| verification | Sourcify ([BL19](https://repo.sourcify.dev/11155111/0xAa1f71B7B08d568379b28E1488c6B737a1C6eb52), [BL19E](https://repo.sourcify.dev/11155111/0x017F68A57dD53a6dF2043c24B712b287F9549AE2), [BL19H](https://repo.sourcify.dev/11155111/0xEfefa2B63A173d56F9db79C5dd8A607F4aA859A5), [BL19S](https://repo.sourcify.dev/11155111/0x73E8809F163d4358773cc5F25c134997B4b842F4)) and Blockscout ([BL19](https://eth-sepolia.blockscout.com/address/0xAa1f71B7B08d568379b28E1488c6B737a1C6eb52?tab=contract), [BL19E](https://eth-sepolia.blockscout.com/address/0x017F68A57dD53a6dF2043c24B712b287F9549AE2?tab=contract), [BL19H](https://eth-sepolia.blockscout.com/address/0xEfefa2B63A173d56F9db79C5dd8A607F4aA859A5?tab=contract), [BL19S](https://eth-sepolia.blockscout.com/address/0x73E8809F163d4358773cc5F25c134997B4b842F4?tab=contract)); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode, all four |
| smoke test | `make smoke-bl19-sepolia`: every committed vector across the 65 ops matches the live objects |

Version 5 (2026-10-22): 65 ops, every one correctly rounded or exact, 0
misrounded of 360,590 random inputs (`docs/benchmarks/sweep.md`). The
objects are drawn by idea: **BL19**, the number (arithmetic, roots,
comparison, rounding, the directed edge and the conversions); **BL19E**,
the elementary functions on one exp/log kernel (exp, exp2, exp10, expm1,
ln, log2, log10, log2Up, log1p, pow, powu, compound); **BL19H**, the
hyperbolic functions (sinh, cosh, tanh, atanh), on their own copy of the
kernel because BL19E with them measured 27,308 bytes, over the 24,576
limit; **BL19S**, the special functions (erf, erfc, normCdf, lambertW0,
lambertWm1, factorial). `contracts/src/bl19/ops.json` names each op's
object. `pi` is the constant `BL19Lib.PI` and `gcd` is gone. Every result
is the word release four returned; the gas roughly halves (sweep medians,
release four → v5: add 1,278 → 677, mul 1,145 → 530, div 1,869 → 808, exp
7,715 → 3,299, ln 8,492 → 3,623, pow 14,834 → 5,902, cbrt 13,593 → 2,747,
erfc 34,236 → 13,943, lambertW0 34,049 → 10,623). It is a CLZ build (evm
osaka) and runs only on chains with EIP-7939 (`README.md` beside this
file). See `contracts/src/bl19/README.md` and `CHANGELOG.md`. Release four
(Blockulator 2.1) and releases one to three stay deployed and verified and
are recorded below; the ladder's version 10 `LadderBL19` inlines version
5.

## Release four (Blockulator 2.1)

Blockulator 2.1's BL19: four objects from one source, split where the
bytes fit rather than by idea, a shanghai build (no CLZ). All four stay
live and verified. Machine-readable copies: release four's BL19 record is
the entry `"release": 4` under `previous` in `BL19.json`; `BL19X.json`,
`BL19X2.json` and `BL19X3.json` are marked `"release": "Blockulator 2.1"`,
`"current": false`.

| object | ops | address | salt | runtime | tx | block | gas |
|---|---|---|---|---:|---|---:|---:|
| BL19 | 37 | `0xA3C8C8700465F9e20Ff9dfA64066c2EF693Aa6c9` | `FP19 v4` | 24,512 | [`0x0a1b6e69…`](https://sepolia.etherscan.io/tx/0x0a1b6e695daf18aec72e06e845054a4f88c1a5efd7970e68c6d1d9d41519e2d3) | 11,966,126 | 38,127,306 |
| BL19X | 5 | `0x175246B258Cc0dC3efEFe74b5fac8cC52C0c40d0` | `FP19X v4` | 22,266 | [`0x884c81bb…`](https://sepolia.etherscan.io/tx/0x884c81bb8676c772e6600cc0f44b9881845184259f885b226907e885c57cd8a4) | 11,966,129 | 34,652,817 |
| BL19X2 | 10 | `0xE655bB8b1Cf848cAf3FD69F381289d144f5Bc697` | `FP19X2 v4` | 19,889 | [`0xa676a8a4…`](https://sepolia.etherscan.io/tx/0xa676a8a492ed388420a3bef25b409d207eb9910c00c41c20737d5bd843c23c16) | 11,966,115 | 30,975,905 |
| BL19X3 | 15 | `0x59D51481cb2EA924EC17FE263cd05b90CEF22383` | `FP19X3 v4` | 6,844 | [`0x252161af…`](https://sepolia.etherscan.io/tx/0x252161af138136f30fce0d5627ddb5435a1322261a28b7686f11005fdb3064fc) | 11,966,114 | 10,796,734 |

| | |
|---|---|
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salts | ASCII `FP256 v4`, `FP256X v4`, `FP256X2 v4`, `FP256X3 v4`, right-padded to 32 bytes (the full words are in the JSON records) |
| init code hashes | BL19 `0x3cac0285cff464274572f034682cdae1d9d770508fe66f6bf5dd5dfd0811029c`, BL19X `0x3ede368fc0804e5edd17ca82d1063570d2ce3550f6838a906aa968806ef341a8`, BL19X2 `0x8a183b751af80a9f312e5002ec1a389568708e47cd649f1ba488346cdfd650b2`, BL19X3 `0x3e6016f365223f19b923f2b9fa651890899006bceebbce9b0b9c6d557e9d2047` |
| runtime keccak256 | BL19 `0xde448471e5321fb9e30222069f5faffdd8a1f8df059a5c052a9da9750847e6bb`, BL19X `0x6e07827a3a01f077dc012c8d49ae6dde37ed37d9602151352e92429eba72cd2d`, BL19X2 `0x6df9bb20a582f8efed6f8e4e3fc4600a3f84e0ead919e8bbb5b733d5c299735d`, BL19X3 `0xeffbe5551a627f01e05fe13f512ece01c67fb2d161a379f31087d66c92a8d777` |
| source | `contracts/src/bl19/BL19.yul`, `BL19X.yul`, `BL19X2.yul`, `BL19X3.yul`, generated from `BL19.yul.src` at the source commit below |
| compiler | solc 0.8.24+commit.e11b9ed9, language Yul, optimizer on, 200 runs, evm shanghai |
| deployed | 2026-10-21, gas at Sepolia's code pricing (the deploy limit is 40M) |
| source commit | `8e65894` (master after PR #112) |
| verification | Sourcify ([BL19](https://repo.sourcify.dev/11155111/0xA3C8C8700465F9e20Ff9dfA64066c2EF693Aa6c9), [BL19X](https://repo.sourcify.dev/11155111/0x175246B258Cc0dC3efEFe74b5fac8cC52C0c40d0), [BL19X2](https://repo.sourcify.dev/11155111/0xE655bB8b1Cf848cAf3FD69F381289d144f5Bc697), [BL19X3](https://repo.sourcify.dev/11155111/0x59D51481cb2EA924EC17FE263cd05b90CEF22383)) and Blockscout ([BL19](https://eth-sepolia.blockscout.com/address/0xA3C8C8700465F9e20Ff9dfA64066c2EF693Aa6c9?tab=contract), [BL19X](https://eth-sepolia.blockscout.com/address/0x175246B258Cc0dC3efEFe74b5fac8cC52C0c40d0?tab=contract), [BL19X2](https://eth-sepolia.blockscout.com/address/0xE655bB8b1Cf848cAf3FD69F381289d144f5Bc697?tab=contract), [BL19X3](https://eth-sepolia.blockscout.com/address/0x59D51481cb2EA924EC17FE263cd05b90CEF22383?tab=contract)); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode, all four |
| smoke test | `make smoke-bl19-sepolia`: every committed vector across the 67 ops matches the live objects |

Release four (2026-10-21): 67 ops, every one correctly rounded or exact, 0
misrounded of 364,658 random inputs (`docs/benchmarks/sweep.md`). A fast
value whose stated error bound reaches the rounding boundary is recomputed
in two words at 2^-510; pow, powu and compound compute exact ties exactly.
It adds the edge (`mulDown`, `mulUp`, `divDown`, `divUp`, `toUintDown`,
`toUintUp`, `toIntDown`, `toIntUp`, `toFixed18Down`, `toFixed18Up`,
`floor`, `ceil`, `fromUintDown`, `fromUintUp`) and every op BL127 has.
BL19 holds the arithmetic, the edge, exp, ln, log1p, expm1, pow, powu,
compound, the comparisons and the conversions; BL19X erf, erfc, normCdf
and both Lambert branches; BL19X2 exp2, exp10, log2, log10, log2Up, cbrt
and the hyperbolics; BL19X3 the algebraic ops. See
`contracts/src/bl19/README.md` and `CHANGELOG.md`. It was the BL19 of
Blockulator 2.1; the ladder's version 9 `LadderBL19` inlines it.

## Release three

| | |
|---|---|
| address | `0x67eFfb11bF93c79a2B12cc7872cBaC12b3eB61be` |
| chain | Ethereum Sepolia, chainId 11155111 |
| CREATE2 proxy | `0x4e59b44847b379578588920cA78FbF26c0B4956C` |
| salt | `0x4650323536207633000000000000000000000000000000000000000000000000` (ASCII `FP256 v3`, right-padded) |
| init code hash | `0x13b028e7fed15421c770eacf3e68867ef64eda26ab98aeaf1a29876bf323a74a` |
| runtime keccak256 | `0x1ec726a9a9f52715742d32ddb789c22304ad521449459632784a930880603daf` (24,299 bytes) |
| deployment tx | [`0x7104e7b3…f118a`](https://sepolia.etherscan.io/tx/0x7104e7b36d47f6ad53f116df97fc299469dbbf73464e4ff236fb7818a14f118a), block 11,928,969, 37,798,303 gas (Sepolia's code pricing; the same deploy estimates 5,405,229 gas on mainnet), 2026-10-16 |
| source commit | `f7f31aa` |
| verification | [Sourcify](https://repo.sourcify.dev/11155111/0x67eFfb11bF93c79a2B12cc7872cBaC12b3eB61be), [Blockscout](https://eth-sepolia.blockscout.com/address/0x67eFfb11bF93c79a2B12cc7872cBaC12b3eB61be?tab=contract); Etherscan unverified (no Yul support) |
| Sourcify match | `match` on creation and runtime bytecode |
| smoke test | `make smoke-bl19-sepolia`: every committed vector across 28 ops matches the live contract |

Release three (2026-10-16), Blockulator 2.0's BL19: 28 ops, adding log1p, expm1, erf, erfc, normCdf,
lambertW0, lambertWm1, powu and compound. exp, ln, log1p, expm1, erf, erfc,
normCdf and every non-transcendental op equal the oracle's word at every
committed vector; pow, powu and compound are within one unit in the last
place where |y log2 x| < 2^13; the Lambert branches are within two units away
from -1/e. Runtime 24,299 of the 24,576-byte limit.

## Release two

Live and verified at `0x2776d2BEE09683F95016eaF512939a7E21751C27` (salt `FP256 v2`, block 11,928,043, source
commit `3c99510`): 19 ops; exp, ln and pow on the 2^-254 kernels.

A first send of release two went out with release one's salt (a stale
`SALT19` in the Makefile) and put the same runtime at
`0x9cc0aB265F199F0889d84d12385d8724c864abf5`
([`0xb034dade…`](https://sepolia.etherscan.io/tx/0xb034dadee495b2b63fcf63a2820f0064c248584050d7243250900a5251fc3cd4)).
It is not the published address; use the one above.

## Release one

Live and verified at `0x628b8dfC82954983a9E8E22056ffc767B4a26077` (salt `FP256 v1`, block 11,922,179, source
commit `df5155d`): 19 ops; add, sub, mul, div, sqrt, the comparisons and the
conversions exact to the 237-bit grid; exp, ln and pow on BL127's 2^-192
kernels (146, 149 and 123 bits at worst over the vectors).

## Reproduce the bytecode

```sh
make build
FP_LIB=bl19 uv run scripts/bl127/stdjson.py check   # solc standard-json (language Yul) == Foundry artifact
make predict-bl19                                   # the BL19 address above, from the artifact alone
make predict-bl19e predict-bl19h predict-bl19n predict-bl19s   # the other four
FP_LIB=bl19 uv run scripts/bl127/stdjson.py onchain https://ethereum-sepolia-rpc.publicnode.com 0x94d9d43D6202827429a8058959eeCf6d232b8729
```
