We consider the problem of amplifying uniform average-case hardness of languages in NP, where hardness is with respect to BPP algorithms. We introduce the notion of monotone errorcorrecting codes, and show that hardness amplification for NP is essentially equivalent to constructing efficiently locally encodable and locally list-decodable monotone codes. The previous hardness amplification results for NP [Tre03, Tre05] focused on giving a direct construction of some locally encodable/decodable monotone codes, running into the problem of large amounts of nonuniformity used by the decoding algorithm. In contrast, we propose the indirect approach to constructing locally encodable/decodable monotone codes, combining the uniform Direct Product Lemma of [IJK06] and arbitrary, not necessarily locally encodable, monotone codes. The latter codes have fewer restrictions, and so may be easier to construct. We study what parameters are achievable by monotone codes in general, giving negative and p...