Skip to content

Commit

Permalink
Add link handshake
Browse files Browse the repository at this point in the history
  • Loading branch information
Vectorized committed Feb 10, 2024
1 parent b7a8d13 commit 14a5885
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 7 deletions.
14 changes: 7 additions & 7 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
DN404Test:testBurnOnTransfer(uint32,address,address) (runs: 256, μ: 256757, ~: 258856)
DN404Test:testInitialize(uint32,address) (runs: 256, μ: 95878, ~: 108419)
DN404Test:testMintOnTransfer(uint32,address,address) (runs: 256, μ: 212464, ~: 214252)
DN404Test:testNameAndSymbol(string,string) (runs: 256, μ: 205842, ~: 206183)
DN404Test:testRegisterAndResolveAlias(address,address) (runs: 256, μ: 120443, ~: 120599)
DN404Test:testTokenURI(string,uint256) (runs: 256, μ: 161329, ~: 145950)
DN404Test:test__codesize() (gas: 17782)
DN404Test:testBurnOnTransfer(uint32,address,address) (runs: 256, μ: 257424, ~: 259368)
DN404Test:testInitialize(uint32,address) (runs: 256, μ: 95560, ~: 108931)
DN404Test:testMintOnTransfer(uint32,address,address) (runs: 256, μ: 213053, ~: 214764)
DN404Test:testNameAndSymbol(string,string) (runs: 256, μ: 206354, ~: 206695)
DN404Test:testRegisterAndResolveAlias(address,address) (runs: 256, μ: 120599, ~: 120599)
DN404Test:testTokenURI(string,uint256) (runs: 256, μ: 161878, ~: 146462)
DN404Test:test__codesize() (gas: 17853)
SoladyTest:test__codesize() (gas: 1075)
TestPlus:test__codesize() (gas: 398)
4 changes: 4 additions & 0 deletions src/DN404.sol
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,10 @@ abstract contract DN404 {

_return(uint160(_approveNFT(spender, id, msgSender)));
}
// `implementsDN404()`.
if (fnSelector == 0xb7a94eb8) {
_return(1);
}
_;
}

Expand Down
17 changes: 17 additions & 0 deletions src/DN404NonFungibleShadow.sol
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ contract DN404NonFungibleShadow {

error TokenDoesNotExist();

error CannotLink();

error AlreadyLinked();

error NotLinked();
Expand Down Expand Up @@ -321,6 +323,20 @@ contract DN404NonFungibleShadow {
}
if ($.sisterERC20 != address(0)) revert AlreadyLinked();
$.sisterERC20 = msg.sender;
/// @solidity memory-safe-assembly
assembly {
// `implementsDN404()`.
mstore(0x00, 0xb7a94eb8)
if iszero(
and(
and(eq(mload(0x00), 1), gt(returndatasize(), 0x1f)),
staticcall(gas(), caller(), 0x1c, 0x04, 0x00, 0x20)
)
) {
mstore(0x00, 0x8f36fa09) // `CannotLink()`.
revert(0x1c, 0x04)
}
}
_return(1);
}

Expand All @@ -343,6 +359,7 @@ contract DN404NonFungibleShadow {
receive() external payable virtual {}

function _getDN404NFTStorage() internal pure returns (DN404NFTStorage storage $) {
/// @solidity memory-safe-assembly
assembly {
// keccak256(abi.encode(uint256(keccak256("dn404.nft")) - 1)) & ~bytes32(uint256(0xff))
$.slot := 0xe8cb618a1de8ad2a6a7b358523c369cb09f40cc15da64205134c7e55c6a86700
Expand Down

0 comments on commit 14a5885

Please sign in to comment.