Skip to content

mohitejaikumar/rwa_contract

Repository files navigation

Real World Asset (RWA) Tokenization Contract

A comprehensive Solana smart contract built with Anchor framework for tokenizing real-world assets. This contract enables the digitization of physical and intangible assets into blockchain-based tokens with built-in compliance, KYC verification, and transfer controls.

Architecture

The contract is structured around three main components:

Core States

  • RwaConfig: Global configuration for RWA tokenization parameters
  • AssetRecord: Individual asset metadata and compliance status
  • UserProfile: User KYC and accreditation information

Key Features

  • Asset Tokenization: Convert real-world assets into SPL tokens
  • KYC/AML Compliance: Built-in user verification system
  • Multi-Asset Support: Real estate, equipment, commodities, art, IP, and more
  • Custody Integration: Support for multiple custody providers
  • Oracle Integration: Real-time asset valuation updates
  • Transfer Hooks: Custom transfer logic with compliance checks
  • Fee Management: Configurable tokenization and transfer fees

Getting Started

Prerequisites

Installation

  1. Clone the repository

    git clone <repository-url>
    cd rwa_contract
  2. Install dependencies

    yarn install
  3. Build the program

    anchor build
  4. Deploy to localnet

    anchor deploy

Configuration

The contract supports various asset classes:

  • RealEstate - Properties, land, buildings
  • Equipment - Machinery, vehicles, tools
  • Commodity - Gold, oil, agricultural products
  • ArtAndCollectibles - Artwork, antiques, collectibles
  • IntellectualProperty - Patents, copyrights, trademarks
  • Infrastructure - Utilities, transportation assets
  • Other - Custom asset types

Usage

1. Initialize RWA Configuration

Set up the global configuration for your RWA platform:

await program.methods
  .initializeRwaConfig({
    transferFeeBps: 100,          // 1% transfer fee
    kycRequired: true,
    accreditationRequired: false,
    kycProvider: [kycProviderPubkey],
    custodyProvider: [custodyProviderPubkey],
    oracleProgram: oracleProgramPubkey,
    tokenizationFeeBps: 50,       // 0.5% tokenization fee
    assetClass: { realEstate: {} }
  })
  .accounts({
    rwaConfig: rwaConfigPda,
    admin: adminKeypair.publicKey,
    systemProgram: SystemProgram.programId,
  })
  .signers([adminKeypair])
  .rpc();

2. User KYC Verification

Verify users before they can participate:

await program.methods
  .verifyUserKyc()
  .accounts({
    userProfile: userProfilePda,
    user: userKeypair.publicKey,
    kycProvider: kycProviderKeypair.publicKey,
    rwaConfig: rwaConfigPda,
    systemProgram: SystemProgram.programId,
  })
  .signers([kycProviderKeypair])
  .rpc();

3. Initialize Tokenization Request

Create a tokenization request for an asset:

await program.methods
  .initializeTokenizeRequest({
    assetId: "PROP001",
    name: "Downtown Office Building",
    valuation: new anchor.BN(1000000), // $1M
    totalSupply: new anchor.BN(1000000), // 1M tokens
    metadataUri: "https://example.com/metadata.json",
  })
  .accounts({
    assetRecord: assetRecordPda,
    creator: creatorKeypair.publicKey,
    rwaConfig: rwaConfigPda,
    systemProgram: SystemProgram.programId,
  })
  .signers([creatorKeypair])
  .rpc();

4. Asset Verification

Compliance officers can verify submitted assets:

await program.methods
  .verifyAsset()
  .accounts({
    assetRecord: assetRecordPda,
    complianceOfficer: complianceOfficerKeypair.publicKey,
    rwaConfig: rwaConfigPda,
  })
  .signers([complianceOfficerKeypair])
  .rpc();

5. Tokenize Verified Asset

Convert the verified asset into SPL tokens:

await program.methods
  .tokenizeAsset({
    tokenName: "Office Building Token",
    tokenSymbol: "OBT",
    tokenDecimals: 6,
    metadataUri: "https://example.com/token-metadata.json",
  })
  .accounts({
    assetRecord: assetRecordPda,
    mint: mintKeypair.publicKey,
    creator: creatorKeypair.publicKey,
    rwaConfig: rwaConfigPda,
    // ... other required accounts
  })
  .signers([creatorKeypair, mintKeypair])
  .rpc();

6. Mint Asset Tokens

Mint tokens to authorized users:

await program.methods
  .mintAsset(new anchor.BN(1000)) // Mint 1000 tokens
  .accounts({
    assetRecord: assetRecordPda,
    mint: mintPubkey,
    userTokenAccount: userTokenAccountPubkey,
    custodyOfficer: custodyOfficerKeypair.publicKey,
    // ... other required accounts
  })
  .signers([custodyOfficerKeypair])
  .rpc();

πŸ§ͺ Testing

Run the comprehensive test suite:

# Run Anchor tests
anchor test

# Run LiteSVM tests for faster iteration
cd litesvm_tests
cargo test

The test suite covers:

  • Configuration initialization
  • User KYC processes
  • Asset tokenization workflow
  • Transfer restrictions and compliance
  • Fee calculations
  • Error handling scenarios

Program Instructions

Instruction Description
initialize_rwa_config Set up global RWA configuration
verify_user_kyc Verify user KYC status
initialize_tokenize_request Create asset tokenization request
verify_asset Compliance verification of assets
tokenize_asset Convert verified asset to SPL token
mint_asset Mint tokens to authorized users
transfer_hook Custom transfer validation logic

πŸ”§ Development

Project Structure

rwa_contract/
β”œβ”€β”€ programs/rwa_contract/
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ args/          # Instruction arguments
β”‚   β”‚   β”œβ”€β”€ instructions/  # Program instructions
β”‚   β”‚   β”œβ”€β”€ states/        # Account structures
β”‚   β”‚   β”œβ”€β”€ error.rs       # Custom errors
β”‚   β”‚   β”œβ”€β”€ events.rs      # Program events
β”‚   β”‚   └── lib.rs         # Main program entry
β”œβ”€β”€ tests/                 # Anchor integration tests
β”œβ”€β”€ litesvm_tests/         # Fast unit tests
└── target/                # Build artifacts

Adding New Asset Classes

  1. Extend the AssetClass enum in states/rwa_config.rs
  2. Update validation logic in relevant instructions
  3. Add test cases for the new asset class

Custom Transfer Logic

The contract implements SPL Token 2022 transfer hooks for:

  • KYC compliance checking
  • Transfer restrictions
  • Fee collection
  • Audit logging

Security Considerations

  • Access Control: Role-based permissions for different operations
  • Input Validation: Comprehensive validation of all user inputs
  • Oracle Security: Trusted oracle integration for asset valuations
  • Transfer Restrictions: Configurable compliance-based transfer controls
  • Audit Trail: Complete event logging for regulatory compliance

License

This project is licensed under the ISC License.

Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

πŸ“ž Support

For questions and support, please open an issue in the repository or contact the development team.


⚠️ Disclaimer: This software is provided as-is for educational and development purposes. Please ensure proper security audits and regulatory compliance before using in production environments.

About

RWA tokenization contract

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published