# FP19 deployment record

FP19 v5 (Blockulator 2.2), the 256-bit float, is four Yul objects
generated from one source (`contracts/src/fp19/FP19.yul.src`), one idea
each, deployed with CREATE2 through Arachnid's deterministic-deployment
proxy exactly as FP127 is (see `FP127.md` for the procedure, the gas note
and the trust model). Machine-readable copies: `FP19.json`, `FP19E.json`,
`FP19H.json`, `FP19S.json`, with each raw receipt beside them.

| object | ops | address | salt | runtime | tx | block | gas |
|---|---|---|---|---:|---|---:|---:|
| FP19 | 43 | `0xAa1f71B7B08d568379b28E1488c6B737a1C6eb52` | `FP19 v5` | 10,333 | [`0x0cdfb53f…`](https://sepolia.etherscan.io/tx/0x0cdfb53f58b261b6895bac0ebf10ed6ef57c9afde85b7a28f9c3eca0a5d26134) | 11,974,969 | 16,193,275 |
| FP19E | 12 | `0x017F68A57dD53a6dF2043c24B712b287F9549AE2` | `FP19E v5` | 21,598 | [`0x45cb7924…`](https://sepolia.etherscan.io/tx/0x45cb792403660f9a9e6e585ba4e8e20165c8075b27e5c63f5ad87716bc532e63) | 11,974,970 | 33,619,670 |
| FP19H | 4 | `0xEfefa2B63A173d56F9db79C5dd8A607F4aA859A5` | `FP19H v5` | 13,021 | [`0x25b3aef8…`](https://sepolia.etherscan.io/tx/0x25b3aef8bf7e9a21f72778413a459eccd23ae835f0906b1bd52d9a0e833fdfe1) | 11,974,971 | 20,351,815 |
| FP19S | 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 | FP19 `0x476685947058e5d24adf3a1c1cdff1e30c4e5fee3f31cb82939ab3368881ce7c`, FP19E `0x09d5a094a44639afe8f04dd465a9c4314e19c7dc8e7ff33cc3e627ac5aab24bf`, FP19H `0xde27fe5b9ea1ac6a8cb6505933f3207a3d5610230fde98dd4410b6aca65bce4c`, FP19S `0xd03923031c2c938270a81813883b72261e01a68244f276de5dc39a611db28c4e` |
| runtime keccak256 | FP19 `0xc8e37d8828b81656310c3f66ce7615a0cb14d464c6bc601459b368e379eaed95`, FP19E `0x7a0573d94148024d9baf53aeed4040824fe4c113e4b8969100d0b30cb5b28059`, FP19H `0xb52c16b22ab43a20da93920f6e027381feb433707b9a69d37df64fda66e30861`, FP19S `0x3ca6c971e89ab5b43745236477403fdaaee3d12ea1b63c29e4af85326ee47522` |
| source | `contracts/src/fp19/FP19.yul`, `FP19E.yul`, `FP19H.yul`, `FP19S.yul`, generated from `FP19.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/fp127/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 ([FP19](https://repo.sourcify.dev/11155111/0xAa1f71B7B08d568379b28E1488c6B737a1C6eb52), [FP19E](https://repo.sourcify.dev/11155111/0x017F68A57dD53a6dF2043c24B712b287F9549AE2), [FP19H](https://repo.sourcify.dev/11155111/0xEfefa2B63A173d56F9db79C5dd8A607F4aA859A5), [FP19S](https://repo.sourcify.dev/11155111/0x73E8809F163d4358773cc5F25c134997B4b842F4)) and Blockscout ([FP19](https://eth-sepolia.blockscout.com/address/0xAa1f71B7B08d568379b28E1488c6B737a1C6eb52?tab=contract), [FP19E](https://eth-sepolia.blockscout.com/address/0x017F68A57dD53a6dF2043c24B712b287F9549AE2?tab=contract), [FP19H](https://eth-sepolia.blockscout.com/address/0xEfefa2B63A173d56F9db79C5dd8A607F4aA859A5?tab=contract), [FP19S](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-fp19-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: **FP19**, the number (arithmetic, roots,
comparison, rounding, the directed edge and the conversions); **FP19E**,
the elementary functions on one exp/log kernel (exp, exp2, exp10, expm1,
ln, log2, log10, log2Up, log1p, pow, powu, compound); **FP19H**, the
hyperbolic functions (sinh, cosh, tanh, atanh), on their own copy of the
kernel because FP19E with them measured 27,308 bytes, over the 24,576
limit; **FP19S**, the special functions (erf, erfc, normCdf, lambertW0,
lambertWm1, factorial). `contracts/src/fp19/ops.json` names each op's
object. `pi` is the constant `FP19Lib.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/fp19/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 `LadderFP19` inlines version
5.

## Release four (Blockulator 2.1)

Blockulator 2.1's FP19: 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 FP19 record is
the entry `"release": 4` under `previous` in `FP19.json`; `FP19X.json`,
`FP19X2.json` and `FP19X3.json` are marked `"release": "Blockulator 2.1"`,
`"current": false`.

| object | ops | address | salt | runtime | tx | block | gas |
|---|---|---|---|---:|---|---:|---:|
| FP19 | 37 | `0xA3C8C8700465F9e20Ff9dfA64066c2EF693Aa6c9` | `FP19 v4` | 24,512 | [`0x0a1b6e69…`](https://sepolia.etherscan.io/tx/0x0a1b6e695daf18aec72e06e845054a4f88c1a5efd7970e68c6d1d9d41519e2d3) | 11,966,126 | 38,127,306 |
| FP19X | 5 | `0x175246B258Cc0dC3efEFe74b5fac8cC52C0c40d0` | `FP19X v4` | 22,266 | [`0x884c81bb…`](https://sepolia.etherscan.io/tx/0x884c81bb8676c772e6600cc0f44b9881845184259f885b226907e885c57cd8a4) | 11,966,129 | 34,652,817 |
| FP19X2 | 10 | `0xE655bB8b1Cf848cAf3FD69F381289d144f5Bc697` | `FP19X2 v4` | 19,889 | [`0xa676a8a4…`](https://sepolia.etherscan.io/tx/0xa676a8a492ed388420a3bef25b409d207eb9910c00c41c20737d5bd843c23c16) | 11,966,115 | 30,975,905 |
| FP19X3 | 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 | FP19 `0x3cac0285cff464274572f034682cdae1d9d770508fe66f6bf5dd5dfd0811029c`, FP19X `0x3ede368fc0804e5edd17ca82d1063570d2ce3550f6838a906aa968806ef341a8`, FP19X2 `0x8a183b751af80a9f312e5002ec1a389568708e47cd649f1ba488346cdfd650b2`, FP19X3 `0x3e6016f365223f19b923f2b9fa651890899006bceebbce9b0b9c6d557e9d2047` |
| runtime keccak256 | FP19 `0xde448471e5321fb9e30222069f5faffdd8a1f8df059a5c052a9da9750847e6bb`, FP19X `0x6e07827a3a01f077dc012c8d49ae6dde37ed37d9602151352e92429eba72cd2d`, FP19X2 `0x6df9bb20a582f8efed6f8e4e3fc4600a3f84e0ead919e8bbb5b733d5c299735d`, FP19X3 `0xeffbe5551a627f01e05fe13f512ece01c67fb2d161a379f31087d66c92a8d777` |
| source | `contracts/src/fp19/FP19.yul`, `FP19X.yul`, `FP19X2.yul`, `FP19X3.yul`, generated from `FP19.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 ([FP19](https://repo.sourcify.dev/11155111/0xA3C8C8700465F9e20Ff9dfA64066c2EF693Aa6c9), [FP19X](https://repo.sourcify.dev/11155111/0x175246B258Cc0dC3efEFe74b5fac8cC52C0c40d0), [FP19X2](https://repo.sourcify.dev/11155111/0xE655bB8b1Cf848cAf3FD69F381289d144f5Bc697), [FP19X3](https://repo.sourcify.dev/11155111/0x59D51481cb2EA924EC17FE263cd05b90CEF22383)) and Blockscout ([FP19](https://eth-sepolia.blockscout.com/address/0xA3C8C8700465F9e20Ff9dfA64066c2EF693Aa6c9?tab=contract), [FP19X](https://eth-sepolia.blockscout.com/address/0x175246B258Cc0dC3efEFe74b5fac8cC52C0c40d0?tab=contract), [FP19X2](https://eth-sepolia.blockscout.com/address/0xE655bB8b1Cf848cAf3FD69F381289d144f5Bc697?tab=contract), [FP19X3](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-fp19-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 FP127 has.
FP19 holds the arithmetic, the edge, exp, ln, log1p, expm1, pow, powu,
compound, the comparisons and the conversions; FP19X erf, erfc, normCdf
and both Lambert branches; FP19X2 exp2, exp10, log2, log10, log2Up, cbrt
and the hyperbolics; FP19X3 the algebraic ops. See
`contracts/src/fp19/README.md` and `CHANGELOG.md`. It was the FP19 of
Blockulator 2.1; the ladder's version 9 `LadderFP19` 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-fp19-sepolia`: every committed vector across 28 ops matches the live contract |

Release three (2026-10-16), Blockulator 2.0's FP19: 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 FP127's 2^-192
kernels (146, 149 and 123 bits at worst over the vectors).

## Reproduce the bytecode

```sh
make build
FP_LIB=fp19 uv run scripts/fp127/stdjson.py check   # solc standard-json (language Yul) == Foundry artifact
make predict-fp19                                   # the FP19 address above, from the artifact alone
make predict-fp19e predict-fp19h predict-fp19s    # the other three
FP_LIB=fp19 uv run scripts/fp127/stdjson.py onchain https://ethereum-sepolia-rpc.publicnode.com 0xAa1f71B7B08d568379b28E1488c6B737a1C6eb52
```
