-
Notifications
You must be signed in to change notification settings - Fork 1
/
buy_me_a_coffee.vy
88 lines (69 loc) · 2.3 KB
/
buy_me_a_coffee.vy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# pragma version 0.4.0
# pragma enable-decimals
# SPDX-License-Identifier: MIT
"""
# @title A sample buy-me-a-coffee contract
# @author Patrick Collins
# @notice This contract is for creating a sample funding contract
"""
from interfaces import AggregatorV3Interface
# interface AggregatorV3Interface:
# def decimals() -> uint8: view
# def description() -> String[1000]: view
# def version() -> uint256: view
# def getRoundData(_roundId: uint80) -> (uint80, int256, uint256, uint256, uint80): view
# def latestRoundData() -> (uint80, int256, uint256, uint256, uint80): view
# minimum_usd_decimals: public(constant(decimal)) = 50.0
MINIMUM_USD: public(constant(uint256)) = 50 * (10**18)
PRECISION: constant(uint256) = 1 * (10**18)
OWNER: public(immutable(address))
funders: public(DynArray[address, 100])
address_to_amount_funded: public(HashMap[address, uint256])
price_feed: public(AggregatorV3Interface)
@deploy
def __init__(price_feed: address):
self.price_feed = AggregatorV3Interface(price_feed)
OWNER = msg.sender
@internal
def _only_owner():
assert msg.sender == OWNER, "Not the contract owner"
@internal
@view
def _get_eth_to_usd_rate(eth_amount: uint256) -> uint256:
# Check the conversion rate
a: uint80 = 0
price: int256 = 0
b: uint256 = 0
c: uint256 = 0
d: uint80 = 0
(a, price, b, c, d) = staticcall self.price_feed.latestRoundData()
# We know the price has 8 decimals, so we need to add 10
eth_price: uint256 = (convert(price, uint256)) * (10**10)
eth_amount_in_usd: uint256 = (eth_price * eth_amount) // PRECISION
return eth_amount_in_usd
@external
@payable
def fund():
usd_value_of_eth: uint256 = self._get_eth_to_usd_rate(msg.value)
assert usd_value_of_eth >= MINIMUM_USD, "You need to spend more ETH!"
self.address_to_amount_funded[msg.sender] += msg.value
self.funders.append(msg.sender)
@external
def withdraw():
self._only_owner()
for funder: address in self.funders:
self.address_to_amount_funded[funder] = 0
self.funders = []
send(OWNER, self.balance)
@external
@view
def get_version() -> uint256:
return staticcall self.price_feed.version()
@external
@view
def get_funder(index: uint256) -> address:
return self.funders[index]
@external
@view
def get_owner() -> address:
return OWNER