mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-10-24 20:55:06 +00:00
Support solc v0.8.35 (#512)
- Support solc v0.8.35 - The new `erc7201` is comptime (already translated to a constant in Yul) Didn't spot any relevant breakage or addition in the release notes so should be no-brainer. --------- Signed-off-by: Cyrill Leutwiler <bigcyrill@hotmail.com>
This commit is contained in:
1 parent
1308b446f1
commit
ee869cdd18
11 files changed
+68
-9
No files matched your search
@@ -0,0 +1,55 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.35;
|
||||
|
||||
/* runner.json
|
||||
{
|
||||
"differential": true,
|
||||
"actions": [
|
||||
{
|
||||
"Instantiate": {
|
||||
"code": {
|
||||
"Solidity": {
|
||||
"contract": "ERC7201"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
*/
|
||||
|
||||
/// Tests the `erc7201` builtin introduced in solc 0.8.35.
|
||||
/// Reference: https://eips.ethereum.org/EIPS/eip-7201
|
||||
contract ERC7201 {
|
||||
/// Reference implementation of the ERC-7201 base slot formula in pure
|
||||
/// Solidity. Used to cross-check the builtin output.
|
||||
function referenceSlot(string memory id) internal pure returns (uint256) {
|
||||
return uint256(
|
||||
keccak256(bytes.concat(bytes32(uint256(keccak256(bytes(id))) - 1)))
|
||||
& ~bytes32(uint256(0xff))
|
||||
);
|
||||
}
|
||||
|
||||
constructor() payable {
|
||||
// Compile-time path: literal argument, solc folds the result into a
|
||||
// numeric constant in the emitted Yul.
|
||||
assert(erc7201("example.main") == referenceSlot("example.main"));
|
||||
assert(
|
||||
erc7201("erc7201:openzeppelin.storage.Initializable")
|
||||
== referenceSlot("erc7201:openzeppelin.storage.Initializable")
|
||||
);
|
||||
assert(erc7201("") == referenceSlot(""));
|
||||
|
||||
// Runtime path: non-literal argument, solc emits a Yul utility
|
||||
// function that performs the keccak256 hashes at runtime.
|
||||
string memory id = "example.main";
|
||||
assert(erc7201(id) == referenceSlot(id));
|
||||
|
||||
string memory empty = "";
|
||||
assert(erc7201(empty) == referenceSlot(empty));
|
||||
|
||||
// The two paths must agree.
|
||||
assert(erc7201("example.main") == erc7201(id));
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user