Shatter

Git Source

Inherits: ERC721Upgradeable, EIP2981TLUpgradeable, OwnableAccessControlUpgradeable, IShatter, ICreatorBase, ISynergy, IStory, IERC4906

Author: transientlabs.xyz

Sovereign Shatter Creator Contract with Synergy and Story Inscriptions

State Variables

VERSION

string representation of uint256

String representation for address

string public constant VERSION = "3.0.1";

ADMIN_ROLE

bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");

isShattered

bool public isShattered;

isFused

bool public isFused;

storyEnabled

bool public storyEnabled;

tlNftDelegationRegistry

ITLNftDelegationRegistry public tlNftDelegationRegistry;

blocklistRegistry

IBlockListRegistry public blocklistRegistry;

minShatters

uint128 public minShatters;

maxShatters

uint128 public maxShatters;

shatters

uint128 public shatters;

shatterTime

uint256 public shatterTime;

_shatterAddress

address private _shatterAddress;

_baseUri

string private _baseUri;

_proposedTokenUris

mapping(uint256 => string) private _proposedTokenUris;

_tokenUris

mapping(uint256 => string) private _tokenUris;

Functions

constructor

constructor(bool disable);

Parameters

NameTypeDescription
disableboolBoolean to disable initialization for the implementation contract

initialize

tx.origin is used in the events here as these can be deployed via contract factories and we want to capture the true sender

function initialize(
    string memory name,
    string memory symbol,
    string memory personalization,
    address defaultRoyaltyRecipient,
    uint256 defaultRoyaltyPercentage,
    address initOwner,
    address[] memory admins,
    bool enableStory,
    address initBlockListRegistry,
    address initNftDelegationRegistry
) external initializer;

Parameters

NameTypeDescription
namestringThe name of the 721 contract
symbolstringThe symbol of the 721 contract
personalizationstringA string to emit as a collection story. Can be ASCII art or something else that is a personalization of the contract.
defaultRoyaltyRecipientaddressThe default address for royalty payments
defaultRoyaltyPercentageuint256The default royalty percentage of basis points (out of 10,000)
initOwneraddressThe owner of the contract
adminsaddress[]Array of admin addresses to add to the contract
enableStoryboolA bool deciding whether to add story fuctionality or not
initBlockListRegistryaddressAddress of the blocklist registry to use
initNftDelegationRegistryaddressAddress of the TL nft delegation registry to use

totalSupply

function to get total supply of tokens on the contract

function totalSupply() external view returns (uint256);

setApprovedMintContracts

Function to set approved mint contracts

Access to owner or admin

function setApprovedMintContracts(address[] calldata, bool) external pure;

Parameters

NameTypeDescription
<none>address[]
<none>bool

mint

Function for minting the 1/1

Requires contract owner or admin

function mint(address recipient, string memory uri, uint128 min, uint128 max, uint256 time)
    external
    onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
recipientaddressThe address to mint to token to
uristringThe base uri to be used for the shatter folder WITHOUT trailing "/"
minuint128The minimum number of shatters
maxuint128The maximum number of shatters
timeuint256Time after which shatter can occur

shatter

function to shatter the 1/1 token

*care should be taken to ensure that the following conditions are met

  • this function can only be called once
  • msg.sender actually owns the 1/1 token
  • the token has not been shattered yet
  • block.timestamp is past the shatter time (if applicable)
  • numShatters is an allowed value as set by the creator*
function shatter(uint128 numShatters) external;

Parameters

NameTypeDescription
numShattersuint128is the total number of shatters to make

fuse

function to fuse shatters back into a 1/1

*care should be taken to ensure that the following conditions are met

  • this function can only be called once
  • the 1/1 is actually shattered
  • msg.sender actually owns all of the shatters*
function fuse() external;

setDefaultRoyalty

function to set the default royalty specification

requires owner

function setDefaultRoyalty(address newRecipient, uint256 newPercentage) external onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
newRecipientaddressthe new royalty payout address
newPercentageuint256the new royalty percentage in basis (out of 10,000)

setTokenRoyalty

function to override a token's royalty info

requires owner

function setTokenRoyalty(uint256 tokenId, address newRecipient, uint256 newPercentage)
    external
    onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
tokenIduint256the token to override royalty for
newRecipientaddressthe new royalty payout address for the token id
newPercentageuint256the new royalty percentage in basis (out of 10,000) for the token id

proposeNewTokenUri

function to propose a token uri update for a specific token

requires owner

if the owner of the contract is the owner of the token, the change takes hold right away

