def METHOD_NAME(w3, tester, auction_contract, assert_tx_failed):
    k1, k2, k3, k4, k5 = w3.eth.accounts[:5]
    # Bidder cannot bid 0
    assert_tx_failed(lambda: auction_contract.bid(transact={"value": 0, "from": k1}))
    # Bidder can bid
    auction_contract.bid(transact={"value": 1, "from": k1})
    # Check that highest bidder and highest bid have changed accordingly
    assert auction_contract.highestBidder() == k1
    assert auction_contract.highestBid() == 1
    # Bidder bid cannot equal current highest bid
    assert_tx_failed(lambda: auction_contract.bid(transact={"value": 1, "from": k1}))
    # Higher bid can replace current highest bid
    auction_contract.bid(transact={"value": 2, "from": k2})
    # Check that highest bidder and highest bid have changed accordingly
    assert auction_contract.highestBidder() == k2
    assert auction_contract.highestBid() == 2
    # Multiple bidders can bid
    auction_contract.bid(transact={"value": 3, "from": k3})
    auction_contract.bid(transact={"value": 4, "from": k4})
    auction_contract.bid(transact={"value": 5, "from": k5})
    # Check that highest bidder and highest bid have changed accordingly
    assert auction_contract.highestBidder() == k5
    assert auction_contract.highestBid() == 5
    auction_contract.bid(transact={"value": 1 * 10**10, "from": k1})
    pending_return_before_outbid = auction_contract.pendingReturns(k1)
    auction_contract.bid(transact={"value": 2 * 10**10, "from": k2})
    pending_return_after_outbid = auction_contract.pendingReturns(k1)
    # Account has a greater pending return balance after being outbid
    assert pending_return_after_outbid > pending_return_before_outbid
    balance_before_withdrawal = w3.eth.get_balance(k1)
    auction_contract.withdraw(transact={"from": k1})
    balance_after_withdrawal = w3.eth.get_balance(k1)
    # Balance increases after withdrawal
    assert balance_after_withdrawal > balance_before_withdrawal
    # Pending return balance is reset to 0
    assert auction_contract.pendingReturns(k1) == 0