diff --git a/TEMPLATE.md b/TEMPLATE.md index 860c2f47..af8cc2d0 100644 --- a/TEMPLATE.md +++ b/TEMPLATE.md @@ -1,67 +1,159 @@ -# vApp Submission: [Your Project Name] +## Samba-SocialTicket vApp Proposal -## Verification -```yaml -github_username: "your-username" -discord_id: "123456789012345678" -timestamp: "2025-01-15" -``` +## Project Information -## Developer -- **Name**: Your Name -- **GitHub**: @your-username -- **Discord**: username#1234 -- **Experience**: Brief background +- **Project Name:** Samba-SocialTicket +- **Category:** social +- **GitHub Username:** pichanesantana-cloud +- **Discord ID:** @r3nato7732 +- **Team Size:** 3 (Developer) -## Project - -### Name & Category -- **Project**: Your vApp Name -- **Category**: identity/defi/social/gaming/infrastructure/other +## Project Overview ### Description -What problem does your vApp solve? What does it do? - -### SL Integration -How will you use Soundness Layer? What specific SL features? - -## Technical - -### Architecture -High-level system design and approach - -### Stack -- **Frontend**: React/Vue/etc -- **Backend**: Rust/Node.js/Python/etc -- **Blockchain**: SL + others -- **Storage**: Database/WALRUS/IPFS/etc - -### Features -1. Core feature 1 -2. Core feature 2 -3. Core feature 3 - -## Timeline - -### PoC (2-4 weeks) -- [ ] Basic functionality -- [ ] SL integration -- [ ] Simple UI - -### MVP (4-8 weeks) -- [ ] Full features -- [ ] Production ready -- [ ] User testing - -## Innovation -What makes this unique? Why will people use it? - -## Contact -Preferred contact method and where you'll share updates. - - -**Checklist before submitting:** -- [ ] All fields completed -- [ ] GitHub username matches PR author -- [ ] SL integration explained -- [ ] Timeline is realistic +Samba-SocialTicket is a decentralized social ticketing platform that leverages blockchain technology and Soundness Layer's zero-knowledge proof (ZK) verification to create transparent, secure, and community-driven event management. The platform enables users to create, distribute, and manage event tickets while building social reputation through verified attendance and community interactions, all enhanced by Soundness Layer's trustless attestation system. + +### Key Features +- **Decentralized Event Creation:** Users can create events with smart contract-backed tickets. +- **Social Verification:** Attendance verification using ZK proofs via Soundness Layer. +- **Reputation System:** Privacy-preserving reputation based on event history, verified by Soundness Layer. +- **NFT Ticketing:** Each ticket is an NFT with unique properties and transferability rules. +- **Community Governance:** Event organizers and attendees participate in dispute resolution. + +## Technical Architecture + +### Core Components + +#### 1. Smart Contracts (Move Language) +```move +// Simplified contract structure with Soundness Layer integration +module samba_tickets::event_manager { + use sui::object::{Self, UID}; + use sui::string::{Self, String}; + use sui::tx_context::{Self, TxContext}; + use sui::transfer; + use sui::event; + + // Structs for Events, Tickets, and Reputation + struct Event has key, store { + id: UID, + creator: address, + title: String, + description: String, + max_capacity: u64, + ticket_price: u64, + event_date: u64, + is_active: bool, + walrus_blob_id: String, // Reference to Walrus storage + } + + struct Ticket has key, store { + id: UID, + event_id: UID, + owner: address, + attendance_verified: bool, + transfer_count: u8, + zk_proof_hash: String, // ZK proof hash from Soundness Layer + } + + struct UserReputation has key { + id: UID, + user: address, + events_attended: u64, + events_created: u64, + reputation_score: u64, + zk_reputation_proof: String, // ZK proof for privacy-preserving reputation + } + + // Event for logging + struct EventCreated has copy, drop { + event_id: ID, + creator: address, + } + + // Function to create an event with Walrus metadata storage + public entry fun create_event( + title: vector, + description: vector, + max_capacity: u64, + ticket_price: u64, + event_date: u64, + walrus_blob_id: vector, // Metadata stored on Walrus + ctx: &mut TxContext + ) { + let event = Event { + id: object::new(ctx), + creator: tx_context::sender(ctx), + title: string::utf8(title), + description: string::utf8(description), + max_capacity, + ticket_price, + event_date, + is_active: true, + walrus_blob_id: string::utf8(walrus_blob_id), + }; + event::emit(EventCreated { + event_id: object::uid_to_inner(&event.id), + creator: tx_context::sender(ctx), + }); + transfer::share_object(event); + } + + // Function to mint a ticket with Soundness Layer proof submission + public entry fun mint_ticket( + event: &mut Event, + ctx: &mut TxContext + ) { + assert!(event.is_active, 1); // Ensure event is active + let ticket = Ticket { + id: object::new(ctx), + event_id: object::uid_to_inner(&event.id), + owner: tx_context::sender(ctx), + attendance_verified: false, + transfer_count: 0, + zk_proof_hash: string::utf8(b""), // Placeholder, to be updated with ZK proof + }; + // Simulate Soundness Layer proof submission (CLI call would be here) + // Example: soundness-cli submit-proof --blob-id --event-id + transfer::transfer(ticket, tx_context::sender(ctx)); + } + + // Function to verify attendance with ZK proof + public entry fun verify_attendance( + ticket: &mut Ticket, + zk_proof: vector, // ZK proof submitted via Soundness Layer + ctx: &mut TxContext + ) { + assert!(!ticket.attendance_verified, 2); // Ensure not already verified + // Simulate Soundness Layer verification (CLI call would verify proof) + // Example: soundness-cli verify-proof --proof --ticket-id + ticket.attendance_verified = true; + ticket.zk_proof_hash = string::utf8(zk_proof); + // Update reputation (placeholder for ZK calculation) + let reputation = get_or_create_reputation(tx_context::sender(ctx), ctx); + reputation.events_attended = reputation.events_attended + 1; + reputation.reputation_score = reputation.reputation_score + 10; // Example scoring + reputation.zk_reputation_proof = string::utf8(zk_proof); // Privacy-preserving proof + } + + // Helper to get or create user reputation + fun get_or_create_reputation(user: address, ctx: &mut TxContext): &mut UserReputation { + // Simplified logic, would need a global store in a real implementation + let reputation = UserReputation { + id: object::new(ctx), + user, + events_attended: 0, + events_created: 0, + reputation_score: 0, + zk_reputation_proof: string::utf8(b""), + }; + transfer::share_object(reputation); + // Return reference (simplified) + &mut reputation + } + + // Public function to retrieve event data (for Walrus integration) + public fun get_walrus_blob_id(event: &Event): String { + event.walrus_blob_id + } +} \ No newline at end of file diff --git a/submissions/social/# Samba-SocialTicket vApp Proposal.md b/submissions/social/# Samba-SocialTicket vApp Proposal.md new file mode 100644 index 00000000..69da65b1 --- /dev/null +++ b/submissions/social/# Samba-SocialTicket vApp Proposal.md @@ -0,0 +1,133 @@ +// Simplified contract structure with Soundness Layer integration + + + module samba_tickets::event_manager { + use sui::object::{Self, UID}; + use sui::string::{Self, String}; + use sui::tx_context::{Self, TxContext}; + use sui::transfer; + use sui::event; + + // Structs for Events, Tickets, and Reputation + struct Event has key, store { + id: UID, + creator: address, + title: String, + description: String, + max_capacity: u64, + ticket_price: u64, + event_date: u64, + is_active: bool, + walrus_blob_id: String, // Reference to Walrus storage + } + + struct Ticket has key, store { + id: UID, + event_id: UID, + owner: address, + attendance_verified: bool, + transfer_count: u8, + zk_proof_hash: String, // ZK proof hash from Soundness Layer + } + + struct UserReputation has key { + id: UID, + user: address, + events_attended: u64, + events_created: u64, + reputation_score: u64, + zk_reputation_proof: String, // ZK proof for privacy-preserving reputation + } + + // Event for logging + struct EventCreated has copy, drop { + event_id: ID, + creator: address, + } + + // Function to create an event with Walrus metadata storage + public entry fun create_event( + title: vector, + description: vector, + max_capacity: u64, + ticket_price: u64, + event_date: u64, + walrus_blob_id: vector, // Metadata stored on Walrus + ctx: &mut TxContext + ) { + let event = Event { + id: object::new(ctx), + creator: tx_context::sender(ctx), + title: string::utf8(title), + description: string::utf8(description), + max_capacity, + ticket_price, + event_date, + is_active: true, + walrus_blob_id: string::utf8(walrus_blob_id), + }; + event::emit(EventCreated { + event_id: object::uid_to_inner(&event.id), + creator: tx_context::sender(ctx), + }); + transfer::share_object(event); + } + + // Function to mint a ticket with Soundness Layer proof submission + public entry fun mint_ticket( + event: &mut Event, + ctx: &mut TxContext + ) { + assert!(event.is_active, 1); // Ensure event is active + let ticket = Ticket { + id: object::new(ctx), + event_id: object::uid_to_inner(&event.id), + owner: tx_context::sender(ctx), + attendance_verified: false, + transfer_count: 0, + zk_proof_hash: string::utf8(b""), // Placeholder, to be updated with ZK proof + }; + // Simulate Soundness Layer proof submission (CLI call would be here) + // Example: soundness-cli submit-proof --blob-id --event-id + transfer::transfer(ticket, tx_context::sender(ctx)); + } + + // Function to verify attendance with ZK proof + public entry fun verify_attendance( + ticket: &mut Ticket, + zk_proof: vector, // ZK proof submitted via Soundness Layer + ctx: &mut TxContext + ) { + assert!(!ticket.attendance_verified, 2); // Ensure not already verified + // Simulate Soundness Layer verification (CLI call would verify proof) + // Example: soundness-cli verify-proof --proof --ticket-id + ticket.attendance_verified = true; + ticket.zk_proof_hash = string::utf8(zk_proof); + // Update reputation (placeholder for ZK calculation) + let reputation = get_or_create_reputation(tx_context::sender(ctx), ctx); + reputation.events_attended = reputation.events_attended + 1; + reputation.reputation_score = reputation.reputation_score + 10; // Example scoring + reputation.zk_reputation_proof = string::utf8(zk_proof); // Privacy-preserving proof + } + + // Helper to get or create user reputation + fun get_or_create_reputation(user: address, ctx: &mut TxContext): &mut UserReputation { + // Simplified logic, would need a global store in a real implementation + let reputation = UserReputation { + id: object::new(ctx), + user, + events_attended: 0, + events_created: 0, + reputation_score: 0, + zk_reputation_proof: string::utf8(b""), + }; + transfer::share_object(reputation); + // Return reference (simplified) + &mut reputation + } + + // Public function to retrieve event data (for Walrus integration) + public fun get_walrus_blob_id(event: &Event): String { + event.walrus_blob_id + } +} \ No newline at end of file