2020.코딩일지
[solidity] fallback과 receive (feat.솔리디티깨부수기) 본문
728x90
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
//35강 버전별로 테스트!!
/*
0.6이전의 fallback : 이름그대로 대비책함수.
특징
1. 먼저 무기명 함수, 이름이 없는 함수이다.
2. external 필수
3. payable
왜 쓰는가?
1. 스컨이 이더를 받을 수 있게 한다.
2. 이더 받고 난 후 어떠한 행동을 취하게 할 수 있다.
3. call함수로 없는 함수가 불려질 때, 어떠한 행동을 취하게 할 수 있다.
0.6 이전
function() external payable {
}
0.6 이후 fallback
fallback은 recevie와 fallback으로 두가지 형태로 나뉘게 되었습니다.
receive는 순수하게 이더만 받을때 작동합니다.
fallback: 함수를 실행하면서 이더를 보낼 때, 불려진 함수가 없을 때 작동합니다.
0.6 dlgn
기본형 : 불려진 함수가 특정 스컨이 없을 때 fallback함수가 발동합니다.
fallback() external {
}
payable 적용시 : 이더를 받고 나서도 fallback 함수가 발동합니다.
fallback() external payable{
}
receive() external payable{
}
*/
contract Bank {
event JustFallbackWithFunds(address _from, uint256 _value, string message);
//~0.6
function() external payable {
emit JustFallbackWithFunds(msg.sender, msg.value, "JustFallbackWithFunds is called");
//누가 얼마만큼을 보냈는지 출력
}
}
constract You {
//receve()
function DepositWithSend(address payable _to) public payable {
bool success = _to.send(msg.value); //send함수로 Bank에 보내기
require(success, "Failled");
}
function DepositWithTransfer(address payable _to) public payable{
_to.transfer(msg.value); //transfer함수로 Bank에 보내기
}
function DepositWithCall(address payable _to) public payable{
//~0.7이전의 버전의 call함수로 Bank에 보내기
(bool sent, ) = _to.call.value(msg.value)("");
require(sent, "Failed to send either");
//0.7~
// (bool sent, ) = _to.call{value: msg.value}("");
// require(sent, "Failled");
}
//fallback()
function JustGiveMessage(address _to) public {
// ~ 0.7
(bool sent, ) = _to.call("HI"); //Bank스컨에는 없는 HI함수
require(sent, "Failed to send either");
//0.7 ~
// (bool success, ) = _to.call("HI");
// require(success, "Failled");
}
//To the fallback() with Funds
function JustGiveMessageWithFunds(address payable _to) public payable{
// ~ 0.7
(bool sent, ) = _to.call.value(msg.value)("HI"); //이더도보내고 없는함수도부르고
require(sent, "Failed to send either");
//0.7 ~
// (bool success, ) = _to.call{value:msg.value}("HI");
// require(success, "Failled");
}
}
'Block Chain' 카테고리의 다른 글
[solidity] library_SafeMath overflow (feat.솔리디티깨부수기) (0) | 2022.12.05 |
---|---|
[solidity] enum/interface (feat.솔리디티깨부수기) (0) | 2022.12.05 |
[solidity] payable/balance와 msg.sender (feat.솔리디티깨부수기) (0) | 2022.12.05 |
[solidity] modifier (feat.솔리디티깨부수기) (0) | 2022.12.05 |
[solidity] return/SPDX (feat.솔리디티깨부수기) (0) | 2022.12.05 |
Comments