Align launcher copy to EDUT ID and add inline glossary help
Some checks are pending
check / launcher (push) Waiting to run

This commit is contained in:
Joshua 2026-02-19 06:35:06 -08:00
parent 96cbba87ca
commit d9f963f1b0
3 changed files with 71 additions and 26 deletions

View File

@ -649,7 +649,7 @@ async function onSendMembershipTx() {
params: [txRequest], params: [txRequest],
}); });
$("confirmTxHash").value = txHash; $("confirmTxHash").value = txHash;
logLine("membership tx sent", { logLine("EDUT ID tx sent", {
quote_id: state.lastQuote.quote_id, quote_id: state.lastQuote.quote_id,
tx_hash: txHash, tx_hash: txHash,
payer_wallet: from, payer_wallet: from,
@ -733,7 +733,7 @@ async function onStatus() {
if (out.designation_code) { if (out.designation_code) {
$("designationCode").value = out.designation_code; $("designationCode").value = out.designation_code;
} }
logLine("membership status", out); logLine("EDUT ID status", out);
refreshOverview(out); refreshOverview(out);
return out; return out;
} }
@ -761,7 +761,7 @@ async function onQuote() {
$("quoteId").value = out.quote_id || ""; $("quoteId").value = out.quote_id || "";
$("quoteValue").value = out.value || ""; $("quoteValue").value = out.value || "";
$("quotePayer").value = out.payer_wallet || ""; $("quotePayer").value = out.payer_wallet || "";
logLine("membership quote", out); logLine("EDUT ID quote", out);
return out; return out;
} }
@ -795,14 +795,14 @@ async function onConfirmMembership() {
identity_attested_by: out.identity_attested_by || "", identity_attested_by: out.identity_attested_by || "",
identity_attestation_id: out.identity_attestation_id || "", identity_attestation_id: out.identity_attestation_id || "",
}; };
logLine("membership confirm", out); logLine("EDUT ID confirm", out);
return out; return out;
} }
async function requireMembershipState(actionLabel, opts = {}) { async function requireMembershipState(actionLabel, opts = {}) {
const status = await onStatus(); const status = await onStatus();
if (String(status.status || "").toLowerCase() !== "active") { if (String(status.status || "").toLowerCase() !== "active") {
throw new Error(`${actionLabel} requires active membership`); throw new Error(`${actionLabel} requires active EDUT ID`);
} }
if (opts.requireOnramp && !isOnrampAttested(status.identity_assurance_level)) { if (opts.requireOnramp && !isOnrampAttested(status.identity_assurance_level)) {
throw new Error(`${actionLabel} requires onramp_attested identity assurance`); throw new Error(`${actionLabel} requires onramp_attested identity assurance`);
@ -846,17 +846,17 @@ async function confirmMembershipWithRetry(maxAttempts = 8, intervalMs = 2500) {
await sleep(intervalMs); await sleep(intervalMs);
} }
} }
throw lastErr || new Error("membership confirm failed"); throw lastErr || new Error("EDUT ID confirmation failed");
} }
async function onRunMembershipFlow() { async function onRunMembershipFlow() {
setFlowStatus("connecting wallet"); setFlowStatus("connecting wallet");
await onConnectWallet(); await onConnectWallet();
setFlowStatus("checking membership"); setFlowStatus("checking EDUT ID");
const status = await onStatus(); const status = await onStatus();
if (String(status.status || "").toLowerCase() === "active") { if (String(status.status || "").toLowerCase() === "active") {
setFlowStatus("membership already active"); setFlowStatus("EDUT ID already active");
return; return;
} }
@ -866,9 +866,9 @@ async function onRunMembershipFlow() {
await onSignIntent(); await onSignIntent();
setFlowStatus("verifying intent"); setFlowStatus("verifying intent");
await onVerify(); await onVerify();
setFlowStatus("quoting membership"); setFlowStatus("quoting EDUT ID");
await onQuote(); await onQuote();
setFlowStatus("sending membership transaction"); setFlowStatus("sending EDUT ID transaction");
await onSendMembershipTx(); await onSendMembershipTx();
const txHash = $("confirmTxHash").value.trim(); const txHash = $("confirmTxHash").value.trim();
@ -877,14 +877,14 @@ async function onRunMembershipFlow() {
} }
setFlowStatus("waiting for chain confirmation"); setFlowStatus("waiting for chain confirmation");
await waitForTxMined(txHash); await waitForTxMined(txHash);
setFlowStatus("confirming membership with API"); setFlowStatus("confirming EDUT ID with API");
await confirmMembershipWithRetry(); await confirmMembershipWithRetry();
setFlowStatus("refreshing status"); setFlowStatus("refreshing status");
const refreshed = await onStatus(); const refreshed = await onStatus();
if (isOnrampAttested(refreshed.identity_assurance_level)) { if (isOnrampAttested(refreshed.identity_assurance_level)) {
setFlowStatus("membership flow complete (attested)"); setFlowStatus("EDUT ID flow complete (attested)");
} else { } else {
setFlowStatus("membership active (unattested)"); setFlowStatus("EDUT ID active (unattested)");
} }
} }
@ -1150,7 +1150,7 @@ async function onQuickActivate() {
async function onQuickRefresh() { async function onQuickRefresh() {
const status = await onStatus(); const status = await onStatus();
if (String(status.status || "").toLowerCase() !== "active") { if (String(status.status || "").toLowerCase() !== "active") {
setFlowStatus("membership inactive"); setFlowStatus("EDUT ID inactive");
return; return;
} }
try { try {

View File

@ -3,21 +3,21 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>EDUT Launcher</title> <title>EDUT ID Manager</title>
<link rel="stylesheet" href="./style.css" /> <link rel="stylesheet" href="./style.css" />
</head> </head>
<body> <body>
<main class="shell"> <main class="shell">
<header class="hero"> <header class="hero">
<h1>EDUT Launcher</h1> <h1>EDUT ID Manager</h1>
<p>Deterministic infrastructure control surface.</p> <p>Deterministic identity, access, and control surface.</p>
</header> </header>
<section class="panel"> <section class="panel">
<h2>Control Surface</h2> <h2>Control Surface</h2>
<div class="actions"> <div class="actions">
<button id="btnQuickConnect">Connect wallet</button> <button id="btnQuickConnect">Connect wallet</button>
<button id="btnQuickActivate">Activate membership</button> <button id="btnQuickActivate">Activate EDUT ID</button>
<button id="btnQuickRefresh">Refresh status + feed</button> <button id="btnQuickRefresh">Refresh status + feed</button>
<button id="btnQuickInstallStatus">Governance status</button> <button id="btnQuickInstallStatus">Governance status</button>
<button id="btnRefreshBalances">Refresh balances</button> <button id="btnRefreshBalances">Refresh balances</button>
@ -40,7 +40,7 @@
<p id="summaryFunds">-- ETH | -- USDC</p> <p id="summaryFunds">-- ETH | -- USDC</p>
</article> </article>
<article class="stat"> <article class="stat">
<h3>Membership</h3> <h3><span class="term-inline">EDUT ID<details class="inline-help"><summary aria-label="What is EDUT ID?">?</summary><p>EDUT ID is your one-time identity credential used for checkout, activation, and ownership proof.</p></details></span></h3>
<p id="summaryMembership">unknown</p> <p id="summaryMembership">unknown</p>
</article> </article>
<article class="stat"> <article class="stat">
@ -48,11 +48,11 @@
<p id="summaryMode">human_manual</p> <p id="summaryMode">human_manual</p>
</article> </article>
<article class="stat"> <article class="stat">
<h3>Designation</h3> <h3><span class="term-inline">Designation<details class="inline-help"><summary aria-label="What is designation?">?</summary><p>Designation is the protocol reference created during wallet intent and carried through activation evidence.</p></details></span></h3>
<p id="summaryDesignation">-</p> <p id="summaryDesignation">-</p>
</article> </article>
<article class="stat"> <article class="stat">
<h3>Identity Assurance</h3> <h3><span class="term-inline">Identity Assurance<details class="inline-help"><summary aria-label="What is identity assurance?">?</summary><p>Assurance level records how identity was attested, such as direct crypto flow or on-ramp attestation.</p></details></span></h3>
<p id="summaryAssurance">unknown</p> <p id="summaryAssurance">unknown</p>
</article> </article>
<article class="stat"> <article class="stat">
@ -110,16 +110,16 @@
</section> </section>
<section class="subpanel"> <section class="subpanel">
<h2>Membership Flow Controls</h2> <h2>EDUT ID Flow Controls</h2>
<div class="actions"> <div class="actions">
<button id="btnRunMembershipFlow">Run membership flow</button> <button id="btnRunMembershipFlow">Run EDUT ID flow</button>
<button id="btnConnectWallet">Connect wallet</button> <button id="btnConnectWallet">Connect wallet</button>
<button id="btnIntent">Create intent</button> <button id="btnIntent">Create intent</button>
<button id="btnSignIntent">Sign intent (EIP-712)</button> <button id="btnSignIntent">Sign intent (EIP-712)</button>
<button id="btnVerify">Verify signature</button> <button id="btnVerify">Verify signature</button>
<button id="btnRefreshSession">Refresh session</button> <button id="btnRefreshSession">Refresh session</button>
<button id="btnRevokeSession">Revoke session</button> <button id="btnRevokeSession">Revoke session</button>
<button id="btnStatus">Membership status</button> <button id="btnStatus">EDUT ID status</button>
</div> </div>
<div class="grid three"> <div class="grid three">
<label> <label>
@ -160,8 +160,8 @@
<div class="actions"> <div class="actions">
<button id="btnQuote">Get quote</button> <button id="btnQuote">Get quote</button>
<button id="btnSignPayerProof">Sign payer proof</button> <button id="btnSignPayerProof">Sign payer proof</button>
<button id="btnSendMembershipTx">Send membership tx</button> <button id="btnSendMembershipTx">Send EDUT ID tx</button>
<button id="btnConfirmMembership">Confirm membership tx</button> <button id="btnConfirmMembership">Confirm EDUT ID tx</button>
</div> </div>
<div class="grid three"> <div class="grid three">
<label> <label>

View File

@ -53,6 +53,51 @@ body {
color: var(--accent); color: var(--accent);
} }
.term-inline {
display: inline-flex;
align-items: center;
gap: 6px;
}
.inline-help {
position: relative;
display: inline-block;
}
.inline-help > summary {
list-style: none;
width: 16px;
height: 16px;
border: 1px solid var(--line);
border-radius: 50%;
text-align: center;
line-height: 14px;
font-size: 10px;
color: var(--muted);
cursor: pointer;
user-select: none;
background: #0f1828;
}
.inline-help > summary::-webkit-details-marker {
display: none;
}
.inline-help > p {
position: absolute;
top: 20px;
left: 0;
width: min(300px, 80vw);
border: 1px solid var(--line);
border-radius: 8px;
background: #0f1828;
color: var(--text);
padding: 8px;
font-size: 11px;
line-height: 1.45;
z-index: 30;
}
.note { .note {
margin: 0 0 10px; margin: 0 0 10px;
color: var(--muted); color: var(--muted);