Skip to content

Turkey-Sui-Builders/Suilor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

1 Commit
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ Suilor - Guiding Your Career Journey

A secure, transparent, and decentralized job board and recruitment platform on the Sui blockchain

Guiding Your Career Journey

Sui React TypeScript Move

πŸ“‹ Table of Contents

✨ Features

Core Features

  • βœ… Job Posting: Employers can create job listings on the blockchain
  • βœ… Application System: Candidates can apply for jobs directly on-chain
  • βœ… Hiring Process: Employers can review applications and hire candidates
  • βœ… User Profiles: Users can create public/private profiles with customizable information
  • βœ… Username System: Unique username registration linked to wallet addresses
  • βœ… Capability-based Access Control: Secure authorization system
  • βœ… On-chain Events: Event emission for all important transactions
  • βœ… Multi-language Support: English, Turkish, German, and Greek languages

Bonus Features πŸ…

Move Smart Contract

  • βœ… Vectors: Vector usage for job and application collections
  • βœ… Option: Option type for optional salary and hired candidate
  • βœ… Shared Objects: Global JobBoard shared object
  • βœ… Events: JobPosted, ApplicationSubmitted, CandidateHired, ProfileCreated events
  • βœ… Access Control: EmployerCap capability pattern
  • βœ… Dynamic Fields: Applications stored as dynamic fields
  • βœ… Display Object: Display standard for Job objects
  • βœ… Contract Upgradeability: Upgrade support with version control
  • βœ… Clock: Sui Clock object usage for timestamps
  • βœ… Random: Random object for featured job selection

Frontend & Integrations

  • βœ… Sui TypeScript SDK: Latest SDK usage
  • βœ… Wallet Integration: Wallet connection with @mysten/dapp-kit
  • βœ… ZkLogin: Blockchain authentication with Google/Facebook (ready)
  • βœ… Walrus Storage: CV and document storage on Walrus
  • βœ… Modern UI/UX: Animated interface with Tailwind CSS and Framer Motion
  • βœ… Sui Brand Colors: Official Sui color palette usage
  • βœ… Responsive Design: Perfect display on all devices
  • βœ… i18n Support: Full internationalization with 4 languages

Technological Highlights

  1. Walrus Integration: CVs and documents stored on decentralized Walrus storage
  2. ZkLogin Ready: Social media authentication infrastructure for blockchain
  3. Real-time Updates: Automatic updates every 10 seconds with React Query
  4. Animated UI: Professional animations with Framer Motion
  5. Type-Safe: End-to-end TypeScript usage
  6. Comprehensive Testing: Move tests + Jest integration tests
  7. Legal Compliance: KVKK & GDPR compliant privacy pages

πŸ›  Technology Stack

Blockchain

  • Sui Move: Smart contract development
  • Sui Framework: Latest mainnet framework
  • Dynamic Fields: Scalable data structures

Frontend

  • React 18: Modern React with hooks
  • TypeScript 5: Type-safe development
  • Vite: Lightning fast build tool
  • Tailwind CSS: Utility-first CSS
  • Framer Motion: Advanced animations
  • Radix UI: Accessible component primitives
  • i18next: Internationalization framework

Sui Ecosystem

  • @mysten/dapp-kit: Wallet and Sui integration
  • @mysten/sui: Sui TypeScript SDK
  • @mysten/zklogin: ZkLogin authentication
  • Walrus: Decentralized storage

Testing & DevOps

  • Jest: Unit and integration tests
  • Sui Move Test: Smart contract tests
  • Docker: Containerization
  • Nginx: Production web server

πŸ“¦ Installation

Requirements

  • Node.js 20+
  • Sui CLI
  • Docker (optional)
  • Git

Step 1: Clone the Repository

git clone <repo-url>
cd job-board2

Step 2: Run Setup Script

chmod +x scripts/setup.sh
./scripts/setup.sh

This script:

  • Installs frontend dependencies
  • Creates .env file
  • Creates necessary directories

Step 3: Deploy Smart Contract

chmod +x scripts/deploy.sh
./scripts/deploy.sh

This script:

  • Builds the Move package
  • Runs Move tests
  • Deploys to testnet
  • Displays Package ID

Step 4: Environment Variables

Update frontend/.env file with deployment output:

VITE_NETWORK=testnet
VITE_PACKAGE_ID=<your-package-id>
VITE_JOB_BOARD_ID=<your-job-board-id>
VITE_WALRUS_PUBLISHER_URL=https://publisher.walrus-testnet.walrus.space
VITE_WALRUS_AGGREGATOR_URL=https://aggregator.walrus-testnet.walrus.space

πŸš€ Usage

Development Mode

cd frontend
npm run dev

The application will run at http://localhost:3000.

Production Build

cd frontend
npm run build
npm run preview

Run with Docker

docker-compose up -d

The application will run at http://localhost:3000.

πŸ”§ Smart Contract

Core Functions

Creating Job Listing

public fun post_job(
    board: &mut JobBoard,
    title: vector<u8>,
    company: vector<u8>,
    location: vector<u8>,
    description: vector<u8>,
    salary_amount: u64,
    include_salary: bool,
    clock: &Clock,
    ctx: &mut TxContext,
)

Applying to Job

public fun apply_to_job(
    board: &mut JobBoard,
    job: &mut Job,
    cover_message: vector<u8>,
    resume_url: vector<u8>,
    clock: &Clock,
    ctx: &mut TxContext,
)

Hiring Candidate

public fun hire_candidate(
    job: &mut Job,
    _employer_cap: &EmployerCap,
    application_index: u64,
    clock: &Clock,
    ctx: &mut TxContext,
)

Creating User Profile

public fun create_profile(
    board: &mut JobBoard,
    username: vector<u8>,
    full_name: vector<u8>,
    bio: vector<u8>,
    location: vector<u8>,
    clock: &Clock,
    ctx: &mut TxContext,
)

Data Structures

// Global shared object
public struct JobBoard has key {
    id: UID,
    version: u64,
    total_jobs: u64,
    total_applications: u64,
    active_jobs: vector<ID>,
}

// Job listing
public struct Job has key, store {
    id: UID,
    title: String,
    company: String,
    location: String,
    description: String,
    salary: Option<u64>, // Option<T> usage
    employer: address,
    status: JobStatus,
    created_at: u64,
    application_count: u64,
    hired_candidate: Option<address>, // Option<T> usage
}

// User profile
public struct UserProfile has key, store {
    id: UID,
    owner: address,
    username: String,
    full_name: String,
    bio: String,
    skills: vector<String>,
    experience: String,
    education: String,
    location: String,
    email: Option<String>,
    portfolio_url: Option<String>,
    resume_url: Option<String>,
    is_public: bool,
    created_at: u64,
    updated_at: u64,
}

// Capability pattern
public struct EmployerCap has key, store {
    id: UID,
    job_id: ID,
}

πŸ§ͺ Testing

Move Tests

cd move
sui move test

Test coverage:

  • βœ… Job board initialization
  • βœ… Job posting (with/without salary)
  • βœ… Job applications
  • βœ… Multiple applications
  • βœ… Candidate hiring
  • βœ… Job closing
  • βœ… Job updates
  • βœ… User profile creation
  • βœ… Profile updates and visibility
  • βœ… Access control (unauthorized tests)
  • βœ… Job status validations
  • βœ… Username uniqueness

Frontend Tests

cd frontend
npm test

Integration test coverage:

  • βœ… Sui client connection
  • βœ… Transaction creation
  • βœ… Data structure validation
  • βœ… Status transitions
  • βœ… Salary constraints
  • βœ… Address formatting

πŸ“Š Deployment

Deploy to Testnet

./scripts/deploy-testnet.sh

This automated script:

  • Builds the contract
  • Runs tests
  • Deploys to testnet
  • Extracts object IDs
  • Creates .env.local

See TESTNET_GUIDE.md for detailed deployment instructions.

Deploy to Mainnet

  1. Change network to mainnet in .env file
  2. Run deployment script
  3. Build and deploy frontend

Docker Production

docker-compose up -d --build

πŸ“ Project Structure

job-board2/
β”œβ”€β”€ move/                          # Move smart contracts
β”‚   β”œβ”€β”€ sources/
β”‚   β”‚   └── job_board.move        # Main contract
β”‚   β”œβ”€β”€ tests/
β”‚   β”‚   └── job_board_tests.move  # Contract tests
β”‚   └── Move.toml
β”‚
β”œβ”€β”€ frontend/                      # React frontend
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ components/           # UI components
β”‚   β”‚   β”‚   β”œβ”€β”€ ui/              # Radix UI components
β”‚   β”‚   β”‚   β”œβ”€β”€ WalletConnector.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ ZkLoginButton.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ JobCard.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ PostJobModal.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ ApplyJobModal.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ Header.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ Footer.tsx
β”‚   β”‚   β”‚   └── HireCandidateButton.tsx
β”‚   β”‚   β”œβ”€β”€ hooks/               # Custom hooks
β”‚   β”‚   β”‚   β”œβ”€β”€ useSuiJobs.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ useWalrus.ts
β”‚   β”‚   β”‚   └── useProfile.ts
β”‚   β”‚   β”œβ”€β”€ pages/
β”‚   β”‚   β”‚   β”œβ”€β”€ HomePage.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ JobDetailPage.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ ProfilePage.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ TermsPage.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ PrivacyPage.tsx
β”‚   β”‚   β”‚   └── KvkkGdprPage.tsx
β”‚   β”‚   β”œβ”€β”€ i18n/                # Internationalization
β”‚   β”‚   β”‚   β”œβ”€β”€ locales/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ en.json
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ tr.json
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ de.json
β”‚   β”‚   β”‚   β”‚   └── el.json
β”‚   β”‚   β”‚   └── index.ts
β”‚   β”‚   β”œβ”€β”€ lib/
β”‚   β”‚   β”‚   └── utils.ts
β”‚   β”‚   β”œβ”€β”€ config/
β”‚   β”‚   β”‚   β”œβ”€β”€ constants.ts
β”‚   β”‚   β”‚   └── sui.config.ts
β”‚   β”‚   β”œβ”€β”€ __tests__/           # Tests
β”‚   β”‚   └── App.tsx
β”‚   β”œβ”€β”€ package.json
β”‚   └── vite.config.ts
β”‚
β”œβ”€β”€ scripts/                       # Deployment scripts
β”‚   β”œβ”€β”€ deploy.sh
β”‚   β”œβ”€β”€ deploy-testnet.sh
β”‚   β”œβ”€β”€ test-walrus.sh
β”‚   └── setup.sh
β”‚
β”œβ”€β”€ Dockerfile                     # Docker configuration
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ nginx.conf
β”œβ”€β”€ TESTNET_GUIDE.md
β”œβ”€β”€ ZKLOGIN_GUIDE.md
β”œβ”€β”€ QUICK_START.md
└── README.md

🎨 UI/UX Features

Sui Brand Colors

  • Primary: #4DA2FF (Sui Blue)
  • Secondary: #6FBCF0 (Lighter Sui Blue)
  • Accent: #00C2FF (Sui Cyan)

Animations

  • Page transitions: Framer Motion
  • Card hover effects
  • Floating elements (Hero section)
  • Gradient background animation
  • Smooth scrolling

Responsive Design

  • Mobile-first approach
  • Tablet optimization
  • Desktop wide-screen support

πŸ† Challenge Criteria Fulfillment

Technical Design & Move Contracts (30 points)

  • βœ… Vectors usage (active_jobs, applications)
  • βœ… Option usage (salary, hired_candidate, profile fields)
  • βœ… Shared objects (JobBoard)
  • βœ… Events (5 different events)
  • βœ… Access control (EmployerCap pattern)
  • βœ… Dynamic fields (applications, username mapping)
  • βœ… Display Object
  • βœ… Contract upgradeability (version control)
  • βœ… Clock object
  • βœ… Random object

Completeness of Features (25 points)

  • βœ… Wallet connection
  • βœ… Job posting
  • βœ… Job applications
  • βœ… Hiring function
  • βœ… Job listings
  • βœ… Job details
  • βœ… "My Jobs" page
  • βœ… User profiles
  • βœ… Real-time data updates

User Experience (15 points)

  • βœ… Modern and user-friendly interface
  • βœ… Sui brand colors
  • βœ… Smooth animations
  • βœ… Responsive design
  • βœ… Loading states
  • βœ… Error handling
  • βœ… Toast notifications
  • βœ… Multi-language support

Bonus Features & Innovation (20 points)

  • βœ… Walrus integration (CV storage)
  • βœ… ZkLogin ready infrastructure
  • βœ… Dynamic fields usage
  • βœ… Display Object standard
  • βœ… Contract upgradeability
  • βœ… Clock and Random objects
  • βœ… Comprehensive testing
  • βœ… Docker deployment ready
  • βœ… User profiles with privacy controls
  • βœ… Username system

Presentation (10 points)

  • βœ… Detailed README
  • βœ… Code documentation
  • βœ… Deployment scripts
  • βœ… Clear project structure
  • βœ… Multiple guides (Testnet, ZkLogin, Quick Start)

πŸ” Security

  • Capability pattern for access control
  • Input validation
  • Transaction replay protection
  • Version control for upgrade security
  • Username uniqueness validation
  • Privacy controls for user profiles

πŸ‘₯ Contributors

This project was developed by:

  • AydΔ±n Yakar
  • Ensar Mert GΓΌnay
  • Ulaş Bal

🀝 Contributing

We welcome contributions! Please:

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

πŸ“ License

This project is licensed under the MIT License.

πŸ™ Acknowledgments

  • Sui Foundation
  • Move Community
  • Walrus Team
  • Bootcamp organizers

πŸ“ž Contact

For questions, please open an issue or reach out at hello@suilor.xyz


Note: This project was developed for the Sui Move Bootcamp Challenge and aims to showcase the future of decentralized technologies.

🌟 Demo


Made with ❀️ using Sui Move & React

Suilor - Guiding Your Career Journey

About

Guiding Your Career Journey!

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published