IPT
The ERC-20 token that represents fractionalized ownership of an IP-NFT's intellectual property rights
Overview
IPToken is an ERC-20 token that represents a transferable share of intellectual property rights derived from an IP-NFT. Each IP-NFT can be tokenized exactly once, producing a unique IPToken contract. The resulting tokens can be held, transferred, and traded β giving holders economic exposure, governance participation, and token-gated access to the Lab's data room.
IPToken contracts are not deployed individually. They are created as EIP-1167 minimal proxy clones by the Tokenizer contract, which means every IPToken shares the same implementation code but maintains independent state. There is no fixed deployment address for IPTokens β each one is unique and must be discovered through Tokenizer.synthesized(ipnftId) or via the subgraph.
Contract Details
Contract
IPToken v1.3
Standard
ERC-20 (with Burnable)
Type
EIP-1167 Minimal Proxy Clone
Created By
Tokenizer
Owner
Tokenizer contract (enforces IP-NFT holdership)
Solidity
0.8.18
License
MIT
Discovering IPToken Addresses
IPTokens do not have fixed addresses. To find the IPToken for a given IP-NFT:
On-chain:
solidity
IIPToken ipToken = Tokenizer.synthesized(ipnftId);Via subgraph:
graphql
How It Works
Creation
When an IP-NFT owner calls Tokenizer.tokenizeIpnft(), the Tokenizer deploys a new IPToken clone via initialize(). The token is configured with a name, symbol, and a Metadata struct that permanently links it to the originating IP-NFT ID, the original owner's address, and the IPFS CID of the governing legal agreement (FAM agreement).
Supply Control
The IP-NFT controller (the current owner of the underlying IP-NFT, resolved through the Tokenizer) can issue additional tokens at any time by calling issue() through the Tokenizer. Once cap() is called, the supply is permanently frozen β no new tokens can ever be minted. Capping is irreversible.
The totalIssued counter tracks all tokens ever minted and may differ from totalSupply() if tokens have been burned.
Controller Model
The IPToken's owner is always the Tokenizer contract, not the IP-NFT holder directly. Write operations (issue and cap) are gated by the onlyTokenizerOrIPNFTController modifier, which allows calls from either the Tokenizer itself or the current controller of the associated IP-NFT (as resolved by Tokenizer.controllerOf(ipnftId)). This means IPToken control automatically transfers when the IP-NFT changes hands β there is no separate ownership transfer needed.
Burning
IPToken inherits from ERC20BurnableUpgradeable. Any holder can burn their own tokens via burn(amount) or burnFrom(account, amount) with approval. Burning permanently removes tokens from circulation and reduces totalSupply(), but totalIssued remains unchanged.
Functions
Write Functions
issue Mints new tokens to a specified address. Only callable by the Tokenizer or the current IP-NFT controller. Reverts if the token has been capped.
solidity
Parameters:
receiver(address): The address to receive newly minted tokens.amount(uint256): The number of tokens to mint (18 decimals).
cap Permanently freezes the token supply. After calling, no new tokens can ever be issued. Irreversible.
solidity
Emits: Capped(uint256 atSupply)
burn (inherited from ERC20Burnable) Burns tokens from the caller's balance.
solidity
burnFrom (inherited from ERC20Burnable) Burns tokens from another account (requires approval).
solidity
transfer / transferFrom / approve (standard ERC-20) Standard ERC-20 transfer and approval functions. No restrictions β IPTokens are freely transferable.
Read Functions
metadata Returns the Metadata struct linking this token to its originating IP-NFT.
solidity
Returns:
ipnftId(uint256): The ID of the parent IP-NFT.originalOwner(address): The IP-NFT owner at the time of tokenization.agreementCid(string): IPFS CID of the legal agreement governing this token.
totalIssued Returns the total number of tokens ever minted. This may exceed totalSupply() if tokens have been burned.
solidity
capped Returns whether the token supply has been permanently frozen.
solidity
uri Returns a base64-encoded data URL containing ERC-1155-compatible JSON metadata, including the IP-NFT ID, agreement CID, original owner, token contract address, and current supply.
solidity
totalSupply / balanceOf / allowance / name / symbol / decimals (standard ERC-20) Standard ERC-20 read functions. Decimals is always 18.
Metadata Struct
solidity
Events
Capped(uint256 atSupply)
Emitted when the token supply is permanently frozen. atSupply is the final totalIssued value.
Transfer(address from, address to, uint256 value)
Standard ERC-20 transfer event (includes mints from address(0) and burns to address(0)).
Approval(address owner, address spender, uint256 value)
Standard ERC-20 approval event.
Errors
TokenCapped()
Attempted to call issue() after the token has been capped.
MustControlIpnft()
Caller is not the Tokenizer contract or the current IP-NFT controller.
Security Considerations
Controller-gated supply. Only the Tokenizer or the current IP-NFT holder can issue or cap tokens. This is enforced on-chain by the onlyTokenizerOrIPNFTController modifier.
Irreversible capping. Once cap() is called, the supply is permanently frozen. There is no mechanism to uncap a token. This protects holders from unexpected dilution.
Automatic controller transfer. IPToken control follows IP-NFT ownership. Transferring the IP-NFT to a new address immediately grants that address the ability to issue and cap tokens. No separate IPToken ownership transfer is needed.
Clone architecture. IPTokens are EIP-1167 minimal proxy clones. The implementation is shared, reducing deployment gas, but each clone has independent storage. The implementation contract cannot be called directly (initializers are disabled in the constructor).
Freely transferable. IPTokens have no transfer restrictions. They can be sent to any address, traded on DEXes, or used in DeFi protocols.
Audited. IPToken is covered by the Pashov security review.
Related Contracts
Tokenizer
Creates IPToken clones and enforces IP-NFT holdership rules for issue and cap.
IPNFT
The ERC-721 token that IPTokens are derived from. IP-NFT ownership determines who controls the IPToken.
AccessResolver
Uses IP-NFT ownership to resolve file access permissions for IPToken holders.
TimelockedToken
Can lock IPTokens for a configurable duration (used in vesting and crowdsales).
Resources
Source Code
Interface
ABI
Available in @moleculexyz/common/abis
Subgraph
Query IPTokens via the Molecule Subgraph
Last updated