// SPDX-License-Identifier: MIT pragma solidity 0.8.15; using LPPMetadataLib for LPPMetaData global; /// @notice Packed LPP metadata. /// ┌─────────────┬────────────────────────────────────────────┐ /// │ Bit Offsets │ Description │ /// ├─────────────┼────────────────────────────────────────────┤ /// │ [0, 64) │ Timestamp (Finalized - All data available) │ /// │ [64, 96) │ Part Offset │ /// │ [96, 128) │ Claimed Size │ /// │ [128, 160) │ Blocks Processed (Inclusive of Padding) │ /// │ [160, 192) │ Bytes Processed (Non-inclusive of Padding) │ /// │ [192, 256) │ Countered │ /// └─────────────┴────────────────────────────────────────────┘ type LPPMetaData is bytes32; /// @notice LPP metadata UDT extension functions. library LPPMetadataLib { uint256 private constant U64_MASK = 0xFFFFFFFFFFFFFFFF; uint256 private constant U32_MASK = 0xFFFFFFFF; function setTimestamp(LPPMetaData _self, uint64 _timestamp) internal pure returns (LPPMetaData self_) { assembly { self_ := or(shl(192, _timestamp), and(_self, not(shl(192, U64_MASK)))) } } function setPartOffset(LPPMetaData _self, uint32 _partOffset) internal pure returns (LPPMetaData self_) { assembly { self_ := or(shl(160, _partOffset), and(_self, not(shl(160, U32_MASK)))) } } function setClaimedSize(LPPMetaData _self, uint32 _claimedSize) internal pure returns (LPPMetaData self_) { assembly { self_ := or(shl(128, _claimedSize), and(_self, not(shl(128, U32_MASK)))) } } function setBlocksProcessed(LPPMetaData _self, uint32 _blocksProcessed) internal pure returns (LPPMetaData self_) { assembly { self_ := or(shl(96, _blocksProcessed), and(_self, not(shl(96, U32_MASK)))) } } function setBytesProcessed(LPPMetaData _self, uint32 _bytesProcessed) internal pure returns (LPPMetaData self_) { assembly { self_ := or(shl(64, _bytesProcessed), and(_self, not(shl(64, U32_MASK)))) } } function setCountered(LPPMetaData _self, bool _countered) internal pure returns (LPPMetaData self_) { assembly { self_ := or(_countered, and(_self, not(U64_MASK))) } } function timestamp(LPPMetaData _self) internal pure returns (uint64 timestamp_) { assembly { timestamp_ := shr(192, _self) } } function partOffset(LPPMetaData _self) internal pure returns (uint64 partOffset_) { assembly { partOffset_ := and(shr(160, _self), U32_MASK) } } function claimedSize(LPPMetaData _self) internal pure returns (uint32 claimedSize_) { assembly { claimedSize_ := and(shr(128, _self), U32_MASK) } } function blocksProcessed(LPPMetaData _self) internal pure returns (uint32 blocksProcessed_) { assembly { blocksProcessed_ := and(shr(96, _self), U32_MASK) } } function bytesProcessed(LPPMetaData _self) internal pure returns (uint32 bytesProcessed_) { assembly { bytesProcessed_ := and(shr(64, _self), U32_MASK) } } function countered(LPPMetaData _self) internal pure returns (bool countered_) { assembly { countered_ := and(_self, U64_MASK) } } }