woops, the contracts should always be vals, not defs