function proposeNewTokenUri(uint256 tokenId, string calldata newUri) external onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
tokenIduint256the token to propose new metadata for
newUristringthe new token uri proposed

acceptTokenUriUpdate

function to accept a proposed token uri update for a specific token

requires owner of the token to call the function

function acceptTokenUriUpdate(uint256 tokenId) external;

Parameters

NameTypeDescription
tokenIduint256the token to accept the metadata update for

rejectTokenUriUpdate

function to reject a proposed token uri update for a specific token

requires owner of the token to call the function

function rejectTokenUriUpdate(uint256 tokenId) external;

Parameters

NameTypeDescription
tokenIduint256the token to reject the metadata update for

tokenURI

function tokenURI(uint256 tokenId) public view override(ERC721Upgradeable) returns (string memory);

addCollectionStory

Function to let the creator add a story to the collection they have created

Depending on the implementation, this function may be restricted in various ways, such as limiting the number of times the creator may write a story.

function addCollectionStory(string calldata, string calldata story) external onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
<none>string
storystringThe story written and attached to the token id

addCreatorStory

Function to let the creator add a story to any token they have created

Depending on the implementation, this function may be restricted in various ways, such as limiting the number of times the creator may write a story.

function addCreatorStory(uint256 tokenId, string calldata, string calldata story)
    external
    onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
tokenIduint256The token id to which the story is attached
<none>string
storystringThe story written and attached to the token id

addStory

Function to let collectors add a story to any token they own

Depending on the implementation, this function may be restricted in various ways, such as limiting the number of times a collector may write a story.

function addStory(uint256 tokenId, string calldata, string calldata story) external;

Parameters

NameTypeDescription
tokenIduint256The token id to which the story is attached
<none>string
storystringThe story written and attached to the token id

setStoryStatus

Function to enable or disable collector story inscriptions

Requires owner or admin

function setStoryStatus(bool status) external onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
statusboolThe status to set for collector story inscriptions

setBlockListRegistry

Function to change the blocklist registry

Access to owner or admin

function setBlockListRegistry(address newBlockListRegistry) external onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
newBlockListRegistryaddressThe new blocklist registry

approve

function approve(address to, uint256 tokenId) public override(ERC721Upgradeable, IERC721);

setApprovalForAll

function setApprovalForAll(address operator, bool approved) public override(ERC721Upgradeable, IERC721);

setNftDelegationRegistry

Function to change the TL NFT delegation registry

Access to owner or admin

function setNftDelegationRegistry(address newNftDelegationRegistry) external onlyRoleOrOwner(ADMIN_ROLE);

Parameters

NameTypeDescription
newNftDelegationRegistryaddressThe new blocklist registry

supportsInterface

function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721Upgradeable, EIP2981TLUpgradeable, IERC165)
    returns (bool);

_ownerOf

function to override { ERC721Upgradeable._ownerOf } to allow for batch minting/shatter

function _ownerOf(uint256 tokenId) internal view virtual override returns (address);

_exists

Function to check if a token exists

function _exists(uint256 tokenId) internal view returns (bool);

Parameters

NameTypeDescription
tokenIduint256The token id to check

_isTokenOwnerOrDelegate

Function to get if msg.sender is the token owner or delegated owner

function _isTokenOwnerOrDelegate(uint256 tokenId) internal view returns (bool);

_isOperatorBlocked

function _isOperatorBlocked(address operator) internal view returns (bool);

Errors

EmptyTokenURI

token uri is an empty string

error EmptyTokenURI();

AlreadyMinted

already minted the first token and can't mint another token to this contract

error AlreadyMinted();

NotShattered

not shattered

error NotShattered();

IsShattered

token is shattered

error IsShattered();

IsFused

token is fused

error IsFused();

CallerNotTokenOwner

caller is not the owner of the specific token

error CallerNotTokenOwner();

CallerDoesNotOwnAllTokens

caller does not own all shatters for fusing

error CallerDoesNotOwnAllTokens();

InvalidNumShatters

number shatters requested is invalid

error InvalidNumShatters();

CallPriorToShatterTime

calling shatter prior to shatter time

error CallPriorToShatterTime();

NoTokenUriUpdateAvailable

no proposed token uri to change to

error NoTokenUriUpdateAvailable();

TokenDoesntExist

token does not exist

error TokenDoesntExist();

CallerNotTokenOwnerOrDelegate

Caller is not the owner or delegate of the owner of the specific token

error CallerNotTokenOwnerOrDelegate();

OperatorBlocked

Operator for token approvals blocked

error OperatorBlocked();

StoryNotEnabled

Story not enabled for collectors

error StoryNotEnabled();