Verifying smart contracts