Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions ui/agijobmanager_genesis_job_mainnet_2026-04-03.html
Original file line number Diff line number Diff line change
Expand Up @@ -1777,27 +1777,27 @@ <h2>To Govern Their Own Kind</h2>
</div>
<div class="premiumFormulaRow" style="margin-top:10px"><span class="premiumFormulaPill">keccak256(abi.encodePacked(procurementId, applicant, applicationURI, salt))</span></div>
<div class="premiumQuickChips" style="margin-top:12px"><button class="btn" type="button" id="premiumParticipateGenerateSaltBtn">Generate secure salt</button><button class="btn" type="button" id="premiumActionGenerateApplicationCommitmentBtn">Recompute commitment</button><button class="btn" type="button" id="premiumParticipateSavePacketBtn">Save local packet</button><button class="btn" type="button" id="premiumParticipateDownloadPacketBtn">Download packet JSON</button><button class="btn" type="button" id="premiumParticipateImportPacketBtn">Import packet JSON</button></div>
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="applicantApproveStakeButton">Approve application stake</button><button class="btn btn-primary" type="button" id="applicantCommitApplicationButton">Commit application on-chain</button><button class="btn" type="button" id="applicantRevealApplicationButton">Reveal application on-chain</button><button class="btn" type="button" id="premiumParticipateOpenRevealModeBtn">Open reveal mode</button></div><div class="premiumLocalNote" id="applicantCommitBlockers" style="margin-top:10px">Blockers will appear here when commit is not ready.</div>
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="applicantApproveStakeButton">Approve application stake</button><button class="btn btn-primary" type="button" id="applicantCommitApplicationButton">Commit application on-chain</button><button class="btn" type="button" id="applicantRevealApplicationButton">Reveal application on-chain</button><button class="btn" type="button" id="premiumParticipateOpenRevealModeBtn">Open reveal mode</button></div><div class="premiumLocalNote" id="applicantCommitBlockers" style="margin-top:10px">Blockers will appear here when commit is not ready.</div><div class="premiumStickyCtaMobile" id="applicantMobileCommitBar" style="margin-top:12px"><button class="btn btn-primary" type="button" id="applicantCommitApplicationButtonSticky">Commit application on-chain</button><small style="display:block;margin-top:8px;color:var(--text-soft)">Mobile quick action mirrors the primary applicant CTA above.</small></div>
<div class="statusline" style="margin-top:12px"><b>Applicant result</b>: <span id="premiumActionResult">No participant action submitted yet.</span></div>
</div>

<div class="premiumStepCard" id="premiumFinalistRail" hidden>
<div class="premiumStepHeader"><div><h3>Finalist rail</h3><p class="premiumStepLead">Accept finalist slot before deadline, top up stake if needed, then submit trial URI.</p></div></div>
<div class="premiumField"><label for="premiumActionApplicationUriFinalist">Trial URI</label><input id="premiumActionApplicationUriFinalist" type="text" placeholder="ipfs://..."/></div>
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="premiumActionAcceptFinalistBtn">Review accept finalist slot</button><button class="btn" type="button" id="premiumActionSubmitTrialBtn">Review submit finalist trial</button></div>
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="premiumActionAcceptFinalistBtn">Accept finalist slot</button><button class="btn" type="button" id="premiumActionSubmitTrialBtn">Submit finalist trial</button></div>
</div>

<div class="premiumStepCard" id="premiumValidatorRail" hidden>
<div class="premiumStepHeader"><div><h3>Validator rail</h3><p class="premiumStepLead">Choose finalist from live list, commit score hash first, then reveal score + salt in reveal window.</p></div></div>
<div class="premiumInputGrid three"><div class="premiumField"><label for="premiumActionFinalist">Finalist</label><input id="premiumActionFinalist" type="text" placeholder="0x... or select below"></div><div class="premiumField"><label for="premiumActionScore">Score (0-100)</label><input id="premiumActionScore" type="number" min="0" max="100" step="1"></div><div class="premiumField"><label for="premiumActionCommitmentScore">Score commitment</label><input id="premiumActionCommitmentScore" type="text" placeholder="Generated locally" readonly></div></div>
<div id="premiumParticipateFinalistList" class="premiumLocalNote" style="margin-top:8px">Load procurement to show finalist addresses.</div>
<div class="premiumQuickChips" style="margin-top:12px"><button class="btn" type="button" id="premiumActionGenerateScoreCommitmentBtn">Generate score commitment</button><button class="btn" type="button" id="premiumParticipateGenerateScoreSaltBtn">Generate score salt</button></div>
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="premiumActionCommitScoreBtn">Review commit validator score</button><button class="btn" type="button" id="premiumActionRevealScoreBtn">Review reveal validator score</button></div>
<div class="premiumRoleActionRow" style="margin-top:12px"><button class="btn btn-primary" type="button" id="premiumActionCommitScoreBtn">Commit validator score on-chain</button><button class="btn" type="button" id="premiumActionRevealScoreBtn">Reveal validator score on-chain</button></div>
</div>

