Here is the contract which allows the user’s funds to be spent only for a specific bid or returning to her. Please let me know if anything is overlooked.
{
val userAddress = PK("$userAddress")
val bidAmount = $bidAmountL
val endTime = $endTime
val placeBid = {
HEIGHT < endTime && INPUTS(INPUTS.size - 1).id == fromBase64("$auctionId") &&
OUTPUTS(0).R8[Coll[Byte]].get == userAddress.propBytes && OUTPUTS(0).value == bidAmount
}
val returnFunds = {
val total = INPUTS.fold(0L, {(x:Long, b:Box) => x + b.value}) - 4000000
OUTPUTS(0).value >= total && OUTPUTS(0).propositionBytes == userAddress.propBytes
}
sigmaProp(placeBid || returnFunds)
}