This guide details the complete process for licensing an existing, verified digital asset (Level 2: Verified Rights) and then minting a new Licensed Creative Asset based on that license. It primarily uses the Mock Licensing Protocol provided by the SDK for testing purposes on Cultura testnets, demonstrating the interactions involved.Documentation Index
Fetch the complete documentation index at: https://docs.cultura.xyz/llms.txt
Use this file to discover all available pages before exploring further.
Goal
To create a new digital asset (Licensed Creative Asset) that is verifiably derived from one or more parent assets (Licensable Digital Assets) according to specific license terms, embedding provenance and royalty information on-chain.Prerequisites
- A Licensable Digital Asset exists (Level 2 Verified Rights). Let’s call this the “Parent Asset”. Its
collectionAddressandtokenIdare known. - The user wanting to create the derivative work (the “Licensee”) has an account with funds (ETH for gas, Bond Tokens for attestation/verification).
- The SDK is initialized for the Licensee (
CulturaSDK.createWithWalletorCulturaSDK.createWithAccount).
Conceptual Steps
- Obtain License: Secure the rights to use the Parent Asset(s) via a Licensing Protocol.
- Mint Derivative: Create the new Licensed Creative Asset, linking it to the Parent Asset(s) and embedding royalty splits.
- Attest Derivative: Create an attestation for the new Licensed Creative Asset to establish its own rights record (Level 1).
- Verify Derivative (Optional): Verifiers can endorse the new asset’s attestation, potentially promoting it to Level 2.
Flow Using Mock Licensing Protocol (Testnets)
The SDK provides aMockLicensingProtocolClient to simulate Step 1 and streamline Steps 2 & 3 for testing.
Flow Diagram
Explanation
-
Simulate License Acquisition (Mock Protocol):
- The Licensee selects a Parent Asset (must be Level 2) via the dApp.
- The dApp calls
sdk.mockLicensingProtocol.licenseDigitalAsset(). - The mock contract records that this parent asset is “licensed” for testing. (A real protocol would handle actual terms, payments, etc.).
-
Prepare for Delegated Attestation:
- The new Licensed Creative Asset needs attestation by its creator (Licensee). Since the Mock Protocol’s convenience function (
createLicensedAsset) handles minting and attestation together, it requires the Licensee’s signature beforehand. - The dApp calls
sdk.attestationService.signForDelegatedAttestation()to get the necessary EIP-712 typed data. - The Licensee signs this data via their wallet.
- The dApp formats the signature using
sdk.attestationService.generateSignatureParams().
- The new Licensed Creative Asset needs attestation by its creator (Licensee). Since the Mock Protocol’s convenience function (
-
Create Licensed Asset (Mock Protocol Convenience Function):
- The dApp calls
sdk.mockLicensingProtocol.createLicensedAsset(). This function bundles several actions:- Input: Takes new asset details, the
SignatureParamsfrom Step 2, aschemaUID,bondAmount,gradefor the new attestation, andparentRightsinfo (parent collection/ID, owner,royaltySplit). - Metadata: Uploads metadata for the new asset to IPFS.
- Minting: Calls
sdk.culturaDigitalAsset.mintDigitalAsset()to create the new Licensed Creative Asset NFT, passing theparentRightsarray to link it to the parent(s) and embed royalty info. - Delegated Attestation: Calls
sdk.attestationService.delegatedAttest()using the Licensee’s signature to create the attestation (Level 1) for the new asset and deploy its RBA.
- Input: Takes new asset details, the
- Returns the
licensedAssetIdandattestationInfo(attestationUid,rightsBoundAccount).
- The dApp calls
-
Optional Verification (Mock Protocol):
- To simulate the licensing protocol verifying the new asset’s compliance, a Verifier calls
sdk.mockLicensingProtocol.verifyLicensedAsset(). - This takes the
attestationUIDof the newly created asset and averificationBond. - Internally, the mock protocol calls
sdk.attestationService.verifyAttestation()on the CAS contract, acting as a verifier for the new asset’s attestation. This could promote the new asset to Level 2.
- To simulate the licensing protocol verifying the new asset’s compliance, a Verifier calls
- Result: The Licensed Creative Asset is minted and attested (Level 1), ready for royalty processing or further verification.
Direct Minting (Without Mock Protocol)
If using a real licensing protocol or handling licensing off-chain:- Secure the license for the Level 2 Parent Asset(s).
- Gather the required
parentAssetsdata (collection, ID, owner, royaltySplit) based on the license terms. - Prepare metadata objects for the new derivative asset (
termsObject,tokenUriObject). - Call
sdk.culturaDigitalAsset.mintDigitalAsset()directly, providing the recipient, new asset details, the populatedparentAssetsarray, and thetermsObjectandtokenUriObject(or pre-uploadedtermsURIandtokenURIstrings). The SDK handles IPFS uploads if objects are provided. - Optionally, call
sdk.attestationService.attest()to attest the newly minted asset (Level 0 -> Level 1). - Optionally, have verifiers call
sdk.attestationService.verifyAttestation()to promote the new asset (Level 1 -> Level 2).
Registration Patterns
How the metadata (termsURI) for the Licensed Creative Asset is structured depends on the use case:
- Direct Representation: The Licensed Creative Asset NFT is the product (e.g., a derivative artwork). Its metadata points directly to the artwork file and describes the artwork itself. The link to the parent(s) is embedded via the
parentDigitalAssetsarray stored by theCulturaDigitalAssetcontract during minting. - Reference Representation: The Licensed Creative Asset NFT acts as a license token or voucher. Its metadata describes the license terms and might link to an external product (which could be off-chain, a different NFT collection, or require further action). The
parentDigitalAssetsarray still links to the original Licensable Digital Asset.

