forked from Cyfrin/remix-fund-me-cu
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit ddadde8
Showing
6 changed files
with
188 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.18; | ||
|
||
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; | ||
import "./PriceConverter.sol"; | ||
|
||
error NotOwner(); | ||
|
||
contract FundMe { | ||
using PriceConverter for uint256; | ||
|
||
mapping(address => uint256) public addressToAmountFunded; | ||
address[] public funders; | ||
|
||
// Could we make this constant? /* hint: no! We should make it immutable! */ | ||
address public /* immutable */ i_owner; | ||
uint256 public constant MINIMUM_USD = 50 * 10 ** 18; | ||
|
||
constructor() { | ||
i_owner = msg.sender; | ||
} | ||
|
||
function fund() public payable { | ||
require(msg.value.getConversionRate() >= MINIMUM_USD, "You need to spend more ETH!"); | ||
// require(PriceConverter.getConversionRate(msg.value) >= MINIMUM_USD, "You need to spend more ETH!"); | ||
addressToAmountFunded[msg.sender] += msg.value; | ||
funders.push(msg.sender); | ||
} | ||
|
||
function getVersion() public view returns (uint256){ | ||
AggregatorV3Interface priceFeed = AggregatorV3Interface(0x8A753747A1Fa494EC906cE90E9f37563A8AF630e); | ||
return priceFeed.version(); | ||
} | ||
|
||
modifier onlyOwner { | ||
// require(msg.sender == owner); | ||
if (msg.sender != i_owner) revert NotOwner(); | ||
_; | ||
} | ||
|
||
function withdraw() public onlyOwner { | ||
for (uint256 funderIndex=0; funderIndex < funders.length; funderIndex++){ | ||
address funder = funders[funderIndex]; | ||
addressToAmountFunded[funder] = 0; | ||
} | ||
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"); | ||
} | ||
// Explainer from: https://solidity-by-example.org/fallback/ | ||
// Ether is sent to contract | ||
// is msg.data empty? | ||
// / \ | ||
// yes no | ||
// / \ | ||
// receive()? fallback() | ||
// / \ | ||
// yes no | ||
// / \ | ||
//receive() fallback() | ||
|
||
fallback() external payable { | ||
fund(); | ||
} | ||
|
||
receive() external payable { | ||
fund(); | ||
} | ||
|
||
} | ||
|
||
// Concepts we didn't cover yet (will cover in later sections) | ||
// 1. Enum | ||
// 2. Events | ||
// 3. Try / Catch | ||
// 4. Function Selector | ||
// 5. abi.encode / decode | ||
// 6. Hash with keccak256 | ||
// 7. Yul / Assembly | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.18; | ||
|
||
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; | ||
|
||
// Why is this a library and not abstract? | ||
// Why not an interface? | ||
library PriceConverter { | ||
// We could make this public, but then we'd have to deploy it | ||
function getPrice() internal view returns (uint256) { | ||
// Sepolia ETH / USD Address | ||
// https://docs.chain.link/data-feeds/price-feeds/addresses | ||
AggregatorV3Interface priceFeed = AggregatorV3Interface( | ||
0x694AA1769357215DE4FAC081bf1f309aDC325306 | ||
); | ||
(, int256 answer, , , ) = priceFeed.latestRoundData(); | ||
// ETH/USD rate in 18 digit | ||
return uint256(answer * 10000000000); | ||
} | ||
|
||
// 1000000000 | ||
function getConversionRate( | ||
uint256 ethAmount | ||
) internal view returns (uint256) { | ||
uint256 ethPrice = getPrice(); | ||
uint256 ethAmountInUsd = (ethPrice * ethAmount) / 1000000000000000000; | ||
// the actual ETH/USD conversion rate, after adjusting the extra 0s. | ||
return ethAmountInUsd; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
This is part of the Cyfrin Foundry Blockchain Developer Course. | ||
|
||
## Getting Started | ||
|
||
1. Go to [Remix](https://remix.ethereum.org/) | ||
2. Paste the code from `FundMe.sol` and `PriceConverter.sol` into new files in Remix | ||
3. Hit `Compile` | ||
4. Hit `Deploy` | ||
|
||
For a more in depth blog on working with remix, [read here](https://docs.chain.link/docs/deploy-your-first-contract/) | ||
|
||
# Thank you! | ||
|
||
If you appreciated this, feel free to follow me or donate! | ||
|
||
ETH/Polygon/Avalanche/etc Address: 0x9680201d9c93d65a3603d2088d125e955c73BD65 | ||
|
||
[![Patrick Collins Twitter](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://twitter.com/PatrickAlphaC) | ||
[![Patrick Collins YouTube](https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white)](https://www.youtube.com/channel/UCn-3f8tw_E1jZvhuHatROwA) | ||
[![Patrick Collins Linkedin](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/patrickalphac/) | ||
[![Patrick Collins Medium](https://img.shields.io/badge/Medium-000000?style=for-the-badge&logo=medium&logoColor=white)](https://medium.com/@patrick.collins_58673/) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.18; | ||
|
||
contract FallbackExample { | ||
uint256 public result; | ||
|
||
// Fallback function must be declared as external. | ||
fallback() external payable { | ||
result = 1; | ||
} | ||
|
||
receive() external payable { | ||
result = 2; | ||
} | ||
} | ||
|
||
// Explainer from: https://solidity-by-example.org/fallback/ | ||
// Ether is sent to contract | ||
// is msg.data empty? | ||
// / \ | ||
// yes no | ||
// / \ | ||
// receive()? fallback() | ||
// / \ | ||
// yes no | ||
// / \ | ||
//receive() fallback() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.6.0; | ||
|
||
contract SafeMathTester{ | ||
uint8 public bigNumber = 255; // unchecked | ||
|
||
function add() public { | ||
bigNumber = bigNumber + 1; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.0; | ||
|
||
contract SafeMathTester{ | ||
uint8 public bigNumber = 255; // checked | ||
|
||
function add() public { | ||
unchecked {bigNumber = bigNumber + 1;} | ||
} | ||
} |