Skip to content

Commit 0369483

Browse files
authored
♻️ SkipNFTDefault (#148)
1 parent a53bc78 commit 0369483

File tree

2 files changed

+58
-10
lines changed

2 files changed

+58
-10
lines changed

src/DN404.sol

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,21 @@ pragma solidity ^0.8.4;
3333
/// - The ERC20 token allowances and ERC721 token / operator approvals are separate.
3434
/// - For MEV safety, users should NOT have concurrently open orders for the ERC20 and ERC721.
3535
abstract contract DN404 {
36+
/*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
37+
/* ENUMS */
38+
/*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/
39+
40+
/// @dev Denotes the default skip NFT status.
41+
/// Override `_skipNFTDefault` to return a preferred value (defaults to `HasCode`).
42+
enum SkipNFTDefault {
43+
// `On` if the ERC20 owner has code, else `Off`.
44+
HasCode,
45+
// Skip NFT (ERC20 transfers will NOT trigger NFT minting / burning / transferring).
46+
On,
47+
// NOT skip NFT (ERC20 transfers will trigger NFT minting / burning / transferring).
48+
Off
49+
}
50+
3651
/*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
3752
/* EVENTS */
3853
/*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/
@@ -309,6 +324,11 @@ abstract contract DN404 {
309324
/* CONFIGURABLES */
310325
/*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/
311326

327+
/// @dev Returns the default mode for the skip NFT status.
328+
function _skipNFTDefault() internal view virtual returns (SkipNFTDefault) {
329+
return SkipNFTDefault.HasCode;
330+
}
331+
312332
/// @dev Returns whether the tokens IDs are from `[1..n]` instead of `[0..n-1]`.
313333
function _useOneIndexed() internal pure virtual returns (bool) {
314334
return true;
@@ -1033,12 +1053,16 @@ abstract contract DN404 {
10331053
/// Returns false otherwise.
10341054
function getSkipNFT(address owner) public view virtual returns (bool result) {
10351055
uint8 flags = _getDN404Storage().addressData[owner].flags;
1036-
/// @solidity memory-safe-assembly
1037-
assembly {
1038-
result := iszero(iszero(and(flags, _ADDRESS_DATA_SKIP_NFT_FLAG)))
1039-
if iszero(and(flags, _ADDRESS_DATA_SKIP_NFT_INITIALIZED_FLAG)) {
1040-
result := iszero(iszero(extcodesize(owner)))
1056+
result = flags & _ADDRESS_DATA_SKIP_NFT_FLAG != 0;
1057+
if (flags & _ADDRESS_DATA_SKIP_NFT_INITIALIZED_FLAG == uint256(0)) {
1058+
if (_skipNFTDefault() == SkipNFTDefault.HasCode) {
1059+
/// @solidity memory-safe-assembly
1060+
assembly {
1061+
result := iszero(iszero(extcodesize(owner)))
1062+
}
10411063
}
1064+
if (_skipNFTDefault() == SkipNFTDefault.On) result = true;
1065+
if (_skipNFTDefault() == SkipNFTDefault.Off) result = false;
10421066
}
10431067
}
10441068

src/DN420.sol

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,21 @@ pragma solidity ^0.8.4;
4242
/// - The ERC20 token allowances and ERC1155 token / operator approvals are separate.
4343
/// - For MEV safety, users should NOT have concurrently open orders for the ERC20 and ERC1155.
4444
abstract contract DN420 {
45+
/*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
46+
/* ENUMS */
47+
/*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/
48+
49+
/// @dev Denotes the default skip NFT status.
50+
/// Override `_skipNFTDefault` to return a preferred value (defaults to `HasCode`).
51+
enum SkipNFTDefault {
52+
// `On` if the ERC20 owner has code, else `Off`.
53+
HasCode,
54+
// Skip NFT (ERC20 transfers will NOT trigger NFT minting / burning / transferring).
55+
On,
56+
// NOT skip NFT (ERC20 transfers will trigger NFT minting / burning / transferring).
57+
Off
58+
}
59+
4560
/*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
4661
/* EVENTS */
4762
/*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/
@@ -321,6 +336,11 @@ abstract contract DN420 {
321336
/* CONFIGURABLES */
322337
/*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/
323338

339+
/// @dev Returns the default mode for the skip NFT status.
340+
function _skipNFTDefault() internal view virtual returns (SkipNFTDefault) {
341+
return SkipNFTDefault.HasCode;
342+
}
343+
324344
/// @dev Returns if direct NFT transfers should be used during ERC20 transfers
325345
/// whenever possible, instead of burning and re-minting.
326346
function _useDirectTransfersIfPossible() internal view virtual returns (bool) {
@@ -986,12 +1006,16 @@ abstract contract DN420 {
9861006
/// Returns false otherwise.
9871007
function getSkipNFT(address owner) public view virtual returns (bool result) {
9881008
uint8 flags = _getDN420Storage().addressData[owner].flags;
989-
/// @solidity memory-safe-assembly
990-
assembly {
991-
result := iszero(iszero(and(flags, _ADDRESS_DATA_SKIP_NFT_FLAG)))
992-
if iszero(and(flags, _ADDRESS_DATA_SKIP_NFT_INITIALIZED_FLAG)) {
993-
result := iszero(iszero(extcodesize(owner)))
1009+
result = flags & _ADDRESS_DATA_SKIP_NFT_FLAG != 0;
1010+
if (flags & _ADDRESS_DATA_SKIP_NFT_INITIALIZED_FLAG == uint256(0)) {
1011+
if (_skipNFTDefault() == SkipNFTDefault.HasCode) {
1012+
/// @solidity memory-safe-assembly
1013+
assembly {
1014+
result := iszero(iszero(extcodesize(owner)))
1015+
}
9941016
}
1017+
if (_skipNFTDefault() == SkipNFTDefault.On) result = true;
1018+
if (_skipNFTDefault() == SkipNFTDefault.Off) result = false;
9951019
}
9961020
}
9971021

0 commit comments

Comments
 (0)