NO CUSTODY
Sem custódia de seed ou private key.
A documentação foca segurança transacional: entrada no SafeSign, análise do Security Core, autorização e status real das integrações.

Essas restrições importam mais que o framework.
Sem custódia de seed ou private key.
Não alterar o payload enviado pela wallet/dApp.
Sem auto-sign ou auto-broadcast; autorização explícita.
Evidence ausente = incerteza, nunca silent allow.
Preserve o request original e acrescente evidência legível.
Receber request e contexto.
Normalizar método, params, typed data, approvals ou PSBT.
Adicionar policy, destination e simulation quando disponíveis.
Mostrar risco/incerteza; usuário mantém autorização.
Existe scaffold Chrome/Brave que envolve ethereum.request e espera continuar/rejeitar. Pipeline production ainda é necessário.
// 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
}Somente preferências locais não sensíveis; nunca keys, seeds, raw signatures ou histórico completo.
Cada superfície declara seu limite real.
Guard — base Manifest V3 existe; build/distribuição production separados.
Wallet — UI existe; fluxos reais passam pelo SafeSign.
Relay — análise de rotas/fees/PSBT existe; assinatura/execution futuras.
Preserve o request, derive evidência estruturada, registre unknowns e retorne decisão explicável sem assumir signing authority.
Capture origin, chain, método, payload hash e intenção antes da análise.
Mantenha fatos, provenance, freshness, contradictions e unknowns separados.
Retorne ALLOW, WARN, REVIEW ou BLOCK com reason codes e payload hash revisado.
Preserve o request, derive evidência estruturada, registre unknowns e retorne decisão explicável sem assumir signing authority.
{
"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:..."
}Se o payload mudar após a review, a decisão é inválida e nova review é necessária.