Skip to content

Commit

Permalink
(Circles, (ERC20)DiscountedBalances, Hub): optimise storage read/writ…
Browse files Browse the repository at this point in the history
…es for memory where applicable
  • Loading branch information
benjaminbollen committed Aug 7, 2024
1 parent ef8f90f commit df2d292
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 14 deletions.
8 changes: 5 additions & 3 deletions src/circles/Circles.sol
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ contract Circles is ERC1155, ICirclesErrors {
* @return endPeriod The end of the claimable period.
*/
function calculateIssuance(address _human) public view returns (uint256, uint256, uint256) {
MintTime storage mintTime = mintTimes[_human];
MintTime memory mintTime = mintTimes[_human];
if (mintTime.mintV1Status != address(0) && mintTime.mintV1Status != CIRCLES_STOPPED_V1) {
// Circles v1 contract cannot be active.
revert CirclesERC1155MintBlocked(_human, mintTime.mintV1Status);
Expand Down Expand Up @@ -211,7 +211,7 @@ contract Circles is ERC1155, ICirclesErrors {
_mint(_account, _id, _value, _data);

uint64 today = day(block.timestamp);
DiscountedBalance storage totalSupplyBalance = discountedTotalSupplies[_id];
DiscountedBalance memory totalSupplyBalance = discountedTotalSupplies[_id];
uint256 newTotalSupply =
_calculateDiscountedBalance(totalSupplyBalance.balance, today - totalSupplyBalance.lastUpdatedDay) + _value;
if (newTotalSupply > MAX_VALUE) {
Expand All @@ -220,14 +220,15 @@ contract Circles is ERC1155, ICirclesErrors {
}
totalSupplyBalance.balance = uint192(newTotalSupply);
totalSupplyBalance.lastUpdatedDay = today;
discountedTotalSupplies[_id] = totalSupplyBalance;
}

function _burnAndUpdateTotalSupply(address _account, uint256 _id, uint256 _value) internal {
// _update will discount the balance before subtracting the value
_burn(_account, _id, _value);

uint64 today = day(block.timestamp);
DiscountedBalance storage totalSupplyBalance = discountedTotalSupplies[_id];
DiscountedBalance memory totalSupplyBalance = discountedTotalSupplies[_id];
uint256 discountedTotalSupply =
_calculateDiscountedBalance(totalSupplyBalance.balance, today - totalSupplyBalance.lastUpdatedDay);
if (discountedTotalSupply < _value) {
Expand All @@ -242,6 +243,7 @@ contract Circles is ERC1155, ICirclesErrors {
totalSupplyBalance.balance = uint192(discountedTotalSupply - _value);
}
totalSupplyBalance.lastUpdatedDay = today;
discountedTotalSupplies[_id] = totalSupplyBalance;
}

// Private functions
Expand Down
6 changes: 4 additions & 2 deletions src/circles/DiscountedBalances.sol
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,10 @@ contract DiscountedBalances is Demurrage {
// DiscountedBalances: balance exceeds maximum value
revert CirclesDemurrageAmountExceedsMaxUint190(_account, _id, _balance, 0);
}
DiscountedBalance storage discountedBalance = discountedBalances[_id][_account];
DiscountedBalance memory discountedBalance = discountedBalances[_id][_account];
discountedBalance.balance = uint192(_balance);
discountedBalance.lastUpdatedDay = _day;
discountedBalances[_id][_account] = discountedBalance;
}

/**
Expand All @@ -108,7 +109,7 @@ contract DiscountedBalances is Demurrage {
* @param _day Day since inflation_day_zero to discount the balance to
*/
function _discountAndAddToBalance(address _account, uint256 _id, uint256 _value, uint64 _day) internal {
DiscountedBalance storage discountedBalance = discountedBalances[_id][_account];
DiscountedBalance memory discountedBalance = discountedBalances[_id][_account];
if (_day < discountedBalance.lastUpdatedDay) {
// DiscountedBalances: day is before last updated day
revert CirclesDemurrageDayBeforeLastUpdatedDay(_account, _id, _day, discountedBalance.lastUpdatedDay, 1);
Expand All @@ -132,5 +133,6 @@ contract DiscountedBalances is Demurrage {
}
discountedBalance.balance = uint192(updatedBalance);
discountedBalance.lastUpdatedDay = _day;
discountedBalances[_id][_account] = discountedBalance;
}
}
17 changes: 10 additions & 7 deletions src/hub/Hub.sol
Original file line number Diff line number Diff line change
Expand Up @@ -425,14 +425,15 @@ contract Hub is Circles, TypeDefinitions, IHubErrors {
// Only human can call stop.
revert CirclesHubMustBeHuman(msg.sender, 2);
}
MintTime storage mintTime = mintTimes[msg.sender];
uint96 lastMintTime = mintTimes[msg.sender].lastMintTime;
// check if already stopped
if (mintTime.lastMintTime == INDEFINITE_FUTURE) {
if (lastMintTime == INDEFINITE_FUTURE) {
return;
}
// stop future mints of personal Circles
// by setting the last mint time to indefinite future.
mintTime.lastMintTime = INDEFINITE_FUTURE;
lastMintTime = INDEFINITE_FUTURE;
mintTimes[msg.sender].lastMintTime = lastMintTime;

emit Stopped(msg.sender);
}
Expand All @@ -446,8 +447,8 @@ contract Hub is Circles, TypeDefinitions, IHubErrors {
// Only personal Circles can have a status of boolean stopped.
revert CirclesHubMustBeHuman(_human, 3);
}
MintTime storage mintTime = mintTimes[msg.sender];
return (mintTime.lastMintTime == INDEFINITE_FUTURE);
uint96 lastMintTime = mintTimes[msg.sender].lastMintTime;
return (lastMintTime == INDEFINITE_FUTURE);
}

/**
Expand Down Expand Up @@ -912,9 +913,10 @@ contract Hub is Circles, TypeDefinitions, IHubErrors {
// set the last mint time to the current timestamp for invited human
// and register the v1 Circles contract status
v1CirclesStatus = _avatarV1CirclesStatus(_human);
MintTime storage mintTime = mintTimes[_human];
MintTime memory mintTime = mintTimes[_human];
mintTime.mintV1Status = v1CirclesStatus;
mintTime.lastMintTime = uint96(block.timestamp);
mintTimes[_human] = mintTime;

// trust self indefinitely, cannot be altered later
_trust(_human, _human, INDEFINITE_FUTURE);
Expand Down Expand Up @@ -1032,7 +1034,7 @@ contract Hub is Circles, TypeDefinitions, IHubErrors {
* @param _mintV1Status Mint status of the v1 Circles contract.
*/
function _updateMintV1Status(address _human, address _mintV1Status) internal {
MintTime storage mintTime = mintTimes[_human];
MintTime memory mintTime = mintTimes[_human];
// precautionary check to ensure that the last mint time is already set
// as this marks whether an avatar is registered as human or not
if (mintTime.lastMintTime == 0) {
Expand All @@ -1044,6 +1046,7 @@ contract Hub is Circles, TypeDefinitions, IHubErrors {
if (mintTime.mintV1Status != _mintV1Status) {
mintTime.mintV1Status = _mintV1Status;
mintTime.lastMintTime = uint96(block.timestamp);
mintTimes[_human] = mintTime;
}
}

Expand Down
6 changes: 4 additions & 2 deletions src/lift/ERC20DiscountedBalances.sol
Original file line number Diff line number Diff line change
Expand Up @@ -107,13 +107,14 @@ contract ERC20DiscountedBalances is ERC20Permit, Demurrage, IERC20 {
// Balance exceeds maximum value.
revert CirclesDemurrageAmountExceedsMaxUint190(_account, toTokenId(avatar), _balance, 0);
}
DiscountedBalance storage discountedBalance = discountedBalances[_account];
DiscountedBalance memory discountedBalance = discountedBalances[_account];
discountedBalance.balance = uint192(_balance);
discountedBalance.lastUpdatedDay = _day;
discountedBalances[_account] = discountedBalance;
}

function _discountAndAddToBalance(address _account, uint256 _value, uint64 _day) internal {
DiscountedBalance storage discountedBalance = discountedBalances[_account];
DiscountedBalance memory discountedBalance = discountedBalances[_account];
if (_day < discountedBalance.lastUpdatedDay) {
// ERC20 DiscountedBalances: day is before last updated day
revert CirclesDemurrageDayBeforeLastUpdatedDay(
Expand All @@ -138,6 +139,7 @@ contract ERC20DiscountedBalances is ERC20Permit, Demurrage, IERC20 {
}
discountedBalance.balance = uint192(updatedBalance);
discountedBalance.lastUpdatedDay = _day;
discountedBalances[_account] = discountedBalance;
}

function _transfer(address _from, address _to, uint256 _amount) internal {
Expand Down

0 comments on commit df2d292

Please sign in to comment.