@@ -4054,8 +4057,6 @@
Contact & Legal
const AGIJobManagerABI = [
{"inputs":[],"name":"agiToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
- {"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
- {"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"moderators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"nextJobId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"requiredValidatorApprovals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"requiredValidatorDisapprovals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
@@ -4096,46 +4097,6 @@
Contact & Legal
{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"settlementPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"disputeReviewPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},
- {"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setSettlementPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"_moderator","type":"address"}],"name":"addModerator","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"_moderator","type":"address"}],"name":"removeModerator","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"_agent","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"blacklistAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"_validator","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"blacklistValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"bytes32","name":"_validatorMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_agentMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_approvals","type":"uint256"}],"name":"setRequiredValidatorApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_disapprovals","type":"uint256"}],"name":"setRequiredValidatorDisapprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setPremiumReputationThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_quorum","type":"uint256"}],"name":"setVoteQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_maxPayout","type":"uint256"}],"name":"setMaxJobPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setJobDurationLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxActiveJobsPerAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setCompletionReviewPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setDisputeReviewPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setValidatorBondParams","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setAgentBondParams","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"setValidatorSlashBps","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setChallengePeriodAfterApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setValidationRewardPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"validator","type":"address"}],"name":"addAdditionalValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"validator","type":"address"}],"name":"removeAdditionalValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"agent","type":"address"}],"name":"addAdditionalAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"agent","type":"address"}],"name":"removeAdditionalAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"payoutPercentage","type":"uint256"}],"name":"addAGIType","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"nftAddress","type":"address"}],"name":"disableAGIType","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"_newTokenAddress","type":"address"}],"name":"updateAGITokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"_newEnsRegistry","type":"address"}],"name":"updateEnsRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"_newNameWrapper","type":"address"}],"name":"updateNameWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"bytes32","name":"_agentRootNode","type":"bytes32"},{"internalType":"bytes32","name":"_validatorRootNode","type":"bytes32"}],"name":"updateRootNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"_ensJobPages","type":"address"}],"name":"setEnsJobPages","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[],"name":"lockIdentityConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_jobId","type":"uint256"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"resolveDisputeWithCode","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"_jobId","type":"uint256"},{"internalType":"bool","name":"employerWins","type":"bool"}],"name":"resolveStaleDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAGI","outputs":[],"stateMutability":"nonpayable","type":"function"},
{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"jobId","type":"uint256"},{"indexed":true,"internalType":"address","name":"employer","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"string","name":"jobSpecURI","type":"string"},{"indexed":false,"internalType":"uint8","name":"intakeMode","type":"uint8"},{"indexed":true,"internalType":"bytes32","name":"perJobAgentRoot","type":"bytes32"},{"indexed":false,"internalType":"string","name":"details","type":"string"}],"name":"JobCreated","type":"event"},
{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"jobId","type":"uint256"}],"name":"JobCancelled","type":"event"},
{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"jobId","type":"uint256"},{"indexed":true,"internalType":"address","name":"agent","type":"address"}],"name":"JobApplied","type":"event"},
@@ -4162,32 +4123,15 @@
Contact & Legal
];
const ENSJobPagesABI = [
- {"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
- {"inputs":[],"name":"ens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"jobsRootName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"jobsRootNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"jobManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"configLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},
- {"inputs":[],"name":"nameWrapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"publicResolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},
- {"inputs":[],"name":"jobLabelPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"}],"name":"jobLabelSnapshot","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"string","name":"label","type":"string"}],"stateMutability":"view","type":"function"},
{"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"}],"name":"jobEnsLabel","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},
{"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"}],"name":"jobEnsName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},
{"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"}],"name":"jobEnsURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"}],"name":"jobEnsNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},
- {"inputs":[{"internalType":"string","name":"newPrefix","type":"string"}],"name":"setJobLabelPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"ensAddress","type":"address"}],"name":"setENSRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"nameWrapperAddress","type":"address"}],"name":"setNameWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"publicResolverAddress","type":"address"}],"name":"setPublicResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"bytes32","name":"rootNode","type":"bytes32"},{"internalType":"string","name":"rootName","type":"string"}],"name":"setJobsRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setJobManager","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"},{"internalType":"address","name":"employer","type":"address"},{"internalType":"string","name":"specURI","type":"string"}],"name":"createJobPage","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"},{"internalType":"address","name":"agent","type":"address"}],"name":"onAgentAssigned","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"},{"internalType":"string","name":"completionURI","type":"string"}],"name":"onCompletionRequested","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"},{"internalType":"address","name":"employer","type":"address"},{"internalType":"address","name":"agent","type":"address"}],"name":"revokePermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"},{"internalType":"address","name":"employer","type":"address"},{"internalType":"address","name":"agent","type":"address"},{"internalType":"bool","name":"burnFuses","type":"bool"}],"name":"lockJobENS","outputs":[],"stateMutability":"nonpayable","type":"function"},
- {"inputs":[],"name":"lockConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"}
+ {"inputs":[{"internalType":"uint256","name":"jobId","type":"uint256"}],"name":"jobEnsNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}
];
@@ -5163,7 +5107,7 @@
Contact & Legal
return true;
}
const UI_CONTINUITY_KEY = 'agijobmanagerprime.v40.uiContinuity';
- const UI_CONTINUITY_FIELDS = ['termsAccepted','alphaTermsAcceptedTop','preflightTermsAccepted','agentSub','clubSub','mintAlphaLabel','premiumActionProcurementId','premiumActionSubdomain','premiumActionProof','premiumActionCommitment','premiumActionSalt','premiumActionApplicationUri','premiumActionFinalist','premiumActionScore','premiumInspectorProcurementId','premiumInspectorJobId','premiumDiscoveryApplicationInspectProcurementId','premiumDiscoveryApplicationInspectAgent','premiumAttachJobId','premiumDiscoveryJobSpecURI','premiumDiscoveryDetails'];
+ const UI_CONTINUITY_FIELDS = ['termsAccepted','alphaTermsAcceptedTop','preflightTermsAccepted','agentSub','clubSub','mintAlphaLabel','premiumActionProcurementId','premiumActionSubdomain','premiumActionProof','premiumActionCommitment','premiumActionSalt','premiumActionApplicationUri','premiumActionFinalist','premiumActionScore','premiumParticipateProcurementId','premiumParticipateSubdomain','premiumInspectorProcurementId','premiumInspectorJobId','premiumDiscoveryApplicationInspectProcurementId','premiumDiscoveryApplicationInspectAgent','premiumAttachJobId','premiumDiscoveryJobSpecURI','premiumDiscoveryDetails'];
const UI_CONTINUITY_TOGGLES = ['alphaEnsExpertDetails'];
function continuityLoad(){
try{ return JSON.parse(localStorage.getItem(UI_CONTINUITY_KEY) || '{}') || {}; }catch(_){ return {}; }
@@ -5235,7 +5179,7 @@
Contact & Legal
const continuityScopedToWallet = !!stored.lastWallet && !!userAccount && stored.lastWallet.toLowerCase() === String(userAccount).toLowerCase();
const continuityScopedToChain = (stored.lastChainId == null || chainId == null) ? true : String(stored.lastChainId) === String(chainId);
const sameSessionContext = continuityScopedToWallet && continuityScopedToChain;
- const portableFieldIds = new Set(['mintAlphaLabel','premiumActionProcurementId','premiumActionSubdomain','premiumActionProof','premiumActionCommitment','premiumActionSalt','premiumActionApplicationUri','premiumActionFinalist','premiumActionScore','premiumInspectorProcurementId','premiumInspectorJobId','premiumDiscoveryApplicationInspectProcurementId','premiumDiscoveryApplicationInspectAgent','premiumAttachJobId','premiumDiscoveryJobSpecURI','premiumDiscoveryDetails']);
+ const portableFieldIds = new Set(['mintAlphaLabel','premiumActionProcurementId','premiumActionSubdomain','premiumActionProof','premiumActionCommitment','premiumActionSalt','premiumActionApplicationUri','premiumActionFinalist','premiumActionScore','premiumParticipateProcurementId','premiumParticipateSubdomain','premiumInspectorProcurementId','premiumInspectorJobId','premiumDiscoveryApplicationInspectProcurementId','premiumDiscoveryApplicationInspectAgent','premiumAttachJobId','premiumDiscoveryJobSpecURI','premiumDiscoveryDetails']);
if(!sameSessionContext){
UI_CONTINUITY_FIELDS.forEach(id=>{
if(portableFieldIds.has(id)) return;
@@ -5748,15 +5692,11 @@
Contact & Legal
if(box){
if(image && isValidUriLoose(image)){
const src = normalizeIpfsToHttp(image);
- box.innerHTML = "";
- const img = document.createElement("img");
- img.alt = "Job cover preview";
+ box.textContent = '';
+ const img = document.createElement('img');
+ img.alt = 'Job cover preview';
img.src = src;
- img.onerror = () => {
- if(img.parentNode){
- img.parentNode.textContent = "Image unavailable";
- }
- };
+ img.onerror = ()=>{ box.textContent = 'Image unavailable'; };
box.appendChild(img);
}else{
box.textContent = "No image";
@@ -9340,9 +9280,9 @@
Operational readiness
addAdditionalAgent:[{name:'a',type:'address'}], removeAdditionalAgent:[{name:'a',type:'address'}],
addAGIType:[{name:'token',type:'address'},{name:'agiType',type:'uint256'}], disableAGIType:[{name:'token',type:'address'}],
updateAGITokenAddress:[{name:'newToken',type:'address'}], updateEnsRegistry:[{name:'newRegistry',type:'address'}], updateNameWrapper:[{name:'newWrapper',type:'address'}],
- updateRootNodes:[{name:'agentRootNode',type:'bytes32'},{name:'validatorRootNode',type:'bytes32'}],
+ updateRootNodes:[{name:'clubRoot',type:'bytes32'},{name:'agentRoot',type:'bytes32'},{name:'alphaClubRoot',type:'bytes32'},{name:'alphaAgentRoot',type:'bytes32'}],
setEnsJobPages:[{name:'newEnsPages',type:'address'}], rescueETH:[{name:'amount',type:'uint256'}], rescueERC20:[{name:'token',type:'address'},{name:'to',type:'address'},{name:'amount',type:'uint256'}], rescueToken:[{name:'token',type:'address'},{name:'data',type:'bytes'}],
- resolveDisputeWithCode:[{name:'jobId',type:'uint256'},{name:'code',type:'uint8'}], resolveStaleDispute:[{name:'jobId',type:'uint256'},{name:'employerWins',type:'bool'}],
+ resolveDisputeWithCode:[{name:'jobId',type:'uint256'},{name:'winner',type:'uint8'},{name:'reasonURI',type:'string'}], resolveStaleDispute:[{name:'jobId',type:'uint256'},{name:'employerWins',type:'bool'}],
setJobLabelPrefix:[{name:'prefix',type:'string'}], setENSRegistry:[{name:'registry',type:'address'}], setNameWrapper:[{name:'wrapper',type:'address'}], setPublicResolver:[{name:'resolver',type:'address'}],
setJobsRoot:[{name:'rootNode',type:'bytes32'},{name:'rootName',type:'string'}], setJobManager:[{name:'jobManager',type:'address'}],
lockConfiguration:[],
@@ -10486,10 +10426,10 @@
Operational readiness
}
if(pel('premiumScoreBandExplain')){
const payoutLabel = payout > 0n ? formatUnitsToAmount(payout) : '100000';
- const minReveal = Math.max(1, minRevealsPerFinalist);
- const maxReveal = Math.max(minReveal, maxRevealsPerFinalist);
- const minRevealCount = BigInt(minReveal);
- const maxRevealCount = BigInt(maxReveal);
+ const minReveal = minRevealsPerFinalist;
+ const maxReveal = maxRevealsPerFinalist;
+ const minRevealCount = BigInt(Math.max(1, minReveal));
+ const maxRevealCount = BigInt(Math.max(Number(minRevealCount), maxReveal));
const minPool = validatorReward * minRevealCount;
const maxPool = validatorReward * maxRevealCount;
const minLivenessPool = (minPool * 2000n) / 10000n;
@@ -10530,11 +10470,6 @@
Operational readiness
const validation = premiumValidation(struct);
const allowancesReady = (String(pel('premiumManagerApprovalState')?.textContent || '').trim() === 'Approved')
&& (String(pel('premiumDiscoveryApprovalState')?.textContent || '').trim() === 'Approved');
- const timelineMonotonic = Number(struct.proc.commitDeadline||0) <= Number(struct.proc.revealDeadline||0)
- && Number(struct.proc.revealDeadline||0) <= Number(struct.proc.finalistAcceptDeadline||0)
- && Number(struct.proc.finalistAcceptDeadline||0) <= Number(struct.proc.trialDeadline||0)
- && Number(struct.proc.trialDeadline||0) <= Number(struct.proc.scoreCommitDeadline||0)
- && Number(struct.proc.scoreCommitDeadline||0) <= Number(struct.proc.scoreRevealDeadline||0);
const wizardRail = [
{label:'Step 1 · Choose template', state:'ok', text:`Preset ${premiumState.preset || 'custom'} active.`},
{label:'Step 2 · Metadata + Job Spec URI', state:(String(struct.job.jobSpecURI||'').trim() ? 'ok' : 'warn'), text:(String(struct.job.jobSpecURI||'').trim() ? 'Job Spec URI present.' : 'Provide a Job Spec URI or import from builder.')},
@@ -10827,15 +10762,6 @@
Operational readiness
const attachValidationHtml = `
${valid?'Attach procurement inputs look internally consistent.':'Adjust finalists, reveal counts, weights, and acceptance window before attaching.'}
`; if($('premiumAttachValidationList')) $('premiumAttachValidationList').innerHTML = attachValidationHtml; if($('premiumAttachValidation')) $('premiumAttachValidation').innerHTML = attachValidationHtml;
try{ const allowance = userAccount ? await agiToken.methods.allowance(userAccount, AGI_JOB_DISCOVERY).call() : '0'; if($('premiumAttachAllowanceValue')) $('premiumAttachAllowanceValue').textContent = `${fmtUnits(allowance)} approved`; }catch(e){ if($('premiumAttachAllowanceValue')) $('premiumAttachAllowanceValue').textContent='Allowance unavailable'; }
}
- async function attachApproveDiscovery(amount, label='attach procurement budget'){
- if(!userAccount || !agiToken?.methods) throw new Error('Connect wallet before approving discovery allowance.');
- const amt = BigInt(amount || 0);
- if(amt <= 0n) return;
- await runTrackedTx(`Approve ${label}`, ()=>agiToken.methods.approve(AGI_JOB_DISCOVERY, amt.toString()).send({from:userAccount}), {
- pendingDetail:`Approving ${premiumFormat(amt)} for AGIJobDiscoveryPrime.`,
- successDetail:`Approved ${premiumFormat(amt)} for AGIJobDiscoveryPrime.`
- });
- }
async function inspectAttachJob(){
const jobId=String($('premiumAttachJobId')?.value||'').trim(); if(!jobId||!agiJobManager?.methods) return;
try{
@@ -10872,7 +10798,7 @@
Operational readiness
const jobId=String($('premiumAttachJobId')?.value||'').trim(); if(!jobId) return setToast('Enter a job id before attaching procurement.','warn');
const proc=attachStruct();
const budget=await agiJobDiscovery.methods.quoteProcurementBudget(proc.finalistCount, proc.maxValidatorRevealsPerFinalist, proc.stipendPerFinalist, proc.validatorRewardPerReveal).call();
- openActionReview({title:'Attach procurement to existing job',body:'You are about to call AGIJobDiscoveryPrime.attachProcurementToExistingJob(...) for an existing SelectedAgentOnly job. This funds procurement budget only and preserves the existing settlement escrow posture.',facts:[{label:'Function',value:'attachProcurementToExistingJob'},{label:'Target contract',value:`AGIJobDiscoveryPrime · ${AGI_JOB_DISCOVERY}`},{label:'Existing job id',value:jobId},{label:'Procurement budget only',value:fmtUnits(budget)},{label:'Settlement escrow impact',value:'No new payout escrow is funded by this attach path.'},{label:'ABI-ready tuple',value:`
${escapeHtml(JSON.stringify(proc,null,2))}`,html:true}],checks:[{state:'Eligibility',badge:'warn',text:'The job must still be unassigned and use SelectedAgentOnly intake.'},{state:'Allowance',badge:'warn',text:'Discovery approval may be requested if allowance is below the procurement budget.'}],confirmLabel:'Attach procurement',method:'attachProcurementToExistingJob(jobId,proc)',footer:'On success the procurement inspector will load the new procurement automatically.',run:async()=>{ const allowance = userAccount ? await agiToken.methods.allowance(userAccount, AGI_JOB_DISCOVERY).call() : '0'; if(BigInt(allowance) < BigInt(budget)) await attachApproveDiscovery(BigInt(budget), 'attach procurement budget'); const receipt = await runTrackedTx('Attach procurement', ()=>agiJobDiscovery.methods.attachProcurementToExistingJob(String(jobId), proc).send({from:userAccount}), {pendingDetail:'Attaching discovery procurement to the existing job.', successDetail:'Procurement attached successfully.'}); const evt = receipt?.events?.ProcurementCreated?.returnValues || Object.values(receipt?.events||{}).find(ev=>ev?.event==='ProcurementCreated')?.returnValues; const procurementId = evt?.procurementId ?? ''; if($('premiumAttachResult')) $('premiumAttachResult').textContent = `Procurement attached. procurementId ${procurementId || 'unknown'} for job ${jobId}.`; if(procurementId){ if($('premiumInspectorProcurementId')) $('premiumInspectorProcurementId').value=String(procurementId); if($('premiumClaimsProcurementId')) $('premiumClaimsProcurementId').value=String(procurementId); if($('premiumDiscoveryApplicationInspectProcurementId')) $('premiumDiscoveryApplicationInspectProcurementId').value=String(procurementId); setPanel('inspect'); await loadProcurement(procurementId); } }});
+ openActionReview({title:'Attach procurement to existing job',body:'You are about to call AGIJobDiscoveryPrime.attachProcurementToExistingJob(...) for an existing SelectedAgentOnly job. This funds procurement budget only and preserves the existing settlement escrow posture.',facts:[{label:'Function',value:'attachProcurementToExistingJob'},{label:'Target contract',value:`AGIJobDiscoveryPrime · ${AGI_JOB_DISCOVERY}`},{label:'Existing job id',value:jobId},{label:'Procurement budget only',value:fmtUnits(budget)},{label:'Settlement escrow impact',value:'No new payout escrow is funded by this attach path.'},{label:'ABI-ready tuple',value:`
${escapeHtml(JSON.stringify(proc,null,2))}`,html:true}],checks:[{state:'Eligibility',badge:'warn',text:'The job must still be unassigned and use SelectedAgentOnly intake.'},{state:'Allowance',badge:'warn',text:'Discovery approval may be requested if allowance is below the procurement budget.'}],confirmLabel:'Attach procurement',method:'attachProcurementToExistingJob(jobId,proc)',footer:'On success the procurement inspector will load the new procurement automatically.',run:async()=>{ const allowance = userAccount ? await agiToken.methods.allowance(userAccount, AGI_JOB_DISCOVERY).call() : '0'; if(BigInt(allowance) < BigInt(budget)) await premiumApprove(AGI_JOB_DISCOVERY, BigInt(budget), 'attach procurement budget'); const receipt = await runTrackedTx('Attach procurement', ()=>agiJobDiscovery.methods.attachProcurementToExistingJob(String(jobId), proc).send({from:userAccount}), {pendingDetail:'Attaching discovery procurement to the existing job.', successDetail:'Procurement attached successfully.'}); const evt = receipt?.events?.ProcurementCreated?.returnValues || Object.values(receipt?.events||{}).find(ev=>ev?.event==='ProcurementCreated')?.returnValues; const procurementId = evt?.procurementId ?? ''; if($('premiumAttachResult')) $('premiumAttachResult').textContent = `Procurement attached. procurementId ${procurementId || 'unknown'} for job ${jobId}.`; if(procurementId){ if($('premiumInspectorProcurementId')) $('premiumInspectorProcurementId').value=String(procurementId); if($('premiumClaimsProcurementId')) $('premiumClaimsProcurementId').value=String(procurementId); if($('premiumDiscoveryApplicationInspectProcurementId')) $('premiumDiscoveryApplicationInspectProcurementId').value=String(procurementId); setPanel('inspect'); await loadProcurement(procurementId); } }});
}
let premiumProcurementLoadRequestId = 0;
async function loadProcurement(id){
@@ -10929,13 +10855,13 @@
Operational readiness
if($('premiumInspectorDeadlines')) $('premiumInspectorDeadlines').innerHTML = `Commit ${humanTs(proc.commitDeadline)}
Reveal ${humanTs(proc.revealDeadline)}
Finalist accept ${humanTs(proc.finalistAcceptDeadline)}
Trial ${humanTs(proc.trialDeadline)}
Score commit ${humanTs(proc.scoreCommitDeadline)}
Score reveal ${humanTs(proc.scoreRevealDeadline)}
Selected acceptance window ${secondsToHuman(proc.selectedAcceptanceWindow)} · Checkpoint ${secondsToHuman(proc.checkpointWindow)}`;
if($('premiumInspectorApplicants')) $('premiumInspectorApplicants').innerHTML = applicants.length ? applicants.map(a=>`
${escapeHtml(a)}`).join('
') : 'No applicants loaded.';
if($('premiumInspectorFinalists')) $('premiumInspectorFinalists').innerHTML = finalists.length ? finalists.map(a=>`
${escapeHtml(a)}`).join('
') : 'No finalists yet.';
- populateValidatorFinalistSelector(finalists);
if($('premiumInspectorRaw')) $('premiumInspectorRaw').textContent = JSON.stringify({procurementId:pid, proc, applicants, finalists, nextCode, shortlistOk, winnerOk, fallbackOk}, null, 2); if($('premiumInspectorProcurementStruct')) $('premiumInspectorProcurementStruct').textContent = JSON.stringify({procurementId:pid, proc, applicants, finalists, nextCode, shortlistOk, winnerOk, fallbackOk}, null, 2);
if($('procurementCommitId')) $('procurementCommitId').value = pid;
if($('scoreCommitProcurementId')) $('scoreCommitProcurementId').value = pid;
if($('premiumClaimsProcurementId')) $('premiumClaimsProcurementId').value = pid; if($('premiumDiscoveryApplicationInspectProcurementId')) $('premiumDiscoveryApplicationInspectProcurementId').value = pid;
if($('premiumActionProcurementId')) $('premiumActionProcurementId').value = pid;
- updateParticipateStudio(proc, requestId).catch(()=>{});
+ if($('premiumParticipateProcurementId')) $('premiumParticipateProcurementId').value = pid;
+ refreshParticipate().catch(()=>{});
}catch(err){ if(requestId !== premiumProcurementLoadRequestId) return; if($('premiumInspectorResult')) $('premiumInspectorResult').textContent = `Inspector load failed: ${err.message||err}`; }
}
async function loadInspectorByJob(){ const jobId=String($('premiumInspectorJobId')?.value||'').trim(); if(!jobId) return; const has=await agiJobDiscovery.methods.hasProcurementByJobId(jobId).call().catch(()=>false); const pid=has ? await agiJobDiscovery.methods.procurementByJobId(jobId).call().catch(()=> '') : ''; if($('premiumInspectorProcurementId')) $('premiumInspectorProcurementId').value=String(pid||''); if(pid) await loadProcurement(pid); else if($('premiumInspectorResult')) $('premiumInspectorResult').textContent = `No procurement found for job ${jobId}.`; }
@@ -10967,144 +10893,75 @@
Operational readiness
}
});
}
- function normalizeSubdomainLabel(raw){
- const s = String(raw||'').trim().toLowerCase();
- if(!s) return '';
- if(!s.includes('.')) return s;
- const cleaned = s.replace(/\.eth$/,'');
- const parts = cleaned.split('.').filter(Boolean);
- return parts[0] || '';
- }
- function activeParticipateRole(){
- return $('premiumParticipateRoleTabs')?.querySelector('[data-participate-role].active')?.getAttribute('data-participate-role') || 'applicant';
- }
- function actionInputs(){
- const finalistText = String($('premiumActionFinalist')?.value || '').trim();
- const finalistSelect = String($('premiumActionFinalistSelect')?.value || '').trim();
- const role = activeParticipateRole();
- const finalist = role === 'validator' ? (finalistSelect || finalistText) : (finalistText || finalistSelect);
- return {pid:String($('premiumActionProcurementId')?.value||'').trim(), subdomain:normalizeSubdomainLabel($('premiumActionSubdomain')?.value), proof:parseProof($('premiumActionProof')?.value), commitment:String($('premiumActionCommitment')?.value||'').trim(), salt:String($('premiumActionSalt')?.value||'').trim(), uri:String($('premiumActionApplicationUri')?.value||'').trim(), finalist, score:String($('premiumActionScore')?.value||'').trim()};
+ function actionInputs(){ return {pid:String($('premiumActionProcurementId')?.value||$('premiumParticipateProcurementId')?.value||'').trim(), subdomain:String($('premiumActionSubdomain')?.value||'').trim(), proof:parseProof($('premiumActionProof')?.value), commitment:String($('premiumActionCommitment')?.value||'').trim(), salt:String($('premiumActionSalt')?.value||'').trim(), uri:String($('premiumActionApplicationUri')?.value||'').trim(), finalist:String($('premiumActionFinalist')?.value||'').trim(), score:String($('premiumActionScore')?.value||'').trim()}; }
+ function normalizeSubdomain(raw){
+ const value = String(raw||'').trim().toLowerCase();
+ if(!value) return {ok:false, label:'', reason:'Enter a label like alice or alice.agent.agi.eth.'};
+ let label=value;
+ if(value.endsWith('.alpha.agent.agi.eth')) label = value.replace('.alpha.agent.agi.eth','');
+ else if(value.endsWith('.agent.agi.eth')) label = value.replace('.agent.agi.eth','');
+ if(!/^[a-z0-9-]{1,63}$/.test(label)) return {ok:false, label, reason:'Use lower-case letters, numbers, and hyphen only.'};
+ return {ok:true, label, reason:'Normalized to bare label for contract call.'};
+ }
+ function setRole(role){
+ document.querySelectorAll('.premiumRoleChip').forEach(btn=>btn.classList.toggle('active', btn.dataset.premiumRole===role));
+ const map={applicant:'premiumApplicantRail',finalist:'premiumFinalistRail',validator:'premiumValidatorRail',claimant:'premiumClaimantRail'};
+ Object.entries(map).forEach(([k,id])=>{ const el=$(id); if(el) el.hidden = k!==role; });
+ }
+ async function refreshParticipate(){
+ const pid=String($('premiumParticipateProcurementId')?.value||'').trim();
+ if($('premiumActionProcurementId')) $('premiumActionProcurementId').value = pid;
+ const norm = normalizeSubdomain($('premiumParticipateSubdomain')?.value);
+ if($('premiumActionSubdomain')) $('premiumActionSubdomain').value = norm.ok ? norm.label : '';
+ if($('premiumParticipateAuth')) $('premiumParticipateAuth').textContent = norm.ok ? `Needs on-chain check · ${norm.label}` : 'Likely wrong label';
+ if($('premiumParticipateAuthMeta')) $('premiumParticipateAuthMeta').textContent = norm.reason;
+ if($('premiumParticipateWallet')) $('premiumParticipateWallet').textContent = userAccount ? `${userAccount.slice(0,6)}…${userAccount.slice(-4)}${isMainnet?' · mainnet':' · wrong network'}` : 'Wallet not connected';
+ if($('premiumParticipateWalletReady')) $('premiumParticipateWalletReady').textContent = (userAccount && isMainnet) ? 'Write-ready posture available after preflight checks.' : 'Connect wallet on Ethereum mainnet.';
+ if(!pid || !agiJobDiscovery?.methods) return;
+ try{
+ const [proc, penalty, rep, hist] = await Promise.all([
+ agiJobDiscovery.methods.procurements(pid).call(),
+ userAccount ? agiJobDiscovery.methods.previewDiscoveryPenaltyBps(userAccount).call().catch(()=>'0') : Promise.resolve('0'),
+ userAccount ? agiJobDiscovery.methods.reputation(userAccount).call().catch(()=>'0') : Promise.resolve('0'),
+ userAccount ? agiJobDiscovery.methods.previewHistoricalScore(userAccount).call().catch(()=>'0') : Promise.resolve('0')
+ ]);
+ const now = Math.floor(Date.now()/1000);
+ const paused = await agiJobDiscovery.methods.paused().call().catch(()=>false);
+ const pauseStartedAt = Number(await agiJobDiscovery.methods.pauseStartedAt().call().catch(()=>0));
+ const pausedAccum = Number(await agiJobDiscovery.methods.pausedSecondsAccumulated().call().catch(()=>0));
+ const pausedNow = paused ? (pausedAccum + Math.max(0, now - pauseStartedAt)) : pausedAccum;
+ const baseline = Number(proc.pauseSecondsBaseline||0);
+ const effectiveNow = now - Math.max(0, pausedNow - baseline);
+ const commit = Number(proc.commitDeadline||0), reveal=Number(proc.revealDeadline||0);
+ const phase = effectiveNow<=commit ? 'Commit window' : (effectiveNow<=reveal ? 'Reveal window' : 'Post reveal');
+ if($('premiumParticipatePhase')) $('premiumParticipatePhase').textContent = `${phase} · nextAction ${String(await agiJobDiscovery.methods.nextActionForProcurement(pid).call().catch(()=>'' )||'—')}`;
+ if($('premiumParticipateCountdown')) $('premiumParticipateCountdown').textContent = `effectiveNow ${effectiveNow} | commit ${commit} | reveal ${reveal} (pause-adjusted).`;
+ if($('premiumParticipateReputation')) $('premiumParticipateReputation').textContent = `Wallet ${rep} vs required ${proc.minReputation||'0'}`;
+ const effectiveScore = Math.max(0, Number(hist)-Number(penalty));
+ if($('premiumParticipateReputationMeta')) $('premiumParticipateReputationMeta').textContent = `Live procurement requires reputation ${proc.minReputation||'0'}. Historical ${hist} - penalty ${penalty} = shortlist preview ${effectiveScore}.`;
+ if($('premiumParticipateAllowance')) $('premiumParticipateAllowance').textContent = `Applicant stake ${fmtUnits(proc.applicationStake||0)} · Finalist total ${fmtUnits(proc.finalistStakeTotal||0)} · Validator bond ${fmtUnits(proc.validatorScoreBond||0)}`;
+ if($('premiumParticipateAllowanceMeta')) $('premiumParticipateAllowanceMeta').textContent = 'Allowance cockpit updates by selected role. Approve only what is needed.';
+ const finalists = await agiJobDiscovery.methods.procurementFinalists(pid).call().catch(()=>[]);
+ if($('premiumParticipateFinalistList')) $('premiumParticipateFinalistList').innerHTML = finalists.length ? finalists.map(a=>`
`).join('') : 'No finalist list loaded yet.';
+ document.querySelectorAll('#premiumParticipateFinalistList [data-finalist]').forEach(btn=>btn.addEventListener('click',()=>{ if($('premiumActionFinalist')) $('premiumActionFinalist').value = btn.dataset.finalist || ''; }));
+ }catch(e){}
}
function setCommitmentHelper(message){ if($('premiumActionCommitmentHelper')) $('premiumActionCommitmentHelper').textContent = message; }
- function randomSalt(){
- const bytes = new Uint8Array(32);
- crypto.getRandomValues(bytes);
- return '0x' + [...bytes].map(b=>b.toString(16).padStart(2,'0')).join('');
- }
- function computeEffectiveNow(proc, discoveryMeta){
- const now = Math.floor(Date.now()/1000);
- const paused = !!(discoveryMeta?.paused);
- const pausedAccum = Number(discoveryMeta?.pausedSecondsAccumulated || 0);
- const pauseStartedAt = Number(discoveryMeta?.pauseStartedAt || 0);
- const pausedSecondsNow = paused ? (pausedAccum + Math.max(0, now - pauseStartedAt)) : pausedAccum;
- const baseline = Number(proc?.pauseSecondsBaseline || 0);
- return now - (pausedSecondsNow - baseline);
- }
- function loadLocalPacket(key){
- try{ return JSON.parse(localStorage.getItem(key) || 'null'); }catch(_){ return null; }
- }
- function saveLocalPacket(key, payload){
- localStorage.setItem(key, JSON.stringify(payload));
- }
- function downloadPacket(filename, payload){
- const blob = new Blob([JSON.stringify(payload,null,2)], {type:'application/json'});
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url; a.download = filename; a.click();
- URL.revokeObjectURL(url);
- }
- function setParticipateSuccess(msg){
- if($('premiumParticipateSuccess')) $('premiumParticipateSuccess').innerHTML = msg;
- }
- function populateValidatorFinalistSelector(finalists=[]){
- const sel = $('premiumActionFinalistSelect');
- if(!sel) return;
- const list = Array.isArray(finalists) ? finalists.filter(Boolean) : [];
- const prior = String(sel.value || '').toLowerCase();
- sel.innerHTML = '';
- const placeholder = document.createElement('option');
- placeholder.value = '';
- placeholder.textContent = list.length ? 'Select finalist address' : 'No finalists loaded yet';
- sel.appendChild(placeholder);
- list.forEach(addr=>{
- const opt = document.createElement('option');
- opt.value = addr;
- opt.textContent = addr;
- sel.appendChild(opt);
- });
- if(prior && list.some(x=>String(x).toLowerCase()===prior)) sel.value = list.find(x=>String(x).toLowerCase()===prior) || '';
- if($('premiumActionFinalist')) $('premiumActionFinalist').value = String(sel.value || '').trim();
- }
- async function updateParticipateStudio(proc, requestId=null){
- if(!proc) return;
- const isLatest = ()=> requestId == null || requestId === premiumProcurementLoadRequestId;
- if(!isLatest()) return;
- const pid = String($('premiumActionProcurementId')?.value || '');
- if(!isLatest()) return;
- if($('premiumParticipateProcurement')) $('premiumParticipateProcurement').textContent = `Procurement ${pid || '—'} · employer ${proc.employer || '—'}`;
- const discoveryStateMethod = agiJobDiscovery?.methods?.discoveryState;
- const meta = discoveryStateMethod ? await discoveryStateMethod().call().catch(()=>null) : null;
- if(!isLatest()) return;
- const effectiveNow = computeEffectiveNow(proc, meta);
- const phase = effectiveNow <= Number(proc.commitDeadline) ? 'Commit applications' : (effectiveNow <= Number(proc.revealDeadline) ? 'Reveal applications' : (effectiveNow <= Number(proc.finalistAcceptDeadline) ? 'Finalist acceptance' : (effectiveNow <= Number(proc.trialDeadline) ? 'Trial submission' : (effectiveNow <= Number(proc.scoreCommitDeadline) ? 'Validator score commit' : (effectiveNow <= Number(proc.scoreRevealDeadline) ? 'Validator score reveal' : 'Post-score / finalization')))));
- if(!isLatest()) return;
- if($('premiumParticipatePhase')) $('premiumParticipatePhase').textContent = phase;
- const nextTs = [proc.commitDeadline,proc.revealDeadline,proc.finalistAcceptDeadline,proc.trialDeadline,proc.scoreCommitDeadline,proc.scoreRevealDeadline].map(Number).find(t=>effectiveNow<=t) || Number(proc.scoreRevealDeadline);
- if($('premiumParticipateCountdown')) $('premiumParticipateCountdown').textContent = `effectiveNow ${effectiveNow} · next deadline ${humanTs(nextTs)} (pause-adjusted).`;
- if($('premiumApplicantMinRep')) $('premiumApplicantMinRep').textContent = `This live procurement currently requires reputation ${proc.minReputation}.`;
- const rep = userAccount ? await (agiJobManager.methods.reputation?.(userAccount)?.call?.().catch(()=>null) || agiJobManager.methods.reputationOf?.(userAccount)?.call?.().catch(()=>null) || Promise.resolve('0')) : '0';
- if(!isLatest()) return;
- if($('premiumApplicantRep')) $('premiumApplicantRep').textContent = `Wallet reputation ${rep} · ${BigInt(rep||0) >= BigInt(proc.minReputation||0) ? 'Pass' : 'Below requirement'}.`;
- const required = BigInt(proc.applicationStake || 0);
- const bal = userAccount ? BigInt(await agiToken.methods.balanceOf(userAccount).call().catch(()=> '0')) : 0n;
- const allow = userAccount ? BigInt(await agiToken.methods.allowance(userAccount, AGI_JOB_DISCOVERY).call().catch(()=> '0')) : 0n;
- if(!isLatest()) return;
- const short = required > allow ? required - allow : 0n;
- if($('premiumApplicantAllowance')) $('premiumApplicantAllowance').textContent = `Required ${fmtUnits(required)} · balance ${fmtUnits(bal)} · allowance ${fmtUnits(allow)}.`;
- if($('premiumApplicantAllowanceHint')) $('premiumApplicantAllowanceHint').textContent = short>0n ? `Allowance shortfall ${fmtUnits(short)}. Approve to AGIJobDiscoveryPrime before commit.` : (required===0n ? 'applicationStake is zero for this procurement.' : 'Allowance posture is sufficient for commit.');
- const validatorRequired = BigInt(proc.validatorScoreBond || 0);
- if($('premiumValidatorAllowance')) $('premiumValidatorAllowance').textContent = `Validator score bond ${fmtUnits(validatorRequired)} · allowance ${fmtUnits(allow)}.`;
- }
function generateApplicationCommitment(){
const {pid, uri, salt} = actionInputs();
const applicant = String(userAccount || '').trim();
if(!web3?.utils?.soliditySha3 || !applicant || !pid || !uri || !salt){ setCommitmentHelper('Application commitment needs connected wallet, procurement id, application URI, and salt.'); return; }
$('premiumActionCommitment').value = web3.utils.soliditySha3({type:'uint256',value:pid},{type:'address',value:applicant},{type:'string',value:uri},{type:'bytes32',value:salt}) || '';
- setCommitmentHelper(`Application commitment generated locally for wallet ${applicant}. This is not on-chain yet.`); }
+ setCommitmentHelper(`Application commitment generated locally for wallet ${applicant}. It stays local until you submit commitApplication.`); }
function generateScoreCommitment(){
const {pid, finalist, salt, score} = actionInputs();
const validator = String(userAccount || '').trim();
const scoreNum = Number(score);
if(!web3?.utils?.soliditySha3 || !validator || !pid || !finalist || !salt || score==='' || !Number.isFinite(scoreNum) || scoreNum < 0 || scoreNum > 100){ setCommitmentHelper('Score commitment needs connected wallet, procurement id, finalist, score 0-100, and salt.'); return; }
$('premiumActionCommitment').value = web3.utils.soliditySha3({type:'uint256',value:pid},{type:'address',value:finalist},{type:'address',value:validator},{type:'uint8',value:scoreNum},{type:'bytes32',value:salt}) || '';
+ if($('premiumActionCommitmentScore')) $('premiumActionCommitmentScore').value = $('premiumActionCommitment').value;
setCommitmentHelper(`Score commitment generated locally for validator ${validator}. It stays local until you submit commitFinalistScore.`); }
function bind(){
- $('premiumGoParticipateBtn')?.addEventListener('click', ()=>setPanel('participate'));
- $('premiumParticipatePrefillFromInspectorBtn')?.addEventListener('click', ()=>{
- const pid = $('premiumInspectorProcurementId')?.value || '';
- if($('premiumActionProcurementId')) $('premiumActionProcurementId').value = pid;
- if($('premiumActionFinalist')) $('premiumActionFinalist').value = $('premiumInspectorApplicationAgent')?.value || '';
- });
- $('premiumParticipateNormalizeSubdomainBtn')?.addEventListener('click', ()=>{
- if($('premiumActionSubdomain')) $('premiumActionSubdomain').value = normalizeSubdomainLabel($('premiumActionSubdomain')?.value);
- });
- $('premiumActionGenerateSaltBtn')?.addEventListener('click', ()=>{ if($('premiumActionSalt')) $('premiumActionSalt').value = randomSalt(); setCommitmentHelper('Secure local salt generated with crypto.getRandomValues. Losing the salt makes reveal impossible.'); });
- $('premiumActionFinalistSelect')?.addEventListener('change', ()=>{ if($('premiumActionFinalist')) $('premiumActionFinalist').value = $('premiumActionFinalistSelect')?.value || ''; });
- $('premiumParticipateRoleTabs')?.querySelectorAll('[data-participate-role]').forEach(btn=>btn.addEventListener('click', ()=>{
- const role = btn.getAttribute('data-participate-role');
- $('premiumParticipateRoleTabs')?.querySelectorAll('[data-participate-role]').forEach(b=>b.classList.toggle('active', b===btn));
- document.querySelectorAll('[data-participate-panel]').forEach(panel=>{ panel.style.display = panel.getAttribute('data-participate-panel')===role ? '' : 'none'; });
- if(role === 'validator'){
- const selected = String($('premiumActionFinalistSelect')?.value || '').trim();
- if($('premiumActionFinalist')) $('premiumActionFinalist').value = selected;
- }
- }));
- $('premiumApplicantPacketSaveBtn')?.addEventListener('click', ()=>{ const x = actionInputs(); const packet = {schemaVersion:'2026-04-02-applicant', procurementId:x.pid, applicant:userAccount||'', normalizedSubdomain:x.subdomain, proofRouteSummary:x.proof?.length?'Merkle/additional':'ENS-first', applicationURI:x.uri, salt:x.salt, commitment:x.commitment, createdAt:new Date().toISOString()}; saveLocalPacket('premiumApplicantPacket', packet); setToast('Applicant packet saved locally.', 'ok'); });
- $('premiumApplicantPacketDownloadBtn')?.addEventListener('click', ()=>{ const p = loadLocalPacket('premiumApplicantPacket'); if(!p) return setToast('No local applicant packet saved yet.', 'warn'); downloadPacket(`applicant_packet_${p.procurementId||'draft'}.json`, p); });
- $('premiumApplicantPacketImportBtn')?.addEventListener('click', ()=>{ const input=document.createElement('input'); input.type='file'; input.accept='application/json'; input.onchange=async()=>{ const f=input.files?.[0]; if(!f) return; const t=await f.text(); const p=JSON.parse(t); if($('premiumActionProcurementId')) $('premiumActionProcurementId').value=String(p.procurementId||''); if($('premiumActionSubdomain')) $('premiumActionSubdomain').value=String(p.normalizedSubdomain||''); if($('premiumActionApplicationUri')) $('premiumActionApplicationUri').value=String(p.applicationURI||''); if($('premiumActionSalt')) $('premiumActionSalt').value=String(p.salt||''); if($('premiumActionCommitment')) $('premiumActionCommitment').value=String(p.commitment||''); saveLocalPacket('premiumApplicantPacket', p); setToast('Applicant packet imported locally.', 'ok'); }; input.click(); });
- $('premiumValidatorPacketSaveBtn')?.addEventListener('click', ()=>{ const x = actionInputs(); const packet = {schemaVersion:'2026-04-02-validator', procurementId:x.pid, finalist:x.finalist, validator:userAccount||'', normalizedSubdomain:x.subdomain, proofRouteSummary:x.proof?.length?'Merkle/additional':'ENS-first', score:x.score, salt:x.salt, commitment:x.commitment, createdAt:new Date().toISOString()}; saveLocalPacket('premiumValidatorPacket', packet); setToast('Validator packet saved locally.', 'ok'); });
- $('premiumValidatorPacketDownloadBtn')?.addEventListener('click', ()=>{ const p = loadLocalPacket('premiumValidatorPacket'); if(!p) return setToast('No local validator packet saved yet.', 'warn'); downloadPacket(`validator_packet_${p.procurementId||'draft'}.json`, p); });
- $('premiumValidatorPacketImportBtn')?.addEventListener('click', ()=>{ const input=document.createElement('input'); input.type='file'; input.accept='application/json'; input.onchange=async()=>{ const f=input.files?.[0]; if(!f) return; const t=await f.text(); const p=JSON.parse(t); if($('premiumActionProcurementId')) $('premiumActionProcurementId').value=String(p.procurementId||''); if($('premiumActionSubdomain')) $('premiumActionSubdomain').value=String(p.normalizedSubdomain||''); if($('premiumActionFinalist')) $('premiumActionFinalist').value=String(p.finalist||''); if($('premiumActionScore')) $('premiumActionScore').value=String(p.score||''); if($('premiumActionSalt')) $('premiumActionSalt').value=String(p.salt||''); if($('premiumActionCommitment')) $('premiumActionCommitment').value=String(p.commitment||''); saveLocalPacket('premiumValidatorPacket', p); setToast('Validator packet imported locally.', 'ok'); }; input.click(); });
$('premiumAttachUseRecommendedBtn')?.addEventListener('click', useBalancedAttach);
const mirrorAttachFromCreate = ()=>{ attachIds.forEach(id=>{ const a=$("premiumAttach"+id); const b=$("premiumDiscovery"+id); if(a&&b&&b.value!=='') a.value=b.value; }); refreshAttachPreview(); };
$('premiumAttachImportFromCreateBtn')?.addEventListener('click', mirrorAttachFromCreate);
@@ -11112,25 +10969,51 @@
Operational readiness
['premiumAttachJobId',...attachIds.map(x=>'premiumAttach'+x)].forEach(id=>$(id)?.addEventListener('input', refreshAttachPreview));
$('premiumAttachInspectJobBtn')?.addEventListener('click', ()=>inspectAttachJob().catch(e=>setToast(e.message||String(e),'bad')));
$('premiumAttachRefreshAllowanceBtn')?.addEventListener('click', ()=>refreshAttachPreview().catch(e=>setToast(e.message||String(e),'bad')));
- $('premiumAttachApproveBtn')?.addEventListener('click', async ()=>{ const proc=attachStruct(); const budget=await agiJobDiscovery.methods.quoteProcurementBudget(proc.finalistCount, proc.maxValidatorRevealsPerFinalist, proc.stipendPerFinalist, proc.validatorRewardPerReveal).call(); await attachApproveDiscovery(BigInt(budget), 'attach procurement budget'); await refreshAttachPreview(); });
+ $('premiumAttachApproveBtn')?.addEventListener('click', async ()=>{ const proc=attachStruct(); const budget=await agiJobDiscovery.methods.quoteProcurementBudget(proc.finalistCount, proc.maxValidatorRevealsPerFinalist, proc.stipendPerFinalist, proc.validatorRewardPerReveal).call(); await premiumApprove(AGI_JOB_DISCOVERY, BigInt(budget), 'attach procurement budget'); await refreshAttachPreview(); });
$('premiumAttachSubmitBtn')?.addEventListener('click', ()=>reviewAttach().catch(e=>setToast(e.message||String(e),'bad')));
$('premiumInspectorLoadBtn')?.addEventListener('click', ()=>loadProcurement().catch(e=>setToast(e.message||String(e),'bad')));
$('premiumInspectorResolveBtn')?.addEventListener('click', ()=>loadInspectorByJob().catch(e=>setToast(e.message||String(e),'bad')));
$('premiumClaimsRefreshBtn')?.addEventListener('click', ()=>loadClaims().catch(e=>setToast(e.message||String(e),'bad')));
$('premiumParticipateClaimsRefreshBtn')?.addEventListener('click', ()=>loadClaims().catch(e=>setToast(e.message||String(e),'bad')));
- $('premiumClaimBtn')?.addEventListener('click', ()=>reviewClaim().catch(e=>setToast(e.message||String(e),'bad'))); $('premiumDiscoveryClaimBtn')?.addEventListener('click', ()=>reviewClaim().catch(e=>setToast(e.message||String(e),'bad'))); $('premiumParticipateDiscoveryClaimBtn')?.addEventListener('click', ()=>reviewClaim().catch(e=>setToast(e.message||String(e),'bad')));
+ $('premiumClaimBtn')?.addEventListener('click', ()=>reviewClaim().catch(e=>setToast(e.message||String(e),'bad'))); $('premiumDiscoveryClaimBtn')?.addEventListener('click', ()=>reviewClaim().catch(e=>setToast(e.message||String(e),'bad')));
+ $('premiumParticipateClaimBtn')?.addEventListener('click', ()=>reviewClaim().catch(e=>setToast(e.message||String(e),'bad')));
$('premiumClaimsLoadApplicationBtn')?.addEventListener('click', ()=>loadApplicationView($('premiumClaimsProcurementId')?.value, $('premiumClaimsAgent')?.value, 'premiumClaimsApplicationView')); $('premiumDiscoveryApplicationInspectBtn')?.addEventListener('click', ()=>loadApplicationView($('premiumDiscoveryApplicationInspectProcurementId')?.value, $('premiumDiscoveryApplicationInspectAgent')?.value, 'premiumDiscoveryApplicationInspectResult'));
- $('premiumInspectorLoadApplicationBtn')?.addEventListener('click', ()=>loadApplicationView($('premiumInspectorProcurementId')?.value, ($('premiumInspectorAgentAddress')?.value || $('premiumInspectorApplicationAgent')?.value), 'premiumInspectorApplicationView')); $('premiumOpenActionsBtn')?.addEventListener('click', ()=>setPanel('participate'));
+ $('premiumInspectorLoadApplicationBtn')?.addEventListener('click', ()=>loadApplicationView($('premiumInspectorProcurementId')?.value, ($('premiumInspectorAgentAddress')?.value || $('premiumInspectorApplicationAgent')?.value), 'premiumInspectorApplicationView'));
+ $('premiumOpenActionsBtn')?.addEventListener('click', ()=>setPanel('participate'));
+ document.querySelectorAll('[data-premium-role-action]').forEach(btn=>btn.addEventListener('click', ()=>{
+ const pid = String($('premiumInspectorProcurementId')?.value || '');
+ if($('premiumParticipateProcurementId')) $('premiumParticipateProcurementId').value = pid;
+ if($('premiumActionProcurementId')) $('premiumActionProcurementId').value = pid;
+ setPanel('participate');
+ refreshParticipate().catch(()=>{});
+ }));
+ $('premiumParticipateLoadBtn')?.addEventListener('click', ()=>refreshParticipate());
+ $('premiumParticipateUseInspectorBtn')?.addEventListener('click', ()=>{ if($('premiumParticipateProcurementId')) $('premiumParticipateProcurementId').value=String($('premiumInspectorProcurementId')?.value||''); refreshParticipate(); });
+ $('premiumParticipateUseFixtureBtn')?.addEventListener('click', ()=>{ if($('premiumParticipateProcurementId')) $('premiumParticipateProcurementId').value='0'; refreshParticipate(); });
+ $('premiumParticipateGenerateSaltBtn')?.addEventListener('click', ()=>{ const bytes = new Uint8Array(32); crypto.getRandomValues(bytes); if($('premiumActionSalt')) $('premiumActionSalt').value = '0x'+Array.from(bytes,b=>b.toString(16).padStart(2,'0')).join(''); generateApplicationCommitment(); });
+ $('premiumParticipateGenerateScoreSaltBtn')?.addEventListener('click', ()=>{ const bytes = new Uint8Array(32); crypto.getRandomValues(bytes); if($('premiumActionSalt')) $('premiumActionSalt').value = '0x'+Array.from(bytes,b=>b.toString(16).padStart(2,'0')).join(''); generateScoreCommitment(); });
+ $('premiumActionApplicationUriFinalist')?.addEventListener('input', ()=>{ if($('premiumActionApplicationUri')) $('premiumActionApplicationUri').value = $('premiumActionApplicationUriFinalist').value; });
+ $('premiumParticipateSubdomain')?.addEventListener('input', refreshParticipate);
+ $('premiumParticipateProcurementId')?.addEventListener('input', refreshParticipate);
+ document.querySelectorAll('.premiumRoleChip').forEach(btn=>btn.addEventListener('click', ()=>setRole(btn.dataset.premiumRole||'applicant')));
+ const savePacket = ()=>{ const x=actionInputs(); const packet={schemaVersion:'2026-04-02',procurementId:x.pid,wallet:userAccount||'',subdomain:x.subdomain,proofMode:x.proof?.length?'proof':'ens',proof:x.proof||[],applicationURI:x.uri,salt:x.salt,commitment:x.commitment,createdAt:new Date().toISOString(),commitDeadline:null,revealDeadline:null,status:'Local packet only'}; localStorage.setItem(`agijob.packet.${x.pid}.${(userAccount||'').toLowerCase()}`, JSON.stringify(packet)); if($('premiumParticipatePacketState')) $('premiumParticipatePacketState').textContent='Local packet only'; if($('premiumParticipatePacketMeta')) $('premiumParticipatePacketMeta').textContent='Saved locally in this browser. Not on-chain yet.'; };
+ $('premiumParticipateSavePacketBtn')?.addEventListener('click', savePacket);
+ $('premiumParticipateDownloadPacketBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); const key=`agijob.packet.${x.pid}.${(userAccount||'').toLowerCase()}`; const payload=localStorage.getItem(key); if(!payload) return setToast('No local packet saved yet.','warn'); const blob=new Blob([payload],{type:'application/json'}); const a=document.createElement('a'); a.href=URL.createObjectURL(blob); a.download=`agijob-packet-${x.pid||'unknown'}.json`; a.click(); setTimeout(()=>URL.revokeObjectURL(a.href),500); });
+ $('premiumParticipateImportPacketBtn')?.addEventListener('click', ()=>{ const el=document.createElement('input'); el.type='file'; el.accept='application/json'; el.onchange=async()=>{ const file=el.files?.[0]; if(!file) return; const text=await file.text(); const pkt=JSON.parse(text); if($('premiumParticipateProcurementId')) $('premiumParticipateProcurementId').value=String(pkt.procurementId||''); if($('premiumActionProcurementId')) $('premiumActionProcurementId').value=String(pkt.procurementId||''); if($('premiumParticipateSubdomain')) $('premiumParticipateSubdomain').value=String(pkt.subdomain||''); if($('premiumActionApplicationUri')) $('premiumActionApplicationUri').value=String(pkt.applicationURI||''); if($('premiumActionSalt')) $('premiumActionSalt').value=String(pkt.salt||''); if($('premiumActionCommitment')) $('premiumActionCommitment').value=String(pkt.commitment||''); if($('premiumActionProof')) $('premiumActionProof').value=JSON.stringify(pkt.proof||[]); refreshParticipate(); }; el.click(); });
+ $('premiumParticipateOpenRevealModeBtn')?.addEventListener('click', ()=>{ setRole('applicant'); setToast('Reveal mode: verify stored commitment hash then submit reveal with exact URI + salt.','ok'); });
+ [['premiumParticipateJumpApplicantBtn','applicant'],['premiumParticipateJumpRevealBtn','applicant'],['premiumParticipateJumpFinalistBtn','finalist'],['premiumParticipateJumpValidatorBtn','validator'],['premiumParticipateJumpClaimBtn','claimant'],['premiumClaimsGoParticipateApplicant','applicant'],['premiumClaimsGoParticipateValidator','validator'],['premiumClaimsGoParticipateClaimant','claimant']].forEach(([id,role])=>$(id)?.addEventListener('click',()=>{ setPanel('participate'); setRole(role); if($('premiumParticipateProcurementId') && $('premiumInspectorProcurementId')) $('premiumParticipateProcurementId').value=String($('premiumInspectorProcurementId').value||''); refreshParticipate(); }));
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')); }));
- $('premiumActionCommitApplicationBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.commitment) return setToast('Enter procurement id and commitment.','warn'); reviewDiscoveryWrite({title:'Review commitApplication', method:'commitApplication(procurementId,commitment,subdomain,proof)', facts:[{label:'Procurement id',value:x.pid},{label:'Commitment',value:x.commitment},{label:'Subdomain (normalized)',value:x.subdomain||'(empty for ENS route)'}], txBuilder:()=>agiJobDiscovery.methods.commitApplication(x.pid, x.commitment, x.subdomain, x.proof), run:async()=>{ const receipt = await runTrackedTx('commitApplication', ()=>agiJobDiscovery.methods.commitApplication(x.pid, x.commitment, x.subdomain, x.proof).send({from:userAccount}), {pendingDetail:'Submitting application commitment.', successDetail:'Application commitment confirmed.'}); $('premiumActionResult').textContent=`committed for procurement ${x.pid}.`; const p=loadLocalPacket('premiumApplicantPacket'); if(p) saveLocalPacket('premiumApplicantPacket', {...p, committed:true, txHash:receipt?.transactionHash||''}); setParticipateSuccess(`Application committed. tx
${escapeHtml(receipt?.transactionHash||'')}Next recommended action: reveal application during reveal window.`); }}).catch(e=>setToast(e.message||String(e),'bad')); });
- $('premiumActionRevealApplicationBtn')?.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 revealApplication', method:'revealApplication(procurementId,subdomain,proof,salt,applicationURI)', facts:[{label:'Procurement id',value:x.pid},{label:'Application URI',value:x.uri},{label:'Reveal semantics',value:'This reveals URI + salt matching earlier 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=`revealed for procurement ${x.pid}.`; const p=loadLocalPacket('premiumApplicantPacket'); if(p) saveLocalPacket('premiumApplicantPacket', {...p, revealed:true, revealTxHash:receipt?.transactionHash||''}); setParticipateSuccess(`Application revealed. tx
${escapeHtml(receipt?.transactionHash||'')}Inspector deep-link ready for audit.`); }}).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()=>{ const receipt=await runTrackedTx('acceptFinalist', ()=>agiJobDiscovery.methods.acceptFinalist(x.pid).send({from:userAccount}), {pendingDetail:'Accepting finalist slot.', successDetail:'Finalist acceptance confirmed.'}); $('premiumActionResult').textContent=`finalist accepted for procurement ${x.pid}.`; setParticipateSuccess(`Finalist accepted. tx
${escapeHtml(receipt?.transactionHash||'')}Next: submit trial URI before trial deadline.`); }}).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()=>{ const receipt=await runTrackedTx('submitTrial', ()=>agiJobDiscovery.methods.submitTrial(x.pid, x.uri).send({from:userAccount}), {pendingDetail:'Submitting finalist trial.', successDetail:'Finalist trial confirmed.'}); $('premiumActionResult').textContent=`trial submitted for procurement ${x.pid}.`; setParticipateSuccess(`Trial submitted. tx
${escapeHtml(receipt?.transactionHash||'')}Next: validator score commit phase.`); }}).catch(e=>setToast(e.message||String(e),'bad')); });
- $('premiumActionCommitScoreBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.finalist||!x.commitment) return setToast('Enter procurement id, finalist, and commitment.','warn'); reviewDiscoveryWrite({title:'Review commitFinalistScore', method:'commitFinalistScore(procurementId,finalist,commitment,subdomain,proof)', facts:[{label:'Procurement id',value:x.pid},{label:'Finalist',value:x.finalist},{label:'Commitment',value:x.commitment},{label:'Commit semantics',value:'Commitment hides score until reveal.'}], txBuilder:()=>agiJobDiscovery.methods.commitFinalistScore(x.pid, x.finalist, x.commitment, x.subdomain, x.proof), run:async()=>{ const receipt=await runTrackedTx('commitFinalistScore', ()=>agiJobDiscovery.methods.commitFinalistScore(x.pid, x.finalist, x.commitment, x.subdomain, x.proof).send({from:userAccount}), {pendingDetail:'Submitting validator score commitment.', successDetail:'Validator score commitment confirmed.'}); $('premiumActionResult').textContent=`score committed for procurement ${x.pid}.`; const p=loadLocalPacket('premiumValidatorPacket'); if(p) saveLocalPacket('premiumValidatorPacket', {...p, committed:true, txHash:receipt?.transactionHash||''}); setParticipateSuccess(`Score committed. tx
${escapeHtml(receipt?.transactionHash||'')}Next: reveal score during score reveal window.`); }}).catch(e=>setToast(e.message||String(e),'bad')); });
- $('premiumActionRevealScoreBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.finalist||!x.salt||x.score==='') return setToast('Enter procurement id, finalist, score, and salt.','warn'); reviewDiscoveryWrite({title:'Review revealFinalistScore', method:'revealFinalistScore(procurementId,finalist,score,salt,subdomain,proof)', facts:[{label:'Procurement id',value:x.pid},{label:'Finalist',value:x.finalist},{label:'Score',value:x.score}], txBuilder:()=>agiJobDiscovery.methods.revealFinalistScore(x.pid, x.finalist, Number(x.score), x.salt, x.subdomain, x.proof), run:async()=>{ const receipt=await runTrackedTx('revealFinalistScore', ()=>agiJobDiscovery.methods.revealFinalistScore(x.pid, x.finalist, Number(x.score), x.salt, x.subdomain, x.proof).send({from:userAccount}), {pendingDetail:'Revealing validator score.', successDetail:'Validator score reveal confirmed.'}); $('premiumActionResult').textContent=`score revealed for procurement ${x.pid}.`; const p=loadLocalPacket('premiumValidatorPacket'); if(p) saveLocalPacket('premiumValidatorPacket', {...p, revealed:true, revealTxHash:receipt?.transactionHash||''}); setParticipateSuccess(`Score revealed. tx
${escapeHtml(receipt?.transactionHash||'')}Likely next step: finalize winner when quorum conditions are met.`); }}).catch(e=>setToast(e.message||String(e),'bad')); });
+ $('premiumActionCommitApplicationBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.commitment) return setToast('Enter procurement id and commitment.','warn'); reviewDiscoveryWrite({title:'Review commit application', method:'commitApplication(procurementId,commitment,subdomain,proof)', facts:[{label:'Procurement id',value:x.pid},{label:'Connected wallet',value:userAccount||'—'},{label:'Normalized subdomain',value:x.subdomain||'—'},{label:'Proof mode',value:x.proof?.length?'Merkle proof (advanced)':'ENS authorization path'},{label:'Application stake at risk',value:'Loaded from procurement state'},{label:'Commitment',value:x.commitment},{label:'Explicit note',value:'The application URI is NOT written on-chain by this transaction.'}], txBuilder:()=>agiJobDiscovery.methods.commitApplication(x.pid, x.commitment, x.subdomain, x.proof), run:async()=>{ const receipt=await runTrackedTx('commitApplication', ()=>agiJobDiscovery.methods.commitApplication(x.pid, x.commitment, x.subdomain, x.proof).send({from:userAccount}), {pendingDetail:'Submitting application commitment.', successDetail:'Application commitment confirmed.'}); $('premiumActionResult').textContent=`commitApplication confirmed for procurement ${x.pid}.`; savePacket(); if(receipt?.events?.ApplicationCommitted || Object.values(receipt?.events||{}).find(e=>e?.event==='ApplicationCommitted')){ if($('premiumParticipatePacketState')) $('premiumParticipatePacketState').textContent='On-chain committed'; if($('premiumParticipatePacketMeta')) $('premiumParticipatePacketMeta').textContent='Commitment confirmed. Keep packet safe for reveal.'; } }}).catch(e=>setToast(e.message||String(e),'bad')); });
+ $('premiumActionRevealApplicationBtn')?.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')); });
+ $('premiumActionCommitScoreBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.finalist||!x.commitment) return setToast('Enter procurement id, finalist, and commitment.','warn'); reviewDiscoveryWrite({title:'Review commitFinalistScore', method:'commitFinalistScore(procurementId,finalist,commitment,subdomain,proof)', facts:[{label:'Procurement id',value:x.pid},{label:'Finalist',value:x.finalist},{label:'Commitment',value:x.commitment}], txBuilder:()=>agiJobDiscovery.methods.commitFinalistScore(x.pid, x.finalist, x.commitment, x.subdomain, x.proof), run:async()=>{ await runTrackedTx('commitFinalistScore', ()=>agiJobDiscovery.methods.commitFinalistScore(x.pid, x.finalist, x.commitment, x.subdomain, x.proof).send({from:userAccount}), {pendingDetail:'Submitting validator score commitment.', successDetail:'Validator score commitment confirmed.'}); $('premiumActionResult').textContent=`commitFinalistScore confirmed for procurement ${x.pid}.`; }}).catch(e=>setToast(e.message||String(e),'bad')); });
+ $('premiumActionRevealScoreBtn')?.addEventListener('click', ()=>{ const x=actionInputs(); if(!x.pid||!x.finalist||!x.salt||x.score==='') return setToast('Enter procurement id, finalist, score, and salt.','warn'); reviewDiscoveryWrite({title:'Review revealFinalistScore', method:'revealFinalistScore(procurementId,finalist,score,salt,subdomain,proof)', facts:[{label:'Procurement id',value:x.pid},{label:'Finalist',value:x.finalist},{label:'Score',value:x.score}], txBuilder:()=>agiJobDiscovery.methods.revealFinalistScore(x.pid, x.finalist, Number(x.score), x.salt, x.subdomain, x.proof), run:async()=>{ await runTrackedTx('revealFinalistScore', ()=>agiJobDiscovery.methods.revealFinalistScore(x.pid, x.finalist, Number(x.score), x.salt, x.subdomain, x.proof).send({from:userAccount}), {pendingDetail:'Revealing validator score.', successDetail:'Validator score reveal confirmed.'}); $('premiumActionResult').textContent=`revealFinalistScore confirmed for procurement ${x.pid}.`; }}).catch(e=>setToast(e.message||String(e),'bad')); });
$('premiumActionGenerateApplicationCommitmentBtn')?.addEventListener('click', generateApplicationCommitment);
$('premiumActionGenerateScoreCommitmentBtn')?.addEventListener('click', generateScoreCommitment);
+ setRole('applicant');
+ refreshParticipate().catch(()=>{});
useBalancedAttach();
refreshAttachPreview().catch(()=>{});
loadClaims().catch(()=>{});
@@ -11165,9 +11048,9 @@
Operational readiness
function updateCoach(){
if($('premiumDiscoveryStats')) $('premiumDiscoveryStats').textContent = `${$('premiumStatsUnrevealed')?.textContent || '—'} unrevealed / ${$('premiumStatsFinalistDefaults')?.textContent || '—'} finalist defaults`;
}
- function relabelTabs(){ const claimsBtn=document.querySelector('[data-premium-surface="claims"]'); if(claimsBtn) claimsBtn.textContent='Claims'; const inspectBtn=document.querySelector('[data-premium-surface="inspect"]'); if(inspectBtn) inspectBtn.textContent='Inspector'; const participateBtn=document.querySelector('[data-premium-surface="participate"]'); if(participateBtn) participateBtn.textContent='Participate'; }
+ function relabelTabs(){ const claimsBtn=document.querySelector('[data-premium-surface="claims"]'); if(claimsBtn) claimsBtn.textContent='Claims'; }
function syncInspectorIds(){ if($('premiumInspectorNextActionReadable') && $('premiumInspectorNextActionMeta')) $('premiumInspectorNextActionMeta').textContent = $('premiumInspectorNextActionMeta').textContent || 'Load a procurement to translate live state.'; }
- function boot(){ relabelTabs(); updateCoach(); syncInspectorIds(); assemblePreflightBand(); restoreUiContinuity({ restoreHash:true }); bindUiContinuity(); persistUiContinuity(); $('preflightOpenAlphaDiagnosticsBtn')?.addEventListener('click', ()=>{ $('alphaJumpDiagnosticsBtn')?.click(); document.getElementById('alphaAgentMintSection')?.scrollIntoView({behavior:'smooth', block:'start'}); }); document.querySelectorAll("[data-premium-role-action]").forEach(btn=>btn.addEventListener("click", ()=>{ const pid=$("premiumInspectorProcurementId")?.value||""; if($("premiumActionProcurementId")) $("premiumActionProcurementId").value=pid; const agent=$("premiumInspectorApplicationAgent")?.value||""; if(agent && $("premiumActionFinalist")) $("premiumActionFinalist").value=agent; const map={commit:"premiumActionCommitApplicationBtn",reveal:"premiumActionRevealApplicationBtn",accept:"premiumActionAcceptFinalistBtn",trial:"premiumActionSubmitTrialBtn","score-commit":"premiumActionCommitScoreBtn","score-reveal":"premiumActionRevealScoreBtn"}; const target=map[btn.dataset.premiumRoleAction]; if(target && $(target)) $(target).click(); })); ['input','change'].forEach(evt=>document.addEventListener(evt, e=>{ if(e.target && String(e.target.id||'').startsWith('premiumDiscovery')) updateCoach(); if(e.target && ['termsAccepted','preflightTermsAccepted','agentSub','clubSub','alphaTermsAcceptedTop','mintAlphaLabel'].includes(String(e.target.id||''))) updatePreflightSummary(); })); window.addEventListener('hashchange', persistUiContinuity); window.addEventListener('pagehide', persistUiContinuity); document.addEventListener('visibilitychange', ()=>{ if(document.visibilityState === 'hidden') persistUiContinuity(); }); updatePreflightSummary(); setInterval(updateCoach, 1200); }
+ function boot(){ relabelTabs(); updateCoach(); syncInspectorIds(); assemblePreflightBand(); restoreUiContinuity({ restoreHash:true }); bindUiContinuity(); persistUiContinuity(); $('preflightOpenAlphaDiagnosticsBtn')?.addEventListener('click', ()=>{ $('alphaJumpDiagnosticsBtn')?.click(); document.getElementById('alphaAgentMintSection')?.scrollIntoView({behavior:'smooth', block:'start'}); }); document.querySelectorAll("[data-premium-role-action]").forEach(btn=>btn.addEventListener("click", ()=>{ const pid=$("premiumInspectorProcurementId")?.value||""; if($("premiumActionProcurementId")) $("premiumActionProcurementId").value=pid; if($("premiumParticipateProcurementId")) $("premiumParticipateProcurementId").value=pid; const agent=$("premiumInspectorApplicationAgent")?.value||""; if(agent && $("premiumActionFinalist")) $("premiumActionFinalist").value=agent; const map={commit:"premiumActionCommitApplicationBtn",reveal:"premiumActionRevealApplicationBtn",accept:"premiumActionAcceptFinalistBtn",trial:"premiumActionSubmitTrialBtn","score-commit":"premiumActionCommitScoreBtn","score-reveal":"premiumActionRevealScoreBtn"}; const target=map[btn.dataset.premiumRoleAction]; if(target && $(target)) $(target).click(); })); ['input','change'].forEach(evt=>document.addEventListener(evt, e=>{ if(e.target && String(e.target.id||'').startsWith('premiumDiscovery')) updateCoach(); if(e.target && ['termsAccepted','preflightTermsAccepted','agentSub','clubSub','alphaTermsAcceptedTop','mintAlphaLabel'].includes(String(e.target.id||''))) updatePreflightSummary(); })); window.addEventListener('hashchange', persistUiContinuity); window.addEventListener('pagehide', persistUiContinuity); document.addEventListener('visibilitychange', ()=>{ if(document.visibilityState === 'hidden') persistUiContinuity(); }); updatePreflightSummary(); setInterval(updateCoach, 1200); }
if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, {once:true}); else boot();
})();