Skip to content

Commit

Permalink
T
Browse files Browse the repository at this point in the history
  • Loading branch information
Vectorized committed Jun 29, 2024
1 parent 43cb262 commit afe3bc7
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 44 deletions.
14 changes: 7 additions & 7 deletions .gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -732,21 +732,21 @@ LibPRNGTest:testPRNGShuffleGas() (gas: 1610927)
LibPRNGTest:testPRNGUniform() (gas: 559430)
LibPRNGTest:testStandardNormalWad() (gas: 4425913)
LibPRNGTest:test__codesize() (gas: 14289)
LibRLPTest:testComputeAddressDifferential(address,uint256) (runs: 298, μ: 2406, ~: 2257)
LibRLPTest:testComputeAddressDifferential(address,uint256) (runs: 298, μ: 2389, ~: 2179)
LibRLPTest:testComputeAddressForLargeNonces() (gas: 1737)
LibRLPTest:testComputeAddressForSmallNonces() (gas: 1007)
LibRLPTest:testComputeAddressOriginalForLargeNonces() (gas: 3743)
LibRLPTest:testComputeAddressOriginalForSmallNonces() (gas: 2218)
LibRLPTest:testRLPEncodeBytes() (gas: 383735)
LibRLPTest:testRLPEncodeBytesDifferential(bytes) (runs: 298, μ: 2570, ~: 2320)
LibRLPTest:testRLPEncodeList() (gas: 4885)
LibRLPTest:testRLPEncodeList() (gas: 5230)
LibRLPTest:testRLPEncodeList2() (gas: 15468)
LibRLPTest:testRLPEncodeUint() (gas: 146294)
LibRLPTest:testRLPEncodeUint(uint256) (runs: 298, μ: 2148, ~: 2000)
LibRLPTest:testRLPEncodeUintDifferential(uint256) (runs: 298, μ: 2442, ~: 2392)
LibRLPTest:testRLPEncodeUint(uint256) (runs: 298, μ: 2187, ~: 2046)
LibRLPTest:testRLPEncodeUintDifferential(uint256) (runs: 298, μ: 2463, ~: 2415)
LibRLPTest:testRLPPUint256() (gas: 250190)
LibRLPTest:testSmallLog256Equivalence(uint256) (runs: 298, μ: 851, ~: 934)
LibRLPTest:test__codesize() (gas: 11550)
LibRLPTest:testSmallLog256Equivalence(uint256) (runs: 298, μ: 856, ~: 934)
LibRLPTest:test__codesize() (gas: 11475)
LibSortTest:testCopy(uint256) (runs: 298, μ: 138799, ~: 26968)
LibSortTest:testInsertionSortAddressesDifferential(uint256) (runs: 298, μ: 73417, ~: 25190)
LibSortTest:testInsertionSortInts() (gas: 112151)
Expand Down Expand Up @@ -1239,7 +1239,7 @@ UpgradeableBeaconTest:testUpgradeableSolidityBeaconOnlyOwnerFunctions() (gas: 26
UpgradeableBeaconTest:testUpgradeableYulBeaconOnlyFnSelectorNotRecognised() (gas: 172796)
UpgradeableBeaconTest:testUpgradeableYulBeaconOnlyOwnerFunctions() (gas: 198398)
UpgradeableBeaconTest:test__codesize() (gas: 8808)
WETHInvariants:invariantTotalSupplyEqualsBalance() (runs: 10, calls: 150, reverts: 77)
WETHInvariants:invariantTotalSupplyEqualsBalance() (runs: 10, calls: 150, reverts: 78)
WETHInvariants:test__codesize() (gas: 5178)
WETHTest:testDeposit() (gas: 62272)
WETHTest:testDeposit(uint256) (runs: 298, μ: 61542, ~: 62566)
Expand Down
54 changes: 36 additions & 18 deletions src/utils/LibRLP.sol
Original file line number Diff line number Diff line change
Expand Up @@ -87,53 +87,71 @@ library LibRLP {
/* RLP ENCODING OPERATIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @dev Appends `x` to `l`.
function p(List memory l, uint256 x) internal pure returns (List memory result) {
/// @dev Returns a new empty list.
function l() internal pure returns (List memory result) {}

/// @dev Returns a new list with `x` as the only element.
function l(uint256 x) internal pure returns (List memory result) {
p(result, x);
}

/// @dev Returns a new list with `x` as the only element.
function l(bytes memory x) internal pure returns (List memory result) {
p(result, x);
}

/// @dev Returns a new list with `x` as the only element.
function l(List memory x) internal pure returns (List memory result) {
p(result, x);
}

/// @dev Appends `x` to `list`.
function p(List memory list, uint256 x) internal pure returns (List memory result) {
/// @solidity memory-safe-assembly
assembly {
mstore(result, shl(48, x))
let v := or(shr(mload(l), result), mload(l))
let v := or(shr(mload(list), result), mload(list))
let tail := shr(40, v)
mstore(l, xor(shl(40, xor(tail, result)), v)) // Update the tail.
mstore(list, xor(shl(40, xor(tail, result)), v)) // Update the tail.
mstore(tail, or(mload(tail), result)) // Make the previous tail point to `m`.
if shr(208, x) {
let m := mload(0x40)
mstore(m, x)
mstore(0x40, add(m, 0x20))
mstore(result, shl(40, or(1, shl(8, m))))
}
result := l
result := list
}
}

/// @dev Appends `x` to `l`.
function p(List memory l, bytes memory x) internal pure returns (List memory result) {
/// @dev Appends `x` to `list`.
function p(List memory list, bytes memory x) internal pure returns (List memory result) {
/// @solidity memory-safe-assembly
assembly {
mstore(result, shl(40, or(2, shl(8, x))))
let v := or(shr(mload(l), result), mload(l))
let v := or(shr(mload(list), result), mload(list))
let tail := shr(40, v)
mstore(l, xor(shl(40, xor(tail, result)), v)) // Update the tail.
mstore(list, xor(shl(40, xor(tail, result)), v)) // Update the tail.
mstore(tail, or(mload(tail), result)) // Make the previous tail point to `m`.
result := l
result := list
}
}

/// @dev Appends `x` to `l`.
function p(List memory l, List memory x) internal pure returns (List memory result) {
/// @dev Appends `x` to `list`.
function p(List memory list, List memory x) internal pure returns (List memory result) {
/// @solidity memory-safe-assembly
assembly {
mstore(result, shl(40, or(3, shl(8, x))))
let v := or(shr(mload(l), result), mload(l))
let v := or(shr(mload(list), result), mload(list))
let tail := shr(40, v)
mstore(l, xor(shl(40, xor(tail, result)), v)) // Update the tail.
mstore(list, xor(shl(40, xor(tail, result)), v)) // Update the tail.
mstore(tail, or(mload(tail), result)) // Make the previous tail point to `m`.
result := l
result := list
}
}

/// @dev Returns the RLP encoding of `l`.
function encode(List memory l) internal pure returns (bytes memory result) {
/// @dev Returns the RLP encoding of `list`.
function encode(List memory list) internal pure returns (bytes memory result) {
/// @solidity memory-safe-assembly
assembly {
function encodeUint(x_, o_) -> _o {
Expand Down Expand Up @@ -210,7 +228,7 @@ library LibRLP {
}
result := mload(0x40)
let begin := add(result, 0x20)
let end := encodeList(l, begin)
let end := encodeList(list, begin)
mstore(result, sub(end, begin))
mstore(end, 0)
mstore(0x40, add(end, 0x20))
Expand Down
22 changes: 3 additions & 19 deletions test/LibRLP.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -301,25 +301,9 @@ contract LibRLPTest is SoladyTest {
function testRLPEncodeList() public {
LibRLP.List memory l;
assertEq(LibRLP.encode(l), hex"c0");
{
LibRLP.List memory t0;
l.p(t0);
}
{
LibRLP.List memory t1a;
LibRLP.List memory t1b;
t1a.p(t1b);
l.p(t1a);
}
{
LibRLP.List memory t2a;
LibRLP.List memory t2b;
LibRLP.List memory t2c;
t2a.p(t2c);
t2a.p(t2b);
t2b.p(t2c);
l.p(t2a);
}
l.p(LibRLP.l());
l.p(LibRLP.l(LibRLP.l()));
l.p(LibRLP.l(LibRLP.l()).p(LibRLP.l(LibRLP.l())));
_checkMemory();
bytes memory computed = LibRLP.encode(l);
_checkMemory();
Expand Down

0 comments on commit afe3bc7

Please sign in to comment.