API de EnergyAttestationResolver
El resolver es la capa de validación sin estado que EAS llama en cada intento de atestación y de revocación. Decodifica, valida y delega en el registro.
Hooks del resolver
Estas funciones las llama EAS automáticamente: no las invocas directamente. Se documentan aquí para que entiendas el flujo de validación.
onAttest
onAttest(Attestation attestation, uint256 value) → boolEAS lo llama en cada nueva atestación. Realiza la siguiente validación:
1. Revert if resolver is paused
2. Decode attestation data (7 fields)
3. Validate structure:
- readingCount > 0
- readingIntervalMinutes > 0
- readings.length == readingCount
- method is non-empty
4. Validate project:
- Project exists and is registered
5. Validate attester:
- Per-project OR watcher-wide authorization
6. Compute derived values:
- toTimestamp = fromTimestamp + readingCount * interval * 60
- energyWh = sum(readings)
7. Validate timestamps:
- toTimestamp > fromTimestamp (no overflow)
8. Route to registry:
- If refUID is zero: registry.recordAttestation()
- If refUID is set: validate replacement, then registry.recordReplacement()onAttest: ruta de reemplazo
Cuando refUID está definido (distinto de cero), el resolver procesa una atestación de reemplazo:
1. Validate that the replacement targets the same project
2. Validate that the replacement covers the same time period
3. Delegate to registry.recordReplacement() with both old and new energy valuesEl registro ajusta los acumuladores según la diferencia y registra la cadena de reemplazos.
onRevoke
onRevoke(Attestation attestation, uint256 value) → boolSiempre revierte con DirectRevocationBlocked(). No se admiten revocaciones directas: las correcciones deben hacerse mediante el mecanismo de reemplazo con refUID, para conservar una pista de auditoría completa.
Funciones de administración
pause / unpause
pause()unpause()Pausa o reanuda el procesamiento de atestaciones. Al pausar se bloquean las nuevas atestaciones y los reemplazos. Solo el propietario del contrato.
getRegistry
getRegistry() → addressDevuelve la dirección del EnergyRegistry en el que escribe este resolver.
isPayable
isPayable() → boolSiempre devuelve false: las atestaciones de energía no transportan valor en ETH.
renounceOwnership
Deshabilitada: siempre revierte. Esto evita quedarse sin propietario por accidente.