<div class="premiumStepCard" id="premiumClaimantRail" hidden>
<div class="premiumStepHeader"><div><h3>Claimant rail</h3><p class="premiumStepLead">Claim available balance. Typical sources: returned application stake, finalist stake return, stipend, validator bond refund + reward, employer unused reserve.</p></div></div>
<div class="builderActions"><button class="btn" type="button" id="premiumParticipateClaimsRefreshBtn">Refresh claim posture</button><button class="btn btn-primary" type="button" id="premiumParticipateClaimBtn">Review claim balance</button></div>
<div class="builderActions"><button class="btn" type="button" id="premiumParticipateClaimsRefreshBtn">Refresh claim posture</button><button class="btn btn-primary" type="button" id="premiumParticipateClaimBtn">Claim AGIALPHA balance</button></div>
</div>

<details class="premiumStepCard" id="advancedLocalPacketArchive"><summary><b>Advanced local packet archive (secondary)</b></summary>
Expand Down Expand Up @@ -10912,6 +10912,8 @@ <h3>Operational readiness</h3>
document.querySelectorAll('.premiumRoleChip').forEach(btn=>btn.classList.toggle('active', btn.dataset.premiumRole===role));
const map={applicant:'participateApplicantPanel',finalist:'premiumFinalistRail',validator:'premiumValidatorRail',claimant:'premiumClaimantRail'};
Object.entries(map).forEach(([k,id])=>{ const el=$(id); if(el) el.hidden = k!==role; });
const mobileBar = $('applicantMobileCommitBar');
if(mobileBar) mobileBar.hidden = role!=='applicant';
}
async function refreshParticipate(){
const pid=String($('premiumParticipateProcurementId')?.value||'').trim();
Expand Down Expand Up @@ -10962,6 +10964,7 @@ <h3>Operational readiness</h3>
applicantCommitReadiness = {ready:blockers.length===0, blockers, requiredStake, reputation:rep, minReputation:proc.minReputation||0};
if($('applicantCommitBlockers')) $('applicantCommitBlockers').innerHTML = blockers.length ? `<b>Commit blockers</b><ul>${blockers.map(b=>`<li>${escapeHtml(b)}</li>`).join('')}</ul>` : 'Ready for on-chain commitApplication write.';
if($('applicantCommitApplicationButton')) $('applicantCommitApplicationButton').disabled = blockers.length>0;
if($('applicantCommitApplicationButtonSticky')) $('applicantCommitApplicationButtonSticky').disabled = blockers.length>0;
if($('applicantApproveStakeButton')) $('applicantApproveStakeButton').disabled = !(requiredStake>0n && state.allowanceShortfall && !!userAccount && !!isMainnet);
if($('premiumParticipateAllowance')) $('premiumParticipateAllowance').textContent = `Applicant stake ${fmtUnits(proc.applicationStake||0)} · allowance ${fmtUnits(allowanceState.allowance||0)} · balance ${fmtUnits(allowanceState.balance||0)}`;
const finalists = await agiJobDiscovery.methods.procurementFinalists(pid).call().catch(()=>[]);
Expand Down Expand Up @@ -11029,6 +11032,7 @@ <h3>Operational readiness</h3>
const inspectorButtons=[['premiumInspectorAdvanceBtn','advanceProcurement(procurementId)','Review advanceProcurement',pid=>agiJobDiscovery.methods.advanceProcurement(pid)],['premiumInspectorFinalizeShortlistBtn','finalizeShortlist(procurementId)','Review finalizeShortlist',pid=>agiJobDiscovery.methods.finalizeShortlist(pid)],['premiumInspectorFinalizeWinnerBtn','finalizeWinner(procurementId)','Review finalizeWinner',pid=>agiJobDiscovery.methods.finalizeWinner(pid)],['premiumInspectorFallbackBtn','promoteFallbackFinalist(procurementId)','Review promoteFallbackFinalist',pid=>agiJobDiscovery.methods.promoteFallbackFinalist(pid)],['premiumInspectorCancelBtn','cancelProcurement(procurementId)','Review cancelProcurement',pid=>agiJobDiscovery.methods.cancelProcurement(pid)]];
inspectorButtons.forEach(([id,method,title,buildMethod])=>$(id)?.addEventListener('click', ()=>{ const pid=String($('premiumInspectorProcurementId')?.value||'').trim(); if(!pid) return setToast('Enter a procurement id first.','warn'); reviewDiscoveryWrite({title, method, facts:[{label:'Procurement id', value:pid}], txBuilder:()=>buildMethod(pid), run:async()=>{ await runTrackedTx(title, ()=>buildMethod(pid).send({from:userAccount}), {pendingDetail:`Submitting ${method}.`, successDetail:`${method} confirmed.`}); if($('premiumInspectorResult')) $('premiumInspectorResult').textContent=`${method} confirmed for procurement ${pid}.`; await loadProcurement(pid); await loadClaims(); }}).catch(e=>setToast(e.message||String(e),'bad')); }));
$('applicantCommitApplicationButton')?.addEventListener('click', ()=>openApplicantCommitReview());
$('applicantCommitApplicationButtonSticky')?.addEventListener('click', ()=>openApplicantCommitReview());
$('applicantRevealApplicationButton')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.salt||!x.uri) return setToast('Enter procurement id, salt, and application URI.','warn'); reviewDiscoveryWrite({title:'Review reveal application', method:'revealApplication(procurementId,subdomain,proof,salt,applicationURI)', facts:[{label:'Procurement id',value:x.pid},{label:'Connected wallet',value:userAccount||'—'},{label:'Application URI',value:x.uri},{label:'Salt',value:x.salt},{label:'Reveal meaning',value:'This reveals the URI and proves it matches your prior commitment hash.'}], txBuilder:()=>agiJobDiscovery.methods.revealApplication(x.pid, x.subdomain, x.proof, x.salt, x.uri), run:async()=>{ const receipt=await runTrackedTx('revealApplication', ()=>agiJobDiscovery.methods.revealApplication(x.pid, x.subdomain, x.proof, x.salt, x.uri).send({from:userAccount}), {pendingDetail:'Revealing application.', successDetail:'Application reveal confirmed.'}); $('premiumActionResult').textContent=`revealApplication confirmed for procurement ${x.pid}.`; if(receipt?.events?.ApplicationRevealed || Object.values(receipt?.events||{}).find(e=>e?.event==='ApplicationRevealed')){ if($('premiumParticipatePacketState')) $('premiumParticipatePacketState').textContent='On-chain revealed'; if($('premiumParticipatePacketMeta')) $('premiumParticipatePacketMeta').textContent='Reveal confirmed on-chain.'; } }}).catch(e=>setToast(e.message||String(e),'bad')); });
$('premiumActionAcceptFinalistBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid) return setToast('Enter procurement id.','warn'); reviewDiscoveryWrite({title:'Review acceptFinalist', method:'acceptFinalist(procurementId)', facts:[{label:'Procurement id',value:x.pid}], txBuilder:()=>agiJobDiscovery.methods.acceptFinalist(x.pid), run:async()=>{ await runTrackedTx('acceptFinalist', ()=>agiJobDiscovery.methods.acceptFinalist(x.pid).send({from:userAccount}), {pendingDetail:'Accepting finalist slot.', successDetail:'Finalist acceptance confirmed.'}); $('premiumActionResult').textContent=`acceptFinalist confirmed for procurement ${x.pid}.`; }}).catch(e=>setToast(e.message||String(e),'bad')); });
$('premiumActionSubmitTrialBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.uri) return setToast('Enter procurement id and trial URI.','warn'); reviewDiscoveryWrite({title:'Review submitTrial', method:'submitTrial(procurementId,trialURI)', facts:[{label:'Procurement id',value:x.pid},{label:'Trial URI',value:x.uri}], txBuilder:()=>agiJobDiscovery.methods.submitTrial(x.pid, x.uri), run:async()=>{ await runTrackedTx('submitTrial', ()=>agiJobDiscovery.methods.submitTrial(x.pid, x.uri).send({from:userAccount}), {pendingDetail:'Submitting finalist trial.', successDetail:'Finalist trial confirmed.'}); $('premiumActionResult').textContent=`submitTrial confirmed for procurement ${x.pid}.`; }}).catch(e=>setToast(e.message||String(e),'bad')); });
Expand Down
Loading