This ERC proposes a Decentralized Employment System (DES) built on the Ethereum blockchain. The DES facilitates the creation and management of companies, records comprehensive employment histories through unique employee tokens, enables the formation and execution of labor contracts, automates salary payments via an escrow mechanism, incorporates a robust moderation system for dispute resolution, and implements a reputation-based review system for both employers and employees. By leveraging blockchain’s transparency and immutability, the DES ensures accountability and trust throughout the employment lifecycle, from company creation and hiring to contract fulfillment and termination.
The system operates post employee testing and prior to the final hiring and contract signing. Employees possess a Soulbound Token (SBT) representing their employment history, which companies review before finalizing labor contracts. This token-based approach ensures a secure and verifiable employment record that enhances the hiring process’s integrity.
Motivation
Traditional employment systems are centralized, opaque, and often lack trust. The DES aims to introduce transparency, immutability, and trust into the employment process by leveraging blockchain technology. By recording employment history on-chain, enabling decentralized company creation, automating contract enforcement, and providing mechanisms for dispute resolution, the DES promotes a fairer and more transparent employment ecosystem. Additionally, the system streamlines the hiring process by securely managing employment records and automating contractual obligations.
Specification
Solidity Interface
To provide a clear and standardized way for developers to interact with the DES, the following Solidity interface outlines the primary functions and events of the system:
pragmasolidity^0.8.0;/// @title Decentralized Employment System Interface
interfaceIDecentralizedEmploymentSystem{// Events
eventCompanyRegistered(uintcompanyId,addressowner,stringname,stringindustry);eventEmployeeTokenMinted(uinttokenId,addressemployee);eventContractCreated(uintcontractId,uintcompanyId,uintemployeeTokenId,uintsalary,uintduration);eventContractExecuted(uintcontractId);eventSalaryDeposited(uintcontractId,uintamount);eventSalaryReleased(uintcontractId,addressemployee);eventDisputeRaised(uintcontractId,addressraisedBy);eventDisputeResolved(uintcontractId,booldecisionForEmployee);eventContractTerminated(uintcontractId,stringreason);eventReviewSubmitted(uintcontractId,uintrating,stringcomments);// Company Management
functionregisterCompany(stringcalldataname,stringcalldataindustry)externalreturns(uintcompanyId);functiongetCompany(uintcompanyId)externalviewreturns(stringmemoryname,stringmemoryindustry,addressowner,uint[]memoryemployeeIds);// Employee Management
functionmintEmployeeToken(addressemployee,stringcalldatametadataURI)externalreturns(uinttokenId);functiongetEmploymentHistory(uintemployeeTokenId)externalviewreturns(uint[]memorycontractIds);// Labor Contracts
functioncreateContract(uintcompanyId,uintemployeeTokenId,uintsalary,uintduration,stringcalldataresponsibilities,stringcalldataterminationConditions)externalreturns(uintcontractId);functionexecuteContract(uintcontractId)external;// Payment System
functiondepositSalary(uintcontractId)externalpayable;functionreleaseSalary(uintcontractId)external;// Dispute Resolution
functionraiseDispute(uintcontractId)external;functionresolveDispute(uintcontractId,booldecisionForEmployee)external;// Contract Termination
functionterminateContract(uintcontractId,stringcalldatareason)external;// Review System
functionsubmitReview(uintcontractId,uintrating,stringcalldatacomments)external;functiongetReviews(uintcontractId)externalviewreturns(Review[]memory);// Structures
structReview{uintrating;stringcomments;addressreviewer;}}
Description: Allows users to register a new company on the blockchain. Each company is assigned a unique companyId and associated with the caller’s address as the owner.
Parameters:
name: The name of the company.
industry: The industry sector of the company.
Returns:
companyId: A unique identifier for the registered company.
Description: Retrieves the profile details of a registered company, including its name, industry, owner address, and a list of associated employee token IDs.
Parameters:
companyId: The unique identifier of the company.
Returns:
name: Name of the company.
industry: Industry sector of the company.
owner: Ethereum address of the company owner.
employeeIds: Array of employee token IDs associated with the company.
Description: Mints a Soulbound Token (SBT) representing an employee. The token contains metadata about the employee, such as professional credentials, stored off-chain and referenced via metadataURI.
Parameters:
employee: Ethereum address of the employee.
metadataURI: URI pointing to the employee’s metadata.
Returns:
tokenId: A unique identifier for the employee token.
Description: Activates the contract by marking it as active once both the company and the employee have agreed to the terms by signing the transaction with their respective wallets.
Parameters:
contractId: The unique identifier of the contract to be executed.
Description: Allows the company to deposit the agreed salary into the contract’s escrow. The function ensures that the deposited amount matches the contract’s salary.
Parameters:
contractId: The unique identifier of the contract for which the salary is being deposited.
Payable: Yes, the function is payable to accept the salary funds.
b. Automated Payments
Function: releaseSalary(uint contractId) external
Description: Releases the salary from escrow to the employee’s address based on the contract’s payment schedule or upon contract completion.
Parameters:
contractId: The unique identifier of the contract for which the salary is being released.
5. Dispute Resolution
a. Dispute Initiation
Function: raiseDispute(uint contractId) external
Description: Allows either party involved in the contract to initiate a dispute. This action triggers the assignment of a moderator to resolve the issue.
Parameters:
contractId: The unique identifier of the contract in dispute.
Description: Enables the assigned moderator to resolve the dispute by making a decision. If the decision favors the employee, escrow funds are transferred accordingly; otherwise, they may be returned to the company.
Parameters:
contractId: The unique identifier of the contract under dispute.
decisionForEmployee: Boolean indicating if the decision favors the employee.
Description: Enables both companies and employees to submit reviews post-contract. Reviews include a rating and comments, contributing to the reputation score of both parties.
Parameters:
contractId: The unique identifier of the contract being reviewed.
rating: Numerical rating reflecting the experience.
Description: Retrieves all reviews associated with a specific contract.
Parameters:
contractId: The unique identifier of the contract whose reviews are being fetched.
Returns:
Review[]: An array of reviews related to the contract.
Employment History
Immutable Records: Employment history is maintained as an array of contract IDs linked to each employee’s Soulbound Token (SBT). This ensures that all employment records are permanently and immutably stored on the blockchain.
Public Accessibility: Employment history data is publicly accessible through the getEmploymentHistory function, allowing companies to verify an employee’s past engagements before finalizing contracts.
Payment System
Salary Deposits: Companies deposit salaries into an escrow managed by the smart contract by calling depositSalary. The contract ensures that funds are securely held until payment conditions are satisfied.
Automated Payments: Salaries are released automatically or upon triggering the releaseSalary function, ensuring timely and condition-based payments to employees.
Moderation and Dispute Resolution
Dispute Initiation and Resolution: Either party can raise disputes, which are then resolved by assigned moderators. Moderators act as impartial arbitrators to ensure fair outcomes based on contract terms and evidence provided.
Firing Employees
Termination Conditions: Companies can terminate contracts based on predefined conditions, with the option for dispute resolution if termination is contested.
Review System
Reputation Scores: Reviews contribute to the reputation scores of both companies and employees, fostering accountability and encouraging positive behavior within the ecosystem.
Rationale
Employee Tokenization:
Utilizing Soulbound Tokens (SBTs) to represent employees ensures that each employee has a unique, non-transferable identity on the blockchain. This design choice enhances the integrity of employment records, making them tamper-proof and verifiable. It also allows companies to access a comprehensive employment history before finalizing contracts, promoting transparency.
Escrow System for Salary Payments:
Implementing an escrow mechanism secures salary payments, ensuring that funds are only released when contractual obligations are met. This system protects both employees and companies by guaranteeing that salaries are available and that payments are contingent on contract fulfillment.
Moderation and Dispute Resolution:
Incorporating a moderation system allows for the resolution of disputes that cannot be automatically enforced by smart contracts. Moderators provide necessary human oversight in complex employment matters, ensuring fair and just outcomes.
Public Employment History:
Making employment history publicly accessible fosters trust and accountability. It allows potential employers to verify past employment and credentials, reducing the risk of fraud and enhancing the credibility of employees within the ecosystem.
Review System:
A reputation-based review system encourages positive interactions and behaviors among users. By allowing both companies and employees to submit reviews, the system promotes mutual accountability and helps build reliable reputations.
Test Cases
Company Creation:
Input: A user calls the registerCompany("TechCorp", "Technology") function.
Expected Output: A new company is registered with a unique companyId, and the companies mapping is updated with the company’s details (name: “TechCorp”, industry: “Technology”, owner: caller’s address).
Employee Token Minting:
Input: The system owner calls mintEmployeeToken(employeeAddress, "ipfs://metadataURI").
Expected Output: A new SBT is minted for the employee with a unique tokenId, and the employees mapping is updated accordingly.
Contract Creation and Execution:
Input:
A company with companyId1 calls createContract(1, 5, 1000, 6, "Software Development", "Failure to meet deadlines").
Both the company and the employee sign the contract by calling executeContract(contractId).
Expected Output:
A new labor contract is created with a unique contractId, and relevant mappings are updated.
The contract status is set to “active” upon execution by both parties.
Salary Deposit:
Input: The company calls depositSalary(contractId) with a value of 1000 USDC.
Expected Output: The escrowBalances mapping is updated to reflect the deposited amount for contractId, securing the funds in escrow.
Salary Payment:
Input: After the contract duration, releaseSalary(contractId) is called.
Expected Output: The escrowed 1000 USDC is transferred to the employee’s address, and the escrowBalances mapping for contractId is reset to zero.
Employment Termination:
Input: The company calls terminateContract(contractId, "Failure to meet deadlines").
Expected Output:
The contract status is updated to “terminated” in the contracts mapping.
A termination event is emitted, and the company is no longer obligated to continue salary payments.
Dispute Resolution:
Input: Either party calls raiseDispute(contractId), followed by the assigned moderator calling resolveDispute(contractId, true) to favor the employee.
Expected Output: The escrow funds are transferred to the employee, and the dispute is marked as resolved in the contract’s status.
Security Considerations
Contract Integrity: Ensure that all labor contracts are immutable and cannot be tampered with once created and executed.
Fund Security: Salaries are securely held in escrow, and only released based on predefined conditions to prevent unauthorized access or misuse.
Moderator Trust: Implement a decentralized and transparent system for selecting and monitoring moderators to maintain impartiality and trust in dispute resolutions.
Review System: Incorporate safeguards against fraudulent reviews, such as verifying the association of reviews with legitimate contract completions, to maintain accurate and trustworthy reputation scores.
Token Security: Use Soulbound Tokens (SBTs) for employee representation to prevent token transfers and ensure that employment records are securely tied to the respective individuals.