function closeEpoch(
address studio,
uint64 epoch,
bytes32 dataHash
) external {
IStudioProxy studioProxy = IStudioProxy(studio);
// Get all participants
address[] memory participants = studioProxy.getWorkParticipants(dataHash);
// Process each worker
for (uint i = 0; i < participants.length; i++) {
address worker = participants[i];
// Get per-worker scores from all verifiers
ScoreVector[] memory scores = studioProxy.getScoreVectorsForWorker(
dataHash,
worker
);
// Calculate consensus
uint8[5] memory consensus = calculateConsensus(scores);
// Calculate quality scalar
uint256 quality = calculateQuality(consensus, dimensionWeights);
// Get contribution weight
uint256 contribWeight = studioProxy.getContributionWeight(dataHash, worker);
// Calculate payout
uint256 payout = (quality * contribWeight * escrow) / 1e36;
// Release funds
studioProxy.releaseFunds(worker, payout, dataHash);
// Publish reputation
publishReputation(worker, consensus, studioProxy.getFeedbackAuth(dataHash, worker));
}
}