@entros/verify
v0.1.0
Published
Drop-in React component for Entros verification — popup-pattern, wallet-connected. The captcha-grade primitive integrators embed to send their users into the Entros verify flow.
Maintainers
Readme
@entros/verify
Drop-in React component for Entros verification on Solana. Click → popup window opens to entros.io → user completes wallet-connected verification → component fires onVerified with the on-chain attestation reference.
Source: github.com/entros-protocol/entros-verify · Hosted by entros.io.
npm install @entros/verifyFive-line usage
import { EntrosVerify } from "@entros/verify";
<EntrosVerify
integratorKey="your-integrator-key"
onVerified={(result) => unlockClaim(result.walletPubkey)}
/>Result shape
interface EntrosVerifyResult {
walletPubkey: string; // base58 Solana pubkey
attestationPda: string; // base58 SAS attestation PDA
txSig: string; // base58 verification tx signature
trustScore: number; // current Trust Score (0–10000)
cluster: "devnet" | "mainnet-beta";
}Read the on-chain attestation from any Solana program or client. No API keys, no escrow, no per-call billing.
Full API
<EntrosVerify
integratorKey="jupiter" // required, registered with Entros
cluster="devnet" // "devnet" | "mainnet-beta", default "devnet"
minTrustScore={200} // optional gate
popupWidth={480} // CSS px, default 480
popupHeight={720} // CSS px, default 720
timeoutMs={5 * 60 * 1000} // 5 min default
popupBlockedFallback={true} // inline retry UI when popup blocked
className="..." // applied to trigger button
style={{ ... }}
onVerified={(r) => {}} // required
onError={(e) => {}} // optional — covers cancel, reject, timeout, etc.
onProgress={(p) => {}} // optional — heartbeats from popup
>
Verify with Entros {/* custom button content */}
</EntrosVerify>Error reasons
onError receives one of:
wallet_rejected— user denied wallet connection or signingvalidation_failed— verification did not pass server-side checksnetwork_error— popup encountered a network failure mid-flowuser_canceled— user closed the popup before completingorigin_invalid— integrator origin was not on the Entros allowlistpopup_blocked— browser blockedwindow.open()timeout— popup remained open longer thantimeoutMswithout completingunknown— fallback for unexpected failure modes
Specific server-side rejection signals are deliberately not surfaced to the client.
v1 limitations
- Devnet only. Mainnet support lands in v2.
- Hardcoded integrator allowlist on the entros.io side. Self-serve integrator onboarding lands in v2.
- Mobile browsers may open the popup as a new tab rather than a windowed popup. Mobile-Wallet-Adapter-aware mobile flow lands in v1.5.
Production-readiness
- Origin gate on every postMessage (
event.origin === "https://entros.io") - Replay protection via per-popup
request_id - 5-minute timeout
- Popup-blocked fallback with user-gesture retry
- Idempotent cancel
- React 19 typed strict-mode
License
MIT.
