Risk: Attacker gains access to owner's private key
Mitigations:
- Passkey authentication (planned) eliminates seed phrase exposure
- Owner can update beneficiary before attacker triggers release
- Pause mechanism allows admin to freeze contract
Risk: Beneficiary triggers release before owner is deceased
Mitigations:
is_expired()check enforces TTL expiry- Returns
ContractError::NotExpiredif triggered early - Owner can check in to reset countdown
Risk: Admin pauses contract or changes configuration maliciously
Mitigations:
- Admin cannot access vault funds
- Admin cannot change vault owners or beneficiaries
- Two-step admin transfer with
propose_adminandaccept_admin - Transparent on-chain actions
Risk: Attacker re-initializes contract with new admin
Mitigations:
initialize()checks for existing admin/token- Returns
ContractError::AlreadyInitialized - Tested in
test_initialize_guard_against_double_init
Risk: Owner sets self as beneficiary to bypass release logic
Mitigations:
create_vaultrejects owner == beneficiaryset_beneficiariesrejects owner in beneficiary list- Returns
ContractError::InvalidBeneficiary
- All owner actions require
owner.require_auth() - Structured error handling via ContractError enum
- Comprehensive test coverage for edge cases
- State validation before mutations
- TTL extension on all storage operations
Not yet audited. Community review welcome.