NO CUSTODY
Aucune garde de seed ou clé privée.
La documentation se concentre sur la sécurité transactionnelle : entrée SafeSign, analyse Security Core, autorisation et état réel des intégrations.

Ces contraintes comptent davantage que le framework.
Aucune garde de seed ou clé privée.
Ne pas muter le payload fourni par wallet/dApp.
Pas d'auto-signature ni auto-broadcast; autorisation explicite.
Preuve absente = incertitude, jamais autorisation silencieuse.
Préserver la requête et ajouter des preuves lisibles.
Recevoir requête et contexte disponible.
Normaliser méthode, paramètres, typed data, approvals ou PSBT.
Ajouter politique, destination et simulation si disponibles.
Afficher risque et incertitude; l'utilisateur conserve l'autorisation.
Un scaffold Chrome/Brave existe, enveloppe ethereum.request et attend continuer/refuser. La pipeline production reste à faire.
// browser/page context — conceptual integration boundary
const original = ethereum.request.bind(ethereum)
ethereum.request = async (request) => {
const decision = await reviewWithSafeSign(request)
if (decision !== "continue") throw new Error("User rejected")
return original(request) // forward unchanged
}Préférences locales non sensibles uniquement; jamais clés, seeds, signatures brutes ou historique complet.
Chaque surface déclare sa frontière réelle.
Guard — fondation Manifest V3 existante; build/distribution production séparés.
Wallet — UI actuelle; flux réels via SafeSign avant confirmation.
Relay — analyse routes/frais/PSBT; signature/exécution futures.
Préserver la requête, dériver des preuves structurées, enregistrer les inconnues et retourner une décision explicable sans prendre l'autorité de signature.
Capturer origin, chaîne, méthode, payload hash et intention avant analyse.
Conserver faits, provenance, fraîcheur, contradictions et inconnues comme nœuds séparés.
Retourner ALLOW, WARN, REVIEW ou BLOCK avec reason codes et payload hash revu.
Préserver la requête, dériver des preuves structurées, enregistrer les inconnues et retourner une décision explicable sans prendre l'autorité de signature.
{
"origin":"https://app.example",
"chainId":1,
"method":"eth_signTypedData_v4",
"payloadHash":"sha256:...",
"intent":"swap 1 ETH"
}{
"decision":"REVIEW",
"reasonCodes":["AUTHORITY_EXCEEDS_INTENT"],
"unknowns":["spender_reputation"],
"payloadHash":"sha256:..."
}Si le payload change après la revue, la décision est invalide et une nouvelle revue est requise.