-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFundMe.sol
More file actions
107 lines (89 loc) · 2.64 KB
/
Copy pathFundMe.sol
File metadata and controls
107 lines (89 loc) · 2.64 KB
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
import "./PriceConverter.sol";
error FundMe__NotOwner();
//NATSPEC
/** @title A contract for crowd funding
* @author Equious
* @notice D'z Nuts
* @dev price feed mock aggregators implemented
*/
contract FundMe {
using PriceConverter for uint256;
mapping(address => uint256) private s_addressToAmountFunded;
address[] private s_funders;
// Could we make this constant? /* hint: no! We should make it immutable! */
address private immutable i_owner;
uint256 public constant MINIMUM_USD = 50 * 10**18;
AggregatorV3Interface private s_priceFeed;
modifier onlyOwner() {
// require(msg.sender == owner);
if (msg.sender != i_owner) revert FundMe__NotOwner();
_;
}
constructor(address priceFeedAddress) {
i_owner = msg.sender;
s_priceFeed = AggregatorV3Interface(priceFeedAddress);
}
function fund() public payable {
require(
msg.value.getConversionRate(s_priceFeed) >= MINIMUM_USD,
"You need to spend more ETH!"
);
// require(PriceConverter.getConversionRate(msg.value) >= MINIMUM_USD, "You need to spend more ETH!");
s_addressToAmountFunded[msg.sender] += msg.value;
s_funders.push(msg.sender);
}
function withdraw() public payable onlyOwner {
for (
uint256 funderIndex = 0;
funderIndex < s_funders.length;
funderIndex++
) {
address funder = s_funders[funderIndex];
s_addressToAmountFunded[funder] = 0;
}
s_funders = new address[](0);
// // transfer
// payable(msg.sender).transfer(address(this).balance);
// // send
// bool sendSuccess = payable(msg.sender).send(address(this).balance);
// require(sendSuccess, "Send failed");
// call
(bool callSuccess, ) = payable(msg.sender).call{
value: address(this).balance
}("");
require(callSuccess, "Call failed");
}
function cheaperWithdraw() public payable onlyOwner {
address[] memory funders = s_funders;
for (
uint256 funderIndex = 0;
funderIndex < funders.length;
funderIndex++
) {
address funder = funders[funderIndex];
s_addressToAmountFunded[funder] = 0;
}
s_funders = new address[](0);
(bool success, ) = i_owner.call{value: address(this).balance}("");
require(success);
}
function getOwner() public view returns (address) {
return i_owner;
}
function getFunder(uint256 index) public view returns (address) {
return s_funders[index];
}
function getAddressToAmountFunded(address funder)
public
view
returns (uint256)
{
return s_addressToAmountFunded[funder];
}
function getPriceFeed() public view returns (AggregatorV3Interface) {
return s_priceFeed;
}
}