// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.24; import "./DAO.sol"; import "./WorkContract.sol"; import "./IOnValidate.sol"; contract Onboarding is WorkContract, IOnValidate { constructor(DAO dao_, uint price_) WorkContract(dao_, price_) {} /// Accept work approval/disapproval from customer function submitWorkApproval( uint requestIndex, bool approval ) external override { WorkRequest storage request = requests[requestIndex]; require( request.status == WorkStatus.EvidenceSubmitted, "Status must be EvidenceSubmitted" ); AvailabilityStake storage stake = stakes[request.stakeIndex]; request.status = WorkStatus.ApprovalSubmitted; request.approval = approval; // Make work evidence post uint postIndex = dao.addPost(stake.worker); emit WorkApprovalSubmitted(requestIndex, approval); // Initiate validation pool dao.initiateValidationPool{value: request.fee - request.fee / 10}( postIndex, POOL_DURATION, true, abi.encode(requestIndex) ); } /// Callback to be executed when review pool completes function onValidate(bool votePasses, bytes calldata callbackData) external { require( msg.sender == address(dao), "onValidate may only be called by the DAO contract" ); if (!votePasses) return; uint requestIndex = abi.decode(callbackData, (uint)); WorkRequest storage request = requests[requestIndex]; uint postIndex = dao.addPost(request.customer); dao.initiateValidationPool{value: request.fee / 10}( postIndex, POOL_DURATION, false, "" ); } }