컨트렉트 코드에는 일반적으로 코인에 대한 전송(transfer) 및 받기(receive)에 대한 코드가 포함되어 있다. 이더(Ether) 혹은 이더 계열 토큰이 주소(address)에서 주소(address)로 이동된다. 그렇지 않을 코드도 있지만 만약 특정 주소에 토큰을 전달하고 싶거나 저장하고 싶다면 payable
옵션이 추가되어야 한다. 바꿔 말하면, payable로 선언되어야만 토큰을 주고 받을 수 있다.
payable 사용 예시
아래 예제코드에서는 payable 옵션이 주소(address) 리스트를 선언할 때, 생성자(contructor)를 정의할 때, 함수 파라미터로 address를 지정할 때 사용된다.
address 리스트 경우 해당 컨트렉트에서 이 리스트가 모두 토큰을 주고 받는 주소가 되어야하기 때문에 payable 옵션을 추가하였고, 생성자에 payable이 붙은 이유는 컨트렉트가 배포될 때 토큰이 해당 컨트렉트 주소(Contract Address)에 생성(및 이동) 되어야 하기 때문이다. 마지막으로, 함수에서 파라미터 주소값을 전달받을 때 역시 payable이 함께 붙을 수 있다.
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract Will {
// ...
address payable[] familyWallets;
mapping(address => uint) inheritance;
constructor() payable {
owner = msg.sender; // msg sender represents address being called
fortune = msg.value; //msg value tells us how much ether is being sent
deceased = false;
}
function setInheritance(address payable wallet, uint amount) public onlyOwner {
familyWallets.push(wallet);
inheritance[wallet] = amount;
}
// ...
}
payable 종류와 특징
payable이 적용될 수 있는 영역은 총 2가지로 주소에 대한 변수(address)
와 함수(**function**)
에서 사용된다.
- address payable
- function payable
address payable의 경우 사용자 주소를 저장하는 변수에 토큰(ex. Ether)을 주고 받는 속성을 추가한 것과 같다. 이 경우 send()와 transfer()를 사용할 수 있는데, 각각 토큰을 보내고 받는 함수다.
// 사용 예제 1
payalbe(msg.sender).transfer();
// 사용 예제 2
payalbe(someAddress).send();
function payable은 컨트렉트 내에서 정의한 함수를 호출함으로써 토큰을 전송하고 싶을 때 사용된다. 총 3가지 적용 방법이 있는데, 각각 생성자(constructor) 선언 시, 일반적인 함수 선언 시, fallback 혹은 receive 함수 선언 시로 나눌 수 있다.
'Programing > Solidity' 카테고리의 다른 글
[Solidity] 트러플(Truffle) 설치 및 컨트렉트(Contract) 배포 (0) | 2022.03.16 |
---|---|
[Solidity] Storage와 Memory (0) | 2022.03.15 |
[Solidity] receive 함수 (0) | 2022.03.12 |
[Solidity] fallback 함수 (0) | 2022.03.12 |
[Solidity] 솔리디티 코드 연습 - 크립토 좀비 (1) | 2022.03.11 |
댓글