-
Notifications
You must be signed in to change notification settings - Fork 64
Open
Labels
Stellar WaveIssues in the Stellar wave programIssues in the Stellar wave programrustthis issue is to be implemented with rust programming language.this issue is to be implemented with rust programming language.sorobanThis issue is based on soroban smart contract.This issue is based on soroban smart contract.
Description
Description
Implement a comprehensive, standards-compliant NFT contract using Soroban SDK that serves as the core digital asset representation within the NFTopia ecosystem. This contract will define the fundamental NFT standard for Stellar, supporting token minting, transfers, ownership management, metadata storage, and royalty enforcement while ensuring security, efficiency, and interoperability with existing NFT marketplaces and wallets.
Technical Scope
1. NFT Contract Architecture
- Standards Compliance: Implement ERC-721 equivalent with Stellar optimizations
- Gas-Efficient Design: Optimize for Stellar's fee structure and transaction costs
- Upgradeable Pattern: Support for contract upgrades via transparent proxy
- Batch Operations: Enable efficient batch transfers and approvals
- Metadata Flexibility: Support for on-chain and off-chain (IPFS) metadata
- Royalty Standard: Implement EIP-2981 equivalent for universal royalty support
2. Core Contract Functions
Token Management
mint: Create new NFT with specified owner and metadataburn: Destroy NFT with proper authorization checkstransfer: Transfer ownership between addressessafe_transfer_from: Secure transfer with receiver contract validationbatch_transfer: Transfer multiple tokens in single transaction
Ownership & Approvals
owner_of: Query token ownerbalance_of: Get token count for addressapprove: Grant transfer permission for specific tokenset_approval_for_all: Grant/revoke transfer permissions for all tokensget_approved: Check approved address for tokenis_approved_for_all: Check global approval status
Metadata Management
token_uri: Retrieve metadata URItoken_metadata: Get structured metadata (on-chain)set_token_uri: Update metadata URI (owner/admin only)set_base_uri: Update base URI for collection (admin only)freeze_metadata: Permanently lock metadata (immutable mode)
3. Advanced NFT Features
Royalty & Secondary Sales
set_royalty_info: Configure royalty percentage and recipientget_royalty_info: Query royalty information for token- Royalty Distribution: Automatic royalty calculation on transfers
- Marketplace Compatibility: Support for OpenSea, Rarible, etc. royalty standards
- Secondary Sale Tracking: Record sale history for provenance
Access Control & Security
- Role-Based Access Control: Owner, admin, minter, burner roles
- Pausable Functionality: Ability to pause minting/transfers
- Time-locked Operations: Scheduled reveals and releases
- Whitelist Management: Controlled access for minting
- Anti-Sniping Protection: Measures against last-minute bidding attacks
Interoperability Features
- Cross-Contract Support: Integration with marketplace, auction contracts
- Stellar Asset Wrapping: Convert between Stellar native assets and NFTs
- Event Emission: Comprehensive event system for indexers
- Interface Compliance: ERC-165 equivalent for interface detection
- Metadata Standards: OpenSea metadata standard support
4. Security & Compliance
Security Measures
- Reentrancy Protection: Guard against reentrancy attacks
- Input Validation: Comprehensive parameter validation
- Safe Math Operations: Overflow/underflow protection
- Access Control Validation: Role-based permission checks
- Gas Limit Considerations: Prevent out-of-gas attacks
Compliance Features
- Provenance Tracking: Maintain immutable creation/transfer history
- Licensing Integration: Support for NFT licenses (CC0, proprietary)
- Regulatory Considerations: Support for jurisdictional requirements
- Anti-Money Laundering: Optional transaction monitoring hooks
- Data Privacy: GDPR-compliant data handling where applicable
Contract Specifications
Data Structures
// Core NFT data
pub struct TokenData {
pub id: u64,
pub owner: Address,
pub approved: Option<Address>,
pub metadata_uri: String,
pub created_at: u64,
pub creator: Address,
pub royalty_percentage: u32, // Basis points (0-10000)
pub royalty_recipient: Address,
pub attributes: Vec<TokenAttribute>,
pub edition_number: Option<u32>, // For limited editions
pub total_editions: Option<u32>, // For limited editions
}
// Token attribute for on-chain metadata
pub struct TokenAttribute {
pub trait_type: String,
pub value: String,
pub display_type: Option<String>, // "number", "date", "boost_percentage"
}
// Collection configuration
pub struct CollectionConfig {
pub name: String,
pub symbol: String,
pub base_uri: String,
pub max_supply: Option<u64>,
pub mint_price: Option<i128>, // Optional mint cost in stroops
pub is_revealed: bool,
pub royalty_default: RoyaltyInfo,
pub metadata_is_frozen: bool,
}
// Royalty information
pub struct RoyaltyInfo {
pub recipient: Address,
pub percentage: u32, // Basis points
}
// Role-based access control
pub enum Role {
Owner,
Admin,
Minter,
Burner,
MetadataUpdater,
}Key Functions Signature
// Core NFT functions
pub fn mint(
env: Env,
to: Address,
metadata_uri: String,
attributes: Vec<TokenAttribute>,
royalty_override: Option<RoyaltyInfo>
) -> Result<u64, ContractError>;
pub fn safe_transfer_from(
env: Env,
from: Address,
to: Address,
token_id: u64,
data: Option<Bytes>
) -> Result<(), ContractError>;
pub fn burn(
env: Env,
token_id: u64,
confirm: bool
) -> Result<(), ContractError>;
// Royalty functions
pub fn get_royalty_info(
env: Env,
token_id: u64,
sale_price: i128
) -> Result<(Address, i128), ContractError>;
pub fn set_default_royalty(
env: Env,
recipient: Address,
percentage: u32
) -> Result<(), ContractError>;
// Batch operations
pub fn batch_mint(
env: Env,
recipients: Vec<Address>,
metadata_uris: Vec<String>,
attributes: Vec<Vec<TokenAttribute>>
) -> Result<Vec<u64>, ContractError>;
pub fn batch_transfer(
env: Env,
from: Address,
to: Address,
token_ids: Vec<u64>
) -> Result<(), ContractError>;Implementation Plan
File Structure
nftopia-stellar/
├── contracts/
│ ├── nft_contract/
│ │ ├── src/
│ │ │ ├── lib.rs # Main contract entry point
│ │ │ ├── token.rs # Token data structures and logic
│ │ │ ├── transfer.rs # Transfer and approval logic
│ │ │ ├── metadata.rs # Metadata management
│ │ │ ├── royalty.rs # Royalty calculation and enforcement
│ │ │ ├── access_control.rs # Role-based access control
│ │ │ ├── storage.rs # Storage layout and management
│ │ │ ├── events.rs # Event definitions and emission
│ │ │ ├── error.rs # Error types and handling
│ │ │ ├── utils.rs # Utility functions
│ │ │ ├── interface.rs # Contract interface definitions
│ │ │ └── test/
│ │ │ ├── unit_tests.rs
│ │ │ └── integration_tests.rs
│ │ ├── Cargo.toml
│ │ ├── Makefile
│ │ └── README.md
│ └── interfaces/
│ ├── src/
│ │ ├── lib.rs
│ │ ├── i_nft.rs # Core NFT interface
│ │ ├── i_royalty.rs # Royalty interface
│ │ ├── i_metadata.rs # Metadata interface
│ │ └── i_access_control.rs # Access control interface
│ └── Cargo.toml
├── tests/
│ ├── integration/
│ │ ├── nft_workflow_tests.rs
│ │ ├── royalty_tests.rs
│ │ └── batch_operation_tests.rs
│ └── e2e/
│ ├── marketplace_integration.rs
│ └── wallet_integration.rs
└── scripts/
├── deploy_nft.sh
├── verify_metadata.sh
└── upgrade_contract.sh
Directory to Work on:
nftopia-stellar/contracts/nft_contract
Metadata
Metadata
Assignees
Labels
Stellar WaveIssues in the Stellar wave programIssues in the Stellar wave programrustthis issue is to be implemented with rust programming language.this issue is to be implemented with rust programming language.sorobanThis issue is based on soroban smart contract.This issue is based on soroban smart contract.