From 29baa910d85d1c84eb380c81216cde0f577c292c Mon Sep 17 00:00:00 2001 From: 0xc0de4c0ffee <43116881+0xc0de4c0ffee@users.noreply.github.com> Date: Tue, 21 Apr 2026 16:36:18 +0530 Subject: [PATCH 1/2] use solady/libzip --- src/HTMLRegistry.sol | 13 +++++++++-- test/HTMLRegistry.t.sol | 51 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/HTMLRegistry.sol b/src/HTMLRegistry.sol index 7a67d4c..40c2d57 100644 --- a/src/HTMLRegistry.sol +++ b/src/HTMLRegistry.sol @@ -2,7 +2,8 @@ pragma solidity ^0.8.13; import {SSTORE2} from "solady/utils/SSTORE2.sol"; - +import {LibBytes} from "solady/utils/LibBytes.sol"; +import {LibZip} from "solady/utils/LibZip.sol"; interface IOwnable { function owner() external view returns (address); } @@ -10,6 +11,8 @@ interface IOwnable { /// @title HTMLRegistry /// @notice On-chain registry for associating HTML content to protocols or accounts contract HTMLRegistry { + bytes4 public constant _FLZ_COMPRESS_SELECTOR = bytes4(keccak256("flzCompress(bytes)")); + /// @dev author => target => version => content mapping(address => mapping(address => mapping(uint256 => address))) sPtrs; /// @dev author => target => latest version @@ -44,7 +47,13 @@ contract HTMLRegistry { function _html(address author, address target, uint256 version) internal view returns (bytes memory) { address ptr = sPtrs[author][target][version]; if (ptr == address(0)) return new bytes(0); - return SSTORE2.read(ptr); + bytes memory data = SSTORE2.read(ptr); + if (data.length < 4) return data; + + bytes4 prefix = bytes4(bytes32(LibBytes.slice(data, 0, 4))); + if (prefix != _FLZ_COMPRESS_SELECTOR) return data; + + return LibZip.flzDecompress(LibBytes.slice(data, 4)); } function setHtml(address target, bytes calldata htmlData) external onlyAuthorized(target) { diff --git a/test/HTMLRegistry.t.sol b/test/HTMLRegistry.t.sol index 40a9a93..f90ccf6 100644 --- a/test/HTMLRegistry.t.sol +++ b/test/HTMLRegistry.t.sol @@ -2,12 +2,15 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; import {HTMLRegistry} from "../src/HTMLRegistry.sol"; +import {LibZip} from "solady/utils/LibZip.sol"; contract HTMLRegistryTest is Test { HTMLRegistry public registry; address alice = makeAddr("alice"); address bob = makeAddr("bob"); + bytes4 internal constant _FLZ_COMPRESS_SELECTOR = bytes4(keccak256("flzCompress(bytes)")); function setUp() public { registry = new HTMLRegistry(); @@ -101,6 +104,54 @@ contract HTMLRegistryTest is Test { assertEq(registry.html(alice, alice, 2), new bytes(0)); } + function test_html_decompressesWhenPrefixed() public { + bytes memory compressed = bytes.concat(_FLZ_COMPRESS_SELECTOR, LibZip.flzCompress(_HTML)); + vm.prank(alice); + registry.setHtml(alice, compressed); + + assertEq(registry.html(alice, alice), _HTML); + } + + function test_html_returnsRawWhenPrefixDoesNotMatch() public { + bytes memory payload = bytes.concat(bytes4(0xdeadbeef), bytes("raw bytes")); + vm.prank(alice); + registry.setHtml(alice, payload); + + assertEq(registry.html(alice, alice), payload); + } + + function test_html_returnsRawWhenDataTooShortForPrefix() public { + bytes memory payload = hex"010203"; + vm.prank(alice); + registry.setHtml(alice, payload); + + assertEq(registry.html(alice, alice), payload); + } + + function test_storageMetrics_plainVsCompressed() public { + bytes memory compressedBody = LibZip.flzCompress(_HTML); + bytes memory compressedPayload = bytes.concat(_FLZ_COMPRESS_SELECTOR, compressedBody); + + vm.startPrank(alice); + uint256 gasStartPlain = gasleft(); + registry.setHtml(alice, _HTML); + uint256 gasUsedPlain = gasStartPlain - gasleft(); + + uint256 gasStartCompressed = gasleft(); + registry.setHtml(alice, compressedPayload); + uint256 gasUsedCompressed = gasStartCompressed - gasleft(); + vm.stopPrank(); + + assertEq(registry.html(alice, alice, 1), _HTML); + assertEq(registry.html(alice, alice, 2), _HTML); + + console2.log("plain length", _HTML.length); + console2.log("compressed length", compressedBody.length); + console2.log("compressed+selector length", compressedPayload.length); + console2.log("plain write gas", gasUsedPlain); + console2.log("compressed write gas", gasUsedCompressed); + } + function test_emitsHtmlSet() public { vm.startPrank(alice); vm.expectEmit(true, true, false, true); From e1cae6501a638b30acd92ceceb7b03e8d35145be Mon Sep 17 00:00:00 2001 From: 0xc0de4c0ffee <43116881+0xc0de4c0ffee@users.noreply.github.com> Date: Tue, 21 Apr 2026 17:54:54 +0530 Subject: [PATCH 2/2] 0xffffffff as compressed data selector --- src/HTMLRegistry.sol | 10 +++------- test/HTMLRegistry.t.sol | 5 ++--- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/HTMLRegistry.sol b/src/HTMLRegistry.sol index 40c2d57..62b0e61 100644 --- a/src/HTMLRegistry.sol +++ b/src/HTMLRegistry.sol @@ -11,8 +11,6 @@ interface IOwnable { /// @title HTMLRegistry /// @notice On-chain registry for associating HTML content to protocols or accounts contract HTMLRegistry { - bytes4 public constant _FLZ_COMPRESS_SELECTOR = bytes4(keccak256("flzCompress(bytes)")); - /// @dev author => target => version => content mapping(address => mapping(address => mapping(uint256 => address))) sPtrs; /// @dev author => target => latest version @@ -48,12 +46,10 @@ contract HTMLRegistry { address ptr = sPtrs[author][target][version]; if (ptr == address(0)) return new bytes(0); bytes memory data = SSTORE2.read(ptr); - if (data.length < 4) return data; - - bytes4 prefix = bytes4(bytes32(LibBytes.slice(data, 0, 4))); - if (prefix != _FLZ_COMPRESS_SELECTOR) return data; + + if (bytes4(bytes32(data)) == bytes4(0xffffffff)) return LibZip.flzDecompress(LibBytes.slice(data, 4)); - return LibZip.flzDecompress(LibBytes.slice(data, 4)); + return data; } function setHtml(address target, bytes calldata htmlData) external onlyAuthorized(target) { diff --git a/test/HTMLRegistry.t.sol b/test/HTMLRegistry.t.sol index f90ccf6..231a395 100644 --- a/test/HTMLRegistry.t.sol +++ b/test/HTMLRegistry.t.sol @@ -10,7 +10,6 @@ contract HTMLRegistryTest is Test { HTMLRegistry public registry; address alice = makeAddr("alice"); address bob = makeAddr("bob"); - bytes4 internal constant _FLZ_COMPRESS_SELECTOR = bytes4(keccak256("flzCompress(bytes)")); function setUp() public { registry = new HTMLRegistry(); @@ -105,7 +104,7 @@ contract HTMLRegistryTest is Test { } function test_html_decompressesWhenPrefixed() public { - bytes memory compressed = bytes.concat(_FLZ_COMPRESS_SELECTOR, LibZip.flzCompress(_HTML)); + bytes memory compressed = bytes.concat(bytes4(0xffffffff), LibZip.flzCompress(_HTML)); vm.prank(alice); registry.setHtml(alice, compressed); @@ -130,7 +129,7 @@ contract HTMLRegistryTest is Test { function test_storageMetrics_plainVsCompressed() public { bytes memory compressedBody = LibZip.flzCompress(_HTML); - bytes memory compressedPayload = bytes.concat(_FLZ_COMPRESS_SELECTOR, compressedBody); + bytes memory compressedPayload = bytes.concat(bytes4(0xffffffff), compressedBody); vm.startPrank(alice); uint256 gasStartPlain = gasleft();