나만의 후원사이트 만들기 (cheers-coffee) 1
2022. 4. 1. 14:45ㆍ개발 잡부/블록체인
728x90
이제 튜토리얼이 끝났으니 간단하게 하나 만들어볼까한다.
정말 단순한 기능으로 만들어볼 예정이다.
1. 사용자는 후원자와 수령자로 나뉜다.
2. 수령자는 자신의 지갑 주소를 등록한다. (여기서는 나 혼자 쓸거니까 등록 X)
3. 후원자는 금액을 설정하고 컨트랙트로 돈을 보낸다.
4. 컨트랙트는 수령자의 지갑에 돈을 넣는다.
1. 컨트랙트 만들기
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "./Ownable.sol";
/// @title Donate
/// @author ImInnocent
/// @notice 외부에서 기부를 하면 내 지갑으로 돈을 쏴줍니다
contract Donate is Ownable {
uint public sum;
address payable private receiveAddress;
uint public coffeePrice = 0.01 ether;
constructor() payable {
receiveAddress = payable(_msgSender());
}
/// @notice 받은 커피의 개수를 보여줌. 소수점 없이 정수.
/// @return 받은 커피의 개수.
function getReceivedCoffee() view external returns (uint) {
return sum / coffeePrice;
}
/// @notice 돈을 받을 주소를 바꿔주는 함수. (소유자 전용)
/// @param _addr 바꿀 새 주소
function changeReceiveAddress(address _addr) external onlyOwner {
require(receiveAddress != payable(_addr));
receiveAddress = payable(_addr);
}
/// @notice 돈을 받으면 컨트랙트의 주인 주소로 보내주는 함수
function donate() payable external {
receiveAddress.transfer(msg.value);
sum = sum + msg.value;
}
}
일단 이렇게 짜봤다.
정말 단순하게 배포와 동시에 내 주소(배포한 주소)를 등록하고,
외부에서 기부(donate)하면 돈을 받고, 합계를 저장하는 것이다.
그리고 view함수도 써볼겸
내가 받은 커피 개수도 얻어오게 했다.
(사실 이건 그냥 웹에서 public 변수 가져와도 되긴 한다. 말 그대로 연습용)
근데 이 짧은 코드를 쓰는데도 여러가지 고려할 점이 있었다.
SPDX-License-Identifier 이슈
address payable 이슈
OpenZeppelin에서 msg.sender를 사용하지 않는 이유
2. 웹 페이지 개발
여러명의 수령자를 위한 페이지는 나중에 리액트로 만들거기 때문에
이번에는 그냥 html로 간단하게 만들어보기로 했다.
코드를 여기에 붙이기는 좋은 생각이 아닌 것 같으니
깃허브 링크를 올리겠다.
* 얍 (나중에 붙임) *
3. 테스트 및 배포
이건 크립토 좀비 튜토리얼을 마저 배우고 와서 해보도록 하겠다.
'개발 잡부 > 블록체인' 카테고리의 다른 글
Transaction Receipt 내용보기 (0) | 2022.04.01 |
---|---|
크립토 좀비 2-1. Testing Smart Contracts with Truffle (0) | 2022.04.01 |
OpenZeppelin에서 msg.sender를 사용하지 않는 이유 (0) | 2022.04.01 |
address에서 send, transfer를 호출할 수 없는 이슈 (0) | 2022.04.01 |
SPDX-License-Identifier 이슈 (0) | 2022.04.01 |