Vyper theorytheory 0/50 · 0%
Web3 integration · hard

46. Building a simple escrow contract

Holding funds until conditions are met.

An escrow holds funds from a buyer until a delivery condition is confirmed, then releases to the seller (or refunds the buyer on failure/timeout).

buyer: public(address)
seller: public(address)
released: public(bool)

@deploy
@payable
def __init__(seller_: address):
    self.buyer = msg.sender
    self.seller = seller_

@external
def release():
    assert msg.sender == self.buyer, "not buyer"
    assert not self.released, "already released"
    self.released = True
    send(self.seller, self.balance)

Real-world escrows usually add a neutral arbiter role and a timeout-based refund path so funds are never permanently stuck if the buyer goes silent.

Check your understanding

  1. 1. Who typically triggers fund release in a simple escrow?

  2. 2. Why add a timeout-based refund path?

  3. 3. What guard prevents double-releasing funds?