Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ERC4907 #370
ERC4907 #370
Changes from 16 commits
8c9501a
b8d6890
159236f
3cd2864
112337c
78fc9b5
196b95f
bd082f9
97f22bc
13921ab
62c44bd
fb922e9
1f626a7
57c73ff
a5839ad
2b99f3a
e6d4512
7bd79c4
71b3379
bdcc569
cd48fd0
2715385
858ebdb
4498a4c
fef2e25
1e035d0
File filter
Filter by extension
Conversations
Jump to
There are no files selected for viewing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Explanation
First, we know that:
packed = (expires << 160) | user
The straightforward way of implementing
block.timestamp <= expires
is:!(block.timestamp > (packed >> 160))
which in Yul, is:iszero(gt(timestamp(), shr(160, packed)))
Now, notice that if
user != address(0)
:(block.timestamp << 160) < ((expires << 160) | user)
is true forblock.timestamp <= expires
.And when
user == address(0)
:address(uint160((expires << 160) | user))
evaluates toaddress(0)
anyway.So that's how we avoid the extra
iszero
opcode.Having an optimized
userOf
function is important for on-chain verification by third party contracts.