Git Source

Inherits: ERC721, ReentrancyGuard, ERC721Burnable, [RulesEngineClientERC721](/v2(/reference/v2/client/RulesEngineClientERC721.sol/abstract.RulesEngineClientERC721)

Author: @mpetersoCode55, @ShaneDuncan602, @TJ-Everett, @VoR0220

This contract demonstrates how to integrate the Rules Engine with an ERC721 token for policy enforcement.

This contract is an example implementation of an ERC721 token integrated with the Rules Engine. It extends the OpenZeppelin ERC721 and ERC721Burnable contracts and includes additional functionality for interacting with the Rules Engine. The contract ensures compliance with policies defined in the Rules Engine for minting, transferring, and transferring tokens on behalf of others. It also includes a withdrawal function for Ether stored in the contract.

State Variables

baseUri

Base Contract URI

string public baseUri;

counter

uint256 public counter;

Functions

constructor

Constructor for the Example ERC721 token.

Initializes the token with a name and symbol.

constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol);

Parameters

NameTypeDescription
_namestringThe name of the token.
_symbolstringThe symbol of the token.

safeMint

Mints a new token to the specified address.

The token ID is incremented by 1 from the previous minted token. This function is payable to allow child contracts to override it with a priced mint function.

function safeMint(address to) public payable virtual checksPoliciesERC721SafeMintAfter(to);

Parameters

NameTypeDescription
toaddressThe address of the recipient.

safeTransferFrom

Safely transfers a token from one address to another.

This function overrides the ERC721-safeTransferFrom function and interacts with the Rules Engine to ensure compliance with transfer policies. It includes additional checks for policy compliance.

function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
    public
    override
    checksPoliciesERC721SafeTransferFromBefore(from, to, tokenId, data);

Parameters

NameTypeDescription
fromaddressThe address of the current token owner.
toaddressThe address of the recipient.
tokenIduint256The ID of the token to transfer.
databytesAdditional data to pass to the recipient contract.

transferFrom

Transfers a token from one address to another.

This function overrides the [ERC721-transferFrom](/v2(/reference/v2/example/ExampleERC20.sol/contract.ExampleERC20.md#transferfrom) function and interacts with the Rules Engine to ensure compliance with transfer policies. It includes additional checks for policy compliance.

function transferFrom(address from, address to, uint256 tokenId)
    public
    override
    checksPoliciesERC721TransferFromBefore(from, to, tokenId);

Parameters

NameTypeDescription
fromaddressThe address of the current token owner.
toaddressThe address of the recipient.
tokenIduint256The ID of the token to transfer.

supportsInterface

Returns true if this contract implements the interface defined by interfaceId. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.

function supportsInterface(bytes4 interfaceId) public view override(ERC721) returns (bool);

withdraw

Withdraws Ether stored in the contract.

This function allows only App Administrators to withdraw Ether. It uses the appManagerAddress to enforce access control. The function is payable to allow flexibility in child contracts.

function withdraw() public payable virtual;