众筹合约:达到目标则资金发送给受益人,否则参与者可以退款。
众筹合约:参与者向活动捐款,达到目标则资金发送给受益人,否则参与者可以退款。
学习用途
本示例仅用于学习目的。请勿在未经充分审查和测试的情况下用于生产环境。
这个合约实现了经典的众筹逻辑:
participate() 捐款finalize() 将资金发送给受益人refund() 取回捐款vyper
#pragma version >0.3.10
# example of a crowd funding contract
funders: HashMap[address, uint256]
beneficiary: address
deadline: public(uint256)
goal: public(uint256)
timelimit: public(uint256)
finalized: bool
@deploy
def __init__(_beneficiary: address, _goal: uint256, _timelimit: uint256):
self.beneficiary = _beneficiary
self.deadline = block.timestamp + _timelimit
self.timelimit = _timelimit
assert _goal > 0, "Goal must be non-zero"
self.goal = _goal
@external
@payable
def participate():
assert block.timestamp < self.deadline, "deadline has expired"
assert not self.finalized
self.funders[msg.sender] += msg.value
@external
def finalize():
assert block.timestamp >= self.deadline, "deadline has not expired yet"
assert self.balance >= self.goal, "goal has not been reached"
assert self.balance > 0
self.finalized = True
send(self.beneficiary, self.balance)
@external
def refund():
assert block.timestamp >= self.deadline and self.balance < self.goal
assert not self.finalized
assert self.funders[msg.sender] > 0
value: uint256 = self.funders[msg.sender]
self.funders[msg.sender] = 0
send(msg.sender, value)funders 映射记录每个地址的捐款金额。finalized 标记防止重复提取。goal 是筹款目标,deadline 是截止时间。
标记为 @payable,检查截止时间和是否已完成,然后将捐款累加到调用者的记录中。同一地址可以多次捐款。
只有在截止时间过后、余额达到目标时才能调用。使用 self.balance 直接检查合约余额,设置 finalized 后将全部余额发送给受益人。
截止后如果余额未达目标,参与者可以取回自己的捐款。先读取金额、清零、再发送——标准的提款模式。
本页目录