나만의 후원사이트 만들기 (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 이슈

 

SPDX-License-Identifier 이슈

개요 코드 최상단에 'SPDX-License-Identifier'가 없을 경우에 경고로 표시된다. SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License..

goldfishdiary.tistory.com


address payable 이슈

 

address에서 send, transfer를 호출할 수 없는 이슈

개요 solidity 0.5버전 이하에서 address 변수에서 send나 transfer를 호출하려 하면 다음의 에러가 발생한다. "send" and "transfer" are only available for objects of type "address payable", not "address"...

goldfishdiary.tistory.com


OpenZeppelin에서 msg.sender를 사용하지 않는 이유

 

OpenZeppelin에서 msg.sender를 사용하지 않는 이유

개요 OpenZeppelin을 사용하다보면 (예를 들면 Ownable) msg.sender대신 _msgSender()를 사용하는 경우가 있다. import "./Context.sol"; ... modifier onlyOwner() { require(owner() == _msgSender(), "Ownable:..

goldfishdiary.tistory.com


2. 웹 페이지 개발

여러명의 수령자를 위한 페이지는 나중에 리액트로 만들거기 때문에
이번에는 그냥 html로 간단하게 만들어보기로 했다.

코드를 여기에 붙이기는 좋은 생각이 아닌 것 같으니
깃허브 링크를 올리겠다.

* 얍 (나중에 붙임) *


3. 테스트 및 배포

이건 크립토 좀비 튜토리얼을 마저 배우고 와서 해보도록 하겠다.