Skip to content

Commit 2b97b02

Browse files
authored
New API dynamic contracts (#495)
* update AccountPermissions extension, replace _canSet.. * update BatchMintMetadataStorage * update BurnToClaimStorage * update ContractMetadataStorage * update DelayedRevealStorage * update DropStorage * update ERC2771ContextStorage * update ERC2771ContextStorage * update InitStorage * update LazyMintStorage * update OperatorFilterToggleStorage * update OwnableStorage * update PermissionsStorage * update PermissionsEnumerableStorage * update PlatformFeeStorage * update PrimarySaleStorage * update ReentrancyGuardStorage * update RoyaltyStorage * update RulesEngineStorage * update SharedMetadataBatchStorage * clean up * prettier * remove tests temp * cleanup * comments
1 parent 989e175 commit 2b97b02

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+419
-1868
lines changed

contracts/extension/upgradeable/AccountPermissions.sol

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import "../../external-deps/openzeppelin/utils/cryptography/EIP712.sol";
88
import "../../external-deps/openzeppelin/utils/structs/EnumerableSet.sol";
99

1010
library AccountPermissionsStorage {
11-
bytes32 public constant ACCOUNT_PERMISSIONS_STORAGE_POSITION = keccak256("account.permissions.storage");
11+
/// @custom:storage-location erc7201:extension.manager.storage
12+
bytes32 public constant ACCOUNT_PERMISSIONS_STORAGE_POSITION =
13+
keccak256(abi.encode(uint256(keccak256("account.permissions.storage")) - 1));
1214

1315
struct Data {
1416
/// @dev The set of all admins of the wallet.
@@ -25,10 +27,10 @@ library AccountPermissionsStorage {
2527
mapping(bytes32 => bool) executed;
2628
}
2729

28-
function accountPermissionsStorage() internal pure returns (Data storage accountPermissionsData) {
30+
function data() internal pure returns (Data storage data_) {
2931
bytes32 position = ACCOUNT_PERMISSIONS_STORAGE_POSITION;
3032
assembly {
31-
accountPermissionsData.slot := position
33+
data_.slot := position
3234
}
3335
}
3436
}
@@ -69,27 +71,25 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
6971
(bool success, address signer) = verifySignerPermissionRequest(_req, _signature);
7072
require(success, "AccountPermissions: invalid signature");
7173

72-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
74+
_accountPermissionsStorage().allSigners.add(targetSigner);
75+
_accountPermissionsStorage().executed[_req.uid] = true;
7376

74-
data.allSigners.add(targetSigner);
75-
data.executed[_req.uid] = true;
76-
77-
data.signerPermissions[targetSigner] = SignerPermissionsStatic(
77+
_accountPermissionsStorage().signerPermissions[targetSigner] = SignerPermissionsStatic(
7878
_req.nativeTokenLimitPerTransaction,
7979
_req.permissionStartTimestamp,
8080
_req.permissionEndTimestamp
8181
);
8282

83-
address[] memory currentTargets = data.approvedTargets[targetSigner].values();
83+
address[] memory currentTargets = _accountPermissionsStorage().approvedTargets[targetSigner].values();
8484
uint256 currentLen = currentTargets.length;
8585

8686
for (uint256 i = 0; i < currentLen; i += 1) {
87-
data.approvedTargets[targetSigner].remove(currentTargets[i]);
87+
_accountPermissionsStorage().approvedTargets[targetSigner].remove(currentTargets[i]);
8888
}
8989

9090
uint256 len = _req.approvedTargets.length;
9191
for (uint256 i = 0; i < len; i += 1) {
92-
data.approvedTargets[targetSigner].add(_req.approvedTargets[i]);
92+
_accountPermissionsStorage().approvedTargets[targetSigner].add(_req.approvedTargets[i]);
9393
}
9494

9595
_afterSignerPermissionsUpdate(_req);
@@ -103,30 +103,27 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
103103

104104
/// @notice Returns whether the given account is an admin.
105105
function isAdmin(address _account) public view virtual returns (bool) {
106-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
107-
return data.isAdmin[_account];
106+
return _accountPermissionsStorage().isAdmin[_account];
108107
}
109108

110109
/// @notice Returns whether the given account is an active signer on the account.
111110
function isActiveSigner(address signer) public view returns (bool) {
112-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
113-
SignerPermissionsStatic memory permissions = data.signerPermissions[signer];
111+
SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
114112

115113
return
116114
permissions.startTimestamp <= block.timestamp &&
117115
block.timestamp < permissions.endTimestamp &&
118-
data.approvedTargets[signer].length() > 0;
116+
_accountPermissionsStorage().approvedTargets[signer].length() > 0;
119117
}
120118

121119
/// @notice Returns the restrictions under which a signer can use the smart wallet.
122120
function getPermissionsForSigner(address signer) external view returns (SignerPermissions memory) {
123-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
124-
SignerPermissionsStatic memory permissions = data.signerPermissions[signer];
121+
SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
125122

126123
return
127124
SignerPermissions(
128125
signer,
129-
data.approvedTargets[signer].values(),
126+
_accountPermissionsStorage().approvedTargets[signer].values(),
130127
permissions.nativeTokenLimitPerTransaction,
131128
permissions.startTimestamp,
132129
permissions.endTimestamp
@@ -140,25 +137,23 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
140137
virtual
141138
returns (bool success, address signer)
142139
{
143-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
144140
signer = _recoverAddress(req, signature);
145-
success = !data.executed[req.uid] && isAdmin(signer);
141+
success = !_accountPermissionsStorage().executed[req.uid] && isAdmin(signer);
146142
}
147143

148144
/// @notice Returns all active and inactive signers of the account.
149145
function getAllSigners() external view returns (SignerPermissions[] memory signers) {
150-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
151-
address[] memory allSigners = data.allSigners.values();
146+
address[] memory allSigners = _accountPermissionsStorage().allSigners.values();
152147

153148
uint256 len = allSigners.length;
154149
signers = new SignerPermissions[](len);
155150
for (uint256 i = 0; i < len; i += 1) {
156151
address signer = allSigners[i];
157-
SignerPermissionsStatic memory permissions = data.signerPermissions[signer];
152+
SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
158153

159154
signers[i] = SignerPermissions(
160155
signer,
161-
data.approvedTargets[signer].values(),
156+
_accountPermissionsStorage().approvedTargets[signer].values(),
162157
permissions.nativeTokenLimitPerTransaction,
163158
permissions.startTimestamp,
164159
permissions.endTimestamp
@@ -168,8 +163,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
168163

169164
/// @notice Returns all signers with active permissions to use the account.
170165
function getAllActiveSigners() external view returns (SignerPermissions[] memory signers) {
171-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
172-
address[] memory allSigners = data.allSigners.values();
166+
address[] memory allSigners = _accountPermissionsStorage().allSigners.values();
173167

174168
uint256 len = allSigners.length;
175169
uint256 numOfActiveSigners = 0;
@@ -192,11 +186,11 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
192186
continue;
193187
}
194188
address signer = allSigners[i];
195-
SignerPermissionsStatic memory permissions = data.signerPermissions[signer];
189+
SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
196190

197191
signers[index++] = SignerPermissions(
198192
signer,
199-
data.approvedTargets[signer].values(),
193+
_accountPermissionsStorage().approvedTargets[signer].values(),
200194
permissions.nativeTokenLimitPerTransaction,
201195
permissions.startTimestamp,
202196
permissions.endTimestamp
@@ -206,8 +200,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
206200

207201
/// @notice Returns all admins of the account.
208202
function getAllAdmins() external view returns (address[] memory) {
209-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
210-
return data.allAdmins.values();
203+
return _accountPermissionsStorage().allAdmins.values();
211204
}
212205

213206
/*///////////////////////////////////////////////////////////////
@@ -219,13 +212,12 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
219212

220213
/// @notice Makes the given account an admin.
221214
function _setAdmin(address _account, bool _isAdmin) internal virtual {
222-
AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage();
223-
data.isAdmin[_account] = _isAdmin;
215+
_accountPermissionsStorage().isAdmin[_account] = _isAdmin;
224216

225217
if (_isAdmin) {
226-
data.allAdmins.add(_account);
218+
_accountPermissionsStorage().allAdmins.add(_account);
227219
} else {
228-
data.allAdmins.remove(_account);
220+
_accountPermissionsStorage().allAdmins.remove(_account);
229221
}
230222

231223
emit AdminUpdated(_account, _isAdmin);
@@ -256,4 +248,9 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
256248
_req.uid
257249
);
258250
}
251+
252+
/// @dev Returns the AccountPermissions storage.
253+
function _accountPermissionsStorage() internal pure returns (AccountPermissionsStorage.Data storage data) {
254+
data = AccountPermissionsStorage.data();
255+
}
259256
}

contracts/extension/upgradeable/BatchMintMetadata.sol

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
pragma solidity ^0.8.0;
33

44
library BatchMintMetadataStorage {
5-
bytes32 public constant BATCH_MINT_METADATA_STORAGE_POSITION = keccak256("batch.mint.metadata.storage");
5+
/// @custom:storage-location erc7201:extension.manager.storage
6+
bytes32 public constant BATCH_MINT_METADATA_STORAGE_POSITION =
7+
keccak256(abi.encode(uint256(keccak256("batch.mint.metadata.storage")) - 1));
68

79
struct Data {
810
/// @dev Largest tokenId of each batch of tokens with the same baseURI.
@@ -11,10 +13,10 @@ library BatchMintMetadataStorage {
1113
mapping(uint256 => string) baseURI;
1214
}
1315

14-
function batchMintMetadataStorage() internal pure returns (Data storage batchMintMetadataData) {
16+
function data() internal pure returns (Data storage data_) {
1517
bytes32 position = BATCH_MINT_METADATA_STORAGE_POSITION;
1618
assembly {
17-
batchMintMetadataData.slot := position
19+
data_.slot := position
1820
}
1921
}
2022
}
@@ -33,8 +35,7 @@ contract BatchMintMetadata {
3335
* See {batchIds}.
3436
*/
3537
function getBaseURICount() public view returns (uint256) {
36-
BatchMintMetadataStorage.Data storage data = BatchMintMetadataStorage.batchMintMetadataStorage();
37-
return data.batchIds.length;
38+
return _batchMintMetadataStorage().batchIds.length;
3839
}
3940

4041
/**
@@ -43,20 +44,16 @@ contract BatchMintMetadata {
4344
* @param _index ID of a token.
4445
*/
4546
function getBatchIdAtIndex(uint256 _index) public view returns (uint256) {
46-
BatchMintMetadataStorage.Data storage data = BatchMintMetadataStorage.batchMintMetadataStorage();
47-
4847
if (_index >= getBaseURICount()) {
4948
revert("Invalid index");
5049
}
51-
return data.batchIds[_index];
50+
return _batchMintMetadataStorage().batchIds[_index];
5251
}
5352

5453
/// @dev Returns the id for the batch of tokens the given tokenId belongs to.
5554
function _getBatchId(uint256 _tokenId) internal view returns (uint256 batchId, uint256 index) {
56-
BatchMintMetadataStorage.Data storage data = BatchMintMetadataStorage.batchMintMetadataStorage();
57-
5855
uint256 numOfTokenBatches = getBaseURICount();
59-
uint256[] memory indices = data.batchIds;
56+
uint256[] memory indices = _batchMintMetadataStorage().batchIds;
6057

6158
for (uint256 i = 0; i < numOfTokenBatches; i += 1) {
6259
if (_tokenId < indices[i]) {
@@ -72,23 +69,20 @@ contract BatchMintMetadata {
7269

7370
/// @dev Returns the baseURI for a token. The intended metadata URI for the token is baseURI + tokenId.
7471
function _getBaseURI(uint256 _tokenId) internal view returns (string memory) {
75-
BatchMintMetadataStorage.Data storage data = BatchMintMetadataStorage.batchMintMetadataStorage();
76-
7772
uint256 numOfTokenBatches = getBaseURICount();
78-
uint256[] memory indices = data.batchIds;
73+
uint256[] memory indices = _batchMintMetadataStorage().batchIds;
7974

8075
for (uint256 i = 0; i < numOfTokenBatches; i += 1) {
8176
if (_tokenId < indices[i]) {
82-
return data.baseURI[indices[i]];
77+
return _batchMintMetadataStorage().baseURI[indices[i]];
8378
}
8479
}
8580
revert("Invalid tokenId");
8681
}
8782

8883
/// @dev Sets the base URI for the batch of tokens with the given batchId.
8984
function _setBaseURI(uint256 _batchId, string memory _baseURI) internal {
90-
BatchMintMetadataStorage.Data storage data = BatchMintMetadataStorage.batchMintMetadataStorage();
91-
data.baseURI[_batchId] = _baseURI;
85+
_batchMintMetadataStorage().baseURI[_batchId] = _baseURI;
9286
}
9387

9488
/// @dev Mints a batch of tokenIds and associates a common baseURI to all those Ids.
@@ -100,9 +94,12 @@ contract BatchMintMetadata {
10094
batchId = _startId + _amountToMint;
10195
nextTokenIdToMint = batchId;
10296

103-
BatchMintMetadataStorage.Data storage data = BatchMintMetadataStorage.batchMintMetadataStorage();
97+
_batchMintMetadataStorage().batchIds.push(batchId);
98+
_batchMintMetadataStorage().baseURI[batchId] = _baseURIForTokens;
99+
}
104100

105-
data.batchIds.push(batchId);
106-
data.baseURI[batchId] = _baseURIForTokens;
101+
/// @dev Returns the BatchMintMetadata storage.
102+
function _batchMintMetadataStorage() internal pure returns (BatchMintMetadataStorage.Data storage data) {
103+
data = BatchMintMetadataStorage.data();
107104
}
108105
}

contracts/extension/upgradeable/BurnToClaim.sol

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,31 @@ import "../../eip/interface/IERC721.sol";
1212
import "../interface/IBurnToClaim.sol";
1313

1414
library BurnToClaimStorage {
15-
bytes32 public constant BURN_TO_CLAIM_STORAGE_POSITION = keccak256("burn.to.claim.storage");
15+
/// @custom:storage-location erc7201:extension.manager.storage
16+
bytes32 public constant BURN_TO_CLAIM_STORAGE_POSITION =
17+
keccak256(abi.encode(uint256(keccak256("burn.to.claim.storage")) - 1));
1618

1719
struct Data {
1820
IBurnToClaim.BurnToClaimInfo burnToClaimInfo;
1921
}
2022

21-
function burnToClaimStorage() internal pure returns (Data storage burnToClaimData) {
23+
function data() internal pure returns (Data storage data_) {
2224
bytes32 position = BURN_TO_CLAIM_STORAGE_POSITION;
2325
assembly {
24-
burnToClaimData.slot := position
26+
data_.slot := position
2527
}
2628
}
2729
}
2830

2931
abstract contract BurnToClaim is IBurnToClaim {
3032
function getBurnToClaimInfo() public view returns (BurnToClaimInfo memory) {
31-
BurnToClaimStorage.Data storage data = BurnToClaimStorage.burnToClaimStorage();
32-
33-
return data.burnToClaimInfo;
33+
return _burnToClaimStorage().burnToClaimInfo;
3434
}
3535

3636
function setBurnToClaimInfo(BurnToClaimInfo calldata _burnToClaimInfo) external virtual {
3737
require(_canSetBurnToClaim(), "Not authorized.");
3838

39-
BurnToClaimStorage.Data storage data = BurnToClaimStorage.burnToClaimStorage();
40-
data.burnToClaimInfo = _burnToClaimInfo;
39+
_burnToClaimStorage().burnToClaimInfo = _burnToClaimInfo;
4140
}
4241

4342
function verifyBurnToClaim(
@@ -76,5 +75,10 @@ abstract contract BurnToClaim is IBurnToClaim {
7675
}
7776
}
7877

78+
/// @dev Returns the BurnToClaimStorage storage.
79+
function _burnToClaimStorage() internal pure returns (BurnToClaimStorage.Data storage data) {
80+
data = BurnToClaimStorage.data();
81+
}
82+
7983
function _canSetBurnToClaim() internal view virtual returns (bool);
8084
}

contracts/extension/upgradeable/ContractMetadata.sol

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,19 @@ import "../interface/IContractMetadata.sol";
1515
*/
1616

1717
library ContractMetadataStorage {
18-
bytes32 public constant CONTRACT_METADATA_STORAGE_POSITION = keccak256("contract.metadata.storage");
18+
/// @custom:storage-location erc7201:extension.manager.storage
19+
bytes32 public constant CONTRACT_METADATA_STORAGE_POSITION =
20+
keccak256(abi.encode(uint256(keccak256("contract.metadata.storage")) - 1));
1921

2022
struct Data {
2123
/// @notice Returns the contract metadata URI.
2224
string contractURI;
2325
}
2426

25-
function contractMetadataStorage() internal pure returns (Data storage contractMetadataData) {
27+
function data() internal pure returns (Data storage data_) {
2628
bytes32 position = CONTRACT_METADATA_STORAGE_POSITION;
2729
assembly {
28-
contractMetadataData.slot := position
30+
data_.slot := position
2931
}
3032
}
3133
}
@@ -49,17 +51,20 @@ abstract contract ContractMetadata is IContractMetadata {
4951

5052
/// @dev Lets a contract admin set the URI for contract-level metadata.
5153
function _setupContractURI(string memory _uri) internal {
52-
ContractMetadataStorage.Data storage data = ContractMetadataStorage.contractMetadataStorage();
53-
string memory prevURI = data.contractURI;
54-
data.contractURI = _uri;
54+
string memory prevURI = _contractMetadataStorage().contractURI;
55+
_contractMetadataStorage().contractURI = _uri;
5556

5657
emit ContractURIUpdated(prevURI, _uri);
5758
}
5859

5960
/// @notice Returns the contract metadata URI.
6061
function contractURI() public view virtual override returns (string memory) {
61-
ContractMetadataStorage.Data storage data = ContractMetadataStorage.contractMetadataStorage();
62-
return data.contractURI;
62+
return _contractMetadataStorage().contractURI;
63+
}
64+
65+
/// @dev Returns the AccountPermissions storage.
66+
function _contractMetadataStorage() internal pure returns (ContractMetadataStorage.Data storage data) {
67+
data = ContractMetadataStorage.data();
6368
}
6469

6570
/// @dev Returns whether contract metadata can be set in the given execution context.

0 commit comments

Comments
 (0)