Skip to content

Commit

Permalink
Bit packing step 1 (#46)
Browse files Browse the repository at this point in the history
Co-authored-by: Pierrick Turelier <pierrick@turelier.com>
  • Loading branch information
toninorair and PierrickGT authored Dec 13, 2023
1 parent d8d3a9e commit 29d0bf3
Show file tree
Hide file tree
Showing 7 changed files with 178 additions and 109 deletions.
19 changes: 10 additions & 9 deletions src/ContinuousIndexing.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@

pragma solidity 0.8.23;

import { UIntMath } from "./libs/UIntMath.sol";

import { IContinuousIndexing } from "./interfaces/IContinuousIndexing.sol";

import { ContinuousIndexingMath } from "./libs/ContinuousIndexingMath.sol";

abstract contract ContinuousIndexing is IContinuousIndexing {
// TODO: Consider packing these into a single slot.
uint256 internal _latestIndex;
uint256 internal _latestRate;
uint256 internal _latestUpdateTimestamp;
uint192 internal _latestIndex;
uint24 internal _latestRate;
uint40 internal _latestUpdateTimestamp;

constructor() {
_latestIndex = 1 * ContinuousIndexingMath.EXP_BASE_SCALE;
_latestUpdateTimestamp = block.timestamp;
_latestIndex = uint184(1 * ContinuousIndexingMath.EXP_BASE_SCALE);
_latestUpdateTimestamp = uint40(block.timestamp);
}

/******************************************************************************************************************\
Expand All @@ -30,9 +31,9 @@ abstract contract ContinuousIndexing is IContinuousIndexing {

if (_latestUpdateTimestamp == block.timestamp && _latestRate == rate_) return currentIndex_;

_latestIndex = currentIndex_;
_latestRate = rate_;
_latestUpdateTimestamp = block.timestamp;
_latestIndex = UIntMath.safe192(currentIndex_);
_latestRate = UIntMath.safe24(rate_);
_latestUpdateTimestamp = uint40(block.timestamp);

emit IndexUpdated(currentIndex_, _latestRate);
}
Expand Down
187 changes: 106 additions & 81 deletions src/Protocol.sol

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/interfaces/IProtocol.sol
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ interface IProtocol is IContinuousIndexing {
/// @notice The mint proposal of minters, only 1 active proposal per minter
function mintProposalOf(
address minter
) external view returns (uint256 mintId, address destination, uint256 amount, uint256 createdAt);
) external view returns (uint256 mintId, uint256 createdAt, address destination, uint256 amount);

/// @notice The minter's proposeRetrieval proposal amount
function pendingCollateralRetrievalOf(
Expand Down
33 changes: 33 additions & 0 deletions src/libs/UIntMath.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.23;

library UIntMath {
error InvalidUInt24();

error InvalidUInt40();

error InvalidUInt128();

error InvalidUInt192();

function safe24(uint256 n) internal pure returns (uint24) {
if (n > type(uint24).max) revert InvalidUInt24();
return uint24(n);
}

function safe40(uint256 n) internal pure returns (uint40) {
if (n > type(uint40).max) revert InvalidUInt40();
return uint40(n);
}

function safe128(uint256 n) internal pure returns (uint128) {
if (n > type(uint128).max) revert InvalidUInt128();
return uint128(n);
}

function safe192(uint256 n) internal pure returns (uint192) {
if (n > type(uint192).max) revert InvalidUInt192();
return uint192(n);
}
}
8 changes: 4 additions & 4 deletions test/Protocol.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ contract ProtocolTests is Test {

assertEq(mintId, expectedMintId);

(uint256 mintId_, address destination_, uint256 amount_, uint256 timestamp_) = _protocol.mintProposalOf(
(uint256 mintId_, uint256 timestamp_, address destination_, uint256 amount_) = _protocol.mintProposalOf(
_minter1
);

Expand Down Expand Up @@ -351,7 +351,7 @@ contract ProtocolTests is Test {
_protocol.mintM(mintId);

// check that mint request has been deleted
(uint256 mintId_, address destination_, uint256 amount_, uint256 timestamp_) = _protocol.mintProposalOf(
(uint256 mintId_, uint256 timestamp_, address destination_, uint256 amount_) = _protocol.mintProposalOf(
_minter1
);

Expand Down Expand Up @@ -519,7 +519,7 @@ contract ProtocolTests is Test {
vm.prank(_validator1);
_protocol.cancelMint(_minter1, mintId);

(uint256 mintId_, address destination_, uint256 amount_, uint256 timestamp) = _protocol.mintProposalOf(
(uint256 mintId_, uint256 timestamp, address destination_, uint256 amount_) = _protocol.mintProposalOf(
_minter1
);

Expand All @@ -536,7 +536,7 @@ contract ProtocolTests is Test {
vm.prank(_alice);
_protocol.cancelMint(_minter1, mintId);

(uint256 mintId_, address destination_, uint256 amount_, uint256 timestamp_) = _protocol.mintProposalOf(
(uint256 mintId_, uint256 timestamp_, address destination_, uint256 amount_) = _protocol.mintProposalOf(
_minter1
);

Expand Down
8 changes: 5 additions & 3 deletions test/utils/MTokenHarness.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,23 @@

pragma solidity 0.8.23;

import { UIntMath } from "../../src/libs/UIntMath.sol";

import { MToken } from "../../src/MToken.sol";

contract MTokenHarness is MToken {
constructor(address spogRegistrar_, address protocol_) MToken(spogRegistrar_, protocol_) {}

function setLatestIndex(uint256 index_) external {
_latestIndex = index_;
_latestIndex = UIntMath.safe192(index_);
}

function setLatestRate(uint256 rate_) external {
_latestRate = rate_;
_latestRate = UIntMath.safe24(rate_);
}

function setLatestUpdated(uint256 timestamp_) external {
_latestUpdateTimestamp = timestamp_;
_latestUpdateTimestamp = uint40(timestamp_);
}

function setIsEarning(address account_, bool isEarning_) external {
Expand Down
30 changes: 19 additions & 11 deletions test/utils/ProtocolHarness.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

pragma solidity 0.8.23;

import { UIntMath } from "../../src/libs/UIntMath.sol";

import { Protocol } from "../../src/Protocol.sol";

contract ProtocolHarness is Protocol {
Expand All @@ -16,7 +18,7 @@ contract ProtocolHarness is Protocol {
}

function setActiveMinter(address minter_, bool isActive_) external {
_isActiveMinter[minter_] = isActive_;
_minterBasics[minter_].isActive = isActive_;
}

function setMintProposalOf(
Expand All @@ -26,40 +28,46 @@ contract ProtocolHarness is Protocol {
address destination_
) external returns (uint256 mintId_) {
mintId_ = ++_mintNonce;
_mintProposals[minter_] = MintProposal(mintId_, destination_, amount_, createdAt_);

_mintProposals[minter_] = MintProposal(
uint48(mintId_),
uint40(createdAt_),
destination_,
UIntMath.safe128(amount_)
);
}

function setCollateralOf(address minter_, uint256 collateral_) external {
_collaterals[minter_] = collateral_;
_minterBasics[minter_].collateral = UIntMath.safe128(collateral_);
}

function setCollateralUpdateOf(address minter_, uint256 lastUpdated_) external {
_lastCollateralUpdates[minter_] = lastUpdated_;
_minterBasics[minter_].updateTimestamp = uint40(lastUpdated_);
}

function setLastCollateralUpdateIntervalOf(address minter_, uint256 updateInterval_) external {
_lastUpdateIntervals[minter_] = updateInterval_;
_minterBasics[minter_].lastUpdateInterval = uint32(updateInterval_);
}

function setPenalizedUntilOf(address minter_, uint256 penalizedUntil_) external {
_penalizedUntilTimestamps[minter_] = penalizedUntil_;
_minterBasics[minter_].penalizedUntilTimestamp = uint40(penalizedUntil_);
}

function setPrincipalOfActiveOwedMOf(address minter_, uint256 amount_) external {
_principalOfActiveOwedM[minter_] = amount_;
_totalPrincipalOfActiveOwedM += amount_; // TODO: fix this side effect.
_owedM[minter_].principalOfActive = UIntMath.safe128(amount_);
_totalPrincipalOfActiveOwedM += UIntMath.safe128(amount_); // TODO: fix this side effect. ?
}

function setLatestIndex(uint256 index_) external {
_latestIndex = index_;
_latestIndex = UIntMath.safe192(index_);
}

function setLatestRate(uint256 rate_) external {
_latestRate = rate_;
_latestRate = UIntMath.safe24(rate_);
}

function principalOfActiveOwedMOf(address minter_) external view returns (uint256 principalOfActiveOwedM_) {
return _principalOfActiveOwedM[minter_];
return _owedM[minter_].principalOfActive;
}

function rate() external view returns (uint256 rate_) {
Expand Down

0 comments on commit 29d0bf3

Please sign in to comment.