Skip to content

Enhancement Suggestions for SRC721 #1

@btcopenstamp

Description

@btcopenstamp

[new]
Check the latest version at https://github.com/btcopenstamp/src-721/tree/dev

[old]
In order to establish a unified indexer for SRC721 and promote the development of the Stamp ecosystem, the OpenStamp team offers the following insights based on the conventional issuance of ERC721 projects and some remarks from Derp. This extends the current SRC721 standard and is proposed for reference and discussion:

  1. Roles

    • Owner: The address that holds the collection deployment stamp. The owner changes as the stamp is transferred.
    • Operator: The agent providing signature authorization. The primary function is for the owner to delegate the minting service to handle project issuance. The pubkey in the deploy json data corresponds to the operator's Bitcoin public key.
  2. Authority Operations

    • Change Operator: The owner can initiate a protocol operation to change the operator.
    • Generate Reveal Signature: The owner signs the hash(traits data objects) to obtain a signature. If the first input of the transaction is the owner, no signature is required.
    • Generate Mint Signature: The owner/operator signs the token id + hash(traits data objects) + user address to obtain a signature.
  3. Unique, Valid, Whitelist/MEV considerations and solutions for NFTs

    • Uniqueness: A collection can contain NFTs with identical traits. Uniqueness is denoted by token id.
    • Validity: The layers/traits of NFTs within a collection should be determined by the issuer, rather than arbitrarily assigned by users.
    • Whitelist: The issuer can specify a whitelist of addresses.
    • MEV: There may be MEV attacks during public sale if the signature data does not contain the user address.

    A unified solution to the above issues:

    The signature in the mint operation is generated by the operator/owner. The signature data is token id + hash(stamp's traits data objects) + user address. The current SRC721 standard suggests using a merkle root and merkle proof for whitelist verification, but this method may increase transaction costs due to larger on-chain data (mainly merkle proof). Therefore, it is suggested to remove the merkle tree verification method.

    Potential issue: To avoid wasting transaction fees, each token id can only be allocated to one address during the mint stage. However, if the user obtains the signature for the corresponding token id and does not publish the transaction, that token id cannot be minted. Therefore, during issuance, each token id will have a lock-up period. After this period, the project issuer or minting service needs to release the token id again.

  4. Signature Algorithm

    The deploy json should include a signature algorithm field. The default should be Elliptic Curve Digital Signature Algorithm (ECDSA).

  5. Minting Fee

    • Off-Protocol: Collection issuers can collect fees off-protocol via a whitelist.
    • On-Protocol: Add a "fee recipient" field to the deploy json, defaulting to the owner address, to serve as the recipient of the minting fee. Add a "price" field in satoshi to denote the fee per mint operation; absence indicates no charge. If the price field is greater than 0, a valid mint transaction must include an output for the fee recipient (default to owner address if not specified), and the amount cannot be less than the price. This adds complexity to the protocol but reduces workload for project issuers.
  6. Additional Operations Needed for the Specification

    • Change of operator by the owner.
    • If minting fees are to be collected on-protocol, an operation for the owner to change the minting fee is needed.

Feel free to join the discussion, share your thoughts, and help us make SRC721 better. We look forward to your feedback and active participation.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions