Skip to content

Commit

Permalink
simplify getTransferValidationFunction(), add test
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanio committed Apr 1, 2024
1 parent 6fd1a08 commit da36ee1
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 36 deletions.
10 changes: 3 additions & 7 deletions src/clones/ERC1155ContractMetadataCloneable.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
ILegacyCreatorToken
} from "../interfaces/ICreatorToken.sol";

import { ITransferValidator } from "../interfaces/ITransferValidator.sol";
import { ITransferValidator1155 } from "../interfaces/ITransferValidator.sol";

import { TokenTransferValidator } from "../lib/TokenTransferValidator.sol";

Expand Down Expand Up @@ -324,11 +324,7 @@ contract ERC1155ContractMetadataCloneable is
pure
returns (bytes4 functionSignature, bool isViewFunction)
{
functionSignature = bytes4(
keccak256(
"validateTransfer(address,address,address,uint256,uint256)"
)
);
functionSignature = ITransferValidator1155.validateTransfer.selector;
isViewFunction = true;
}

Expand Down Expand Up @@ -360,7 +356,7 @@ contract ERC1155ContractMetadataCloneable is
// Call the transfer validator if one is set.
if (_transferValidator != address(0)) {
for (uint256 i = 0; i < ids.length; i++) {
ITransferValidator(_transferValidator).validateTransfer(
ITransferValidator1155(_transferValidator).validateTransfer(
msg.sender,
from,
to,
Expand Down
9 changes: 5 additions & 4 deletions src/interfaces/ITransferValidator.sol
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface ITransferValidator {
/// @notice Ensure that a transfer has been authorized for a specific tokenId.
interface ITransferValidator721 {
/// @notice Ensure that a transfer has been authorized for a specific tokenId
function validateTransfer(
address caller,
address from,
address to,
uint256 tokenId
) external view;
}

/// @notice Ensure that a transfer has been authorized for a specific amount of
/// a specific tokenId, and reduce the transferable amount remaining.
interface ITransferValidator1155 {
/// @notice Ensure that a transfer has been authorized for a specific amount of a specific tokenId, and reduce the transferable amount remaining
function validateTransfer(
address caller,
address from,
Expand Down
10 changes: 3 additions & 7 deletions src/lib/ERC1155ContractMetadata.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
ILegacyCreatorToken
} from "../interfaces/ICreatorToken.sol";

import { ITransferValidator } from "../interfaces/ITransferValidator.sol";
import { ITransferValidator1155 } from "../interfaces/ITransferValidator.sol";

import { TokenTransferValidator } from "./TokenTransferValidator.sol";

Expand Down Expand Up @@ -322,11 +322,7 @@ contract ERC1155ContractMetadata is
pure
returns (bytes4 functionSignature, bool isViewFunction)
{
functionSignature = bytes4(
keccak256(
"validateTransfer(address,address,address,uint256,uint256)"
)
);
functionSignature = ITransferValidator1155.validateTransfer.selector;
isViewFunction = true;
}

Expand Down Expand Up @@ -358,7 +354,7 @@ contract ERC1155ContractMetadata is
// Call the transfer validator if one is set.
if (_transferValidator != address(0)) {
for (uint256 i = 0; i < ids.length; i++) {
ITransferValidator(_transferValidator).validateTransfer(
ITransferValidator1155(_transferValidator).validateTransfer(
msg.sender,
from,
to,
Expand Down
8 changes: 3 additions & 5 deletions src/lib/ERC721ContractMetadata.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
ILegacyCreatorToken
} from "../interfaces/ICreatorToken.sol";

import { ITransferValidator } from "../interfaces/ITransferValidator.sol";
import { ITransferValidator721 } from "../interfaces/ITransferValidator.sol";

import { TokenTransferValidator } from "./TokenTransferValidator.sol";

Expand Down Expand Up @@ -290,9 +290,7 @@ contract ERC721ContractMetadata is
pure
returns (bytes4 functionSignature, bool isViewFunction)
{
functionSignature = bytes4(
keccak256("validateTransfer(address,address,address,uint256)")
);
functionSignature = ITransferValidator721.validateTransfer.selector;
isViewFunction = false;
}

Expand All @@ -317,7 +315,7 @@ contract ERC721ContractMetadata is
if (from != address(0) && to != address(0)) {
// Call the transfer validator if one is set.
if (_transferValidator != address(0)) {
ITransferValidator(_transferValidator).validateTransfer(
ITransferValidator721(_transferValidator).validateTransfer(
msg.sender,
from,
to,
Expand Down
18 changes: 12 additions & 6 deletions src/test/MockTransferValidator.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.17;

import { ITransferValidator } from "../interfaces/ITransferValidator.sol";
import {
ITransferValidator721,
ITransferValidator1155
} from "../interfaces/ITransferValidator.sol";

contract MockTransferValidator is ITransferValidator {
contract MockTransferValidator is
ITransferValidator721,
ITransferValidator1155
{
bool internal _revertOnValidate;

constructor(bool revertOnValidate) {
Expand All @@ -25,10 +31,10 @@ contract MockTransferValidator is ITransferValidator {
}

function validateTransfer(
address, /* caller */
address, /* from */
address, /* to */
uint256, /* tokenId */
address /* caller */,
address /* from */,
address /* to */,
uint256 /* tokenId */,
uint256 /* amount */
) external view {
if (_revertOnValidate) {
Expand Down
45 changes: 38 additions & 7 deletions test/foundry/TokenTransferValidator.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ import { ERC721SeaDrop } from "seadrop/ERC721SeaDrop.sol";

import { ERC1155SeaDrop } from "seadrop/ERC1155SeaDrop.sol";

import {
ITransferValidator721,
ITransferValidator1155
} from "seadrop/interfaces/ITransferValidator.sol";

import { MockTransferValidator } from "seadrop/test/MockTransferValidator.sol";

import { Ownable } from "solady/src/auth/Ownable.sol";
Expand All @@ -32,11 +37,7 @@ contract ERC1155SeaDropWithMint is ERC1155SeaDrop {
string memory symbol_
) ERC1155SeaDrop(allowedConfigurer, allowedSeaport, name_, symbol_) {}

function mint(
address to,
uint256 id,
uint256 amount
) public onlyOwner {
function mint(address to, uint256 id, uint256 amount) public onlyOwner {
_mint(to, id, amount, "");
}
}
Expand All @@ -55,10 +56,20 @@ contract TokenTransferValidatorTest is SeaDrop721Test {
function setUp() public override {
super.setUp();

token721 = new ERC721SeaDropWithMint(address(0), allowedSeaport, "", "");
token721 = new ERC721SeaDropWithMint(
address(0),
allowedSeaport,
"",
""
);
token721.setMaxSupply(10);

token1155 = new ERC1155SeaDropWithMint(address(0), allowedSeaport, "", "");
token1155 = new ERC1155SeaDropWithMint(
address(0),
allowedSeaport,
"",
""
);
token1155.setMaxSupply(1, 10);
token1155.setMaxSupply(2, 10);
}
Expand Down Expand Up @@ -185,4 +196,24 @@ contract TokenTransferValidatorTest is SeaDrop721Test {
""
);
}

function testERC721GetTransferValidationFunction() public {
(bytes4 functionSignature, bool isViewFunction) = token721
.getTransferValidationFunction();
assertEq(
functionSignature,
ITransferValidator721.validateTransfer.selector
);
assertEq(isViewFunction, false);
}

function testERC1155GetTransferValidationFunction() public {
(bytes4 functionSignature, bool isViewFunction) = token1155
.getTransferValidationFunction();
assertEq(
functionSignature,
ITransferValidator1155.validateTransfer.selector
);
assertEq(isViewFunction, true);
}
}

0 comments on commit da36ee1

Please sign in to comment.