Skip to content

Commit

Permalink
Added premitn version fetcher
Browse files Browse the repository at this point in the history
This reverts commit d57f2990d9046c7e9f7d29ec2105902b3bb59830.
  • Loading branch information
oveddan committed Oct 30, 2023
1 parent 987a31f commit 581167d
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/thirty-dragons-pretend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@zoralabs/zora-1155-contracts": patch
---

Added method `IZoraCreator1155PremintExecutor.supportedPremintSignatureVersion(contractAddress)` that tells what version of the premint signature the contract supports, and added corresponding method `ZoraCreator1155Impl.supportedPremintSignatureVersion()` to fetch supported version. If premint not supported, returns 0.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {ERC1155DelegationStorageV1} from "../delegation/ERC1155DelegationStorage
import {ZoraCreator1155PremintExecutorImplLib} from "./ZoraCreator1155PremintExecutorImplLib.sol";
import {PremintEncoding, ZoraCreator1155Attribution, ContractCreationConfig, PremintConfig, PremintConfigV2, TokenCreationConfig, TokenCreationConfigV2} from "./ZoraCreator1155Attribution.sol";
import {IZoraCreator1155PremintExecutor} from "../interfaces/IZoraCreator1155PremintExecutor.sol";
import {IZoraCreator1155DelegatedCreation} from "../interfaces/IZoraCreator1155DelegatedCreation.sol";

struct MintArguments {
// which account should receive the tokens minted. If set to address(0), then defaults to the msg.sender
Expand Down Expand Up @@ -213,6 +214,24 @@ contract ZoraCreator1155PremintExecutorImpl is
);
}

/// @notice Returns the version of the premint signature that the contract supports
/// @param contractAddress The address of the contract to check
/// @return The version of the premint signature that the contract supports. If it doesn't support premint
/// returns 0
function supportedPremintSignatureVersion(address contractAddress) external view returns (string memory) {
IZoraCreator1155 creatorContract = IZoraCreator1155(contractAddress);
if (creatorContract.supportsInterface(type(IZoraCreator1155DelegatedCreation).interfaceId)) {
return IZoraCreator1155DelegatedCreation(contractAddress).supportedPremintSignatureVersion();
}

// try get token id for uid 0 - if call fails, we know this didn't support premint
try ERC1155DelegationStorageV1(contractAddress).delegatedTokenId(uint32(0)) returns (uint256) {
return "1";
} catch {
return "0";
}
}

// upgrade related functionality

/// @notice The name of the contract for upgrade purposes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ pragma solidity 0.8.17;
interface IZoraCreator1155DelegatedCreation {
event CreatorAttribution(bytes32 structHash, string domainName, string version, address creator, bytes signature);

function supportedPremintSignatureVersion() external pure returns (string memory);

function delegateSetupNewToken(
bytes memory premintConfigEncoded,
bytes32 premintVersion,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,6 @@ interface IZoraCreator1155PremintExecutor is
function zora1155Factory() external view returns (IZoraCreator1155Factory);

function getContractAddress(ContractCreationConfig calldata contractConfig) external view returns (address);

function supportedPremintSignatureVersion(address contractAddress) external view returns (string memory);
}
4 changes: 4 additions & 0 deletions packages/1155-contracts/src/nft/ZoraCreator1155Impl.sol
Original file line number Diff line number Diff line change
Expand Up @@ -752,6 +752,10 @@ contract ZoraCreator1155Impl is
return _getImplementation();
}

function supportedPremintSignatureVersion() external pure returns (string memory) {
return ZoraCreator1155Attribution.VERSION_2;
}

/// Sets up a new token using a token configuration and a signature created for the token creation parameters.
/// The signature must be created by an account with the PERMISSION_BIT_MINTER role on the contract.
/// @param premintConfig abi encoded configuration of token to be created
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,9 @@ contract Zora1155PremintExecutorProxyTest is Test, ForkDeploymentConfig, IHasCon
forkedPreminterProxy.upgradeTo(address(newImplementation));

// 3. create premint on old version of contract using new version of preminter
// verify the 1155 supports up to version 1
assertEq(forkedPreminterProxy.supportedPremintSignatureVersion(deterministicAddress), "1");

uint32 existingUid = premintConfig.uid;
premintConfig = Zora1155PremintFixtures.makeDefaultV1PremintConfig(fixedPriceMinter, creator);
premintConfig.uid = existingUid + 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,28 @@ contract ZoraCreator1155PreminterTest is ForkDeploymentConfig, Test {
preminter.premintV2{value: mintCost}(contractConfig, premintConfig2, newCreatorSignature, quantityToMint, defaultMintArguments);
}

function test_premintVersion_whenCreatedBeforePremint_returnsZero() external {
vm.createSelectFork("zora", 5_789_193);

// create preminter on fork
vm.startPrank(zora);
(, , factoryProxy, ) = Zora1155FactoryFixtures.setup1155AndFactoryProxy(zora, zora);
vm.stopPrank();

factory = ZoraCreator1155FactoryImpl(address(factoryProxy));

preminter = new ZoraCreator1155PremintExecutorImpl(factory);

// this is a known contract deployed from the legacy factory proxy on zora mainnet
// that does not support getting the uid or premint sig version (it is prior to version 2)
address erc1155BeforePremint = 0xcACBbee9C2C703274BE026B62860cF56361410f3;
assertFalse(erc1155BeforePremint.code.length == 0);

// if contract is not a known 1155 contract that supports getting uid or premint sig version,
// this should return 0
assertEq(preminter.supportedPremintSignatureVersion(erc1155BeforePremint), "0");
}

function testPremintWithCreateReferral() public {
address createReferral = makeAddr("createReferral");

Expand Down

0 comments on commit 581167d

Please sign in to comment.