Q. ERC20 입출금 거래소지갑 관련 질문

오늘도나는 2019. 01. 07.


안녕하세요. 기술개발 질문을 드리고자 합니다. 제가 아하!!! 할 수 있게 고수님들의 답변을 기다립니다.

솔리디티에서는 payable fallback function으로 특정 사용자한테 만약 이더를 받게 되면,

payable fallback 함수 안에 transfer 함수를 호출해서 특정 지갑으로 별도의 가스비 지출 없이

바로 포워딩을 할 수 있는데, ERC20베이스로 뽑은 토큰들은 이걸 어떻게 처리해야 하나요?

payable fallback function은 이더만 받는것 같아서요. 제가 보니 디버깅해서 볼때

ERC20토큰을 보내는 경우네는 fallback function이 안먹히는것 같아서요.

공유하고 보상받기 ♥︎

1개의 답변이 있습니다.

질문자 & 큐레이터 채택
깃마스터 답변자인증
ISP Software 2019. 01. 07
100%의 채택

안녕하세요, ERC20 기반 토큰 컨트랙트를 제작&배포하여 서비스에서 활용중인 개발자입니다.

fallback function은 컨트랙트 당 오직 하나만 가질 수 있는 이름 없는 함수입니다.

fallback function은 아래의 경우에만 호출됩니다.

  • 트랜젝션에서 요청하는 함수가 컨트랙트에 존재하지 않을 때

  • data가 전혀 주어지지 않았을 때

  • plain Ether 가 컨트랙트에 전송되었을 때 (payable 키워드가 있어야 함)

컨트랙트에 Ether가 다이렉트로 전송되면 위 3가지 경우 중 3번째에 해당되어 fallback function이 호출됩니다. (payable 키워드가 없으면 exception이 발생합니다.)

ERC20 토큰은 Ether와 같이 컨트랙트에 직접 전송될 수 없고, ERC20 스펙에 따라 구현된 transfer function을 호출해서만 전송이 가능합니다. 따라서 컨트랙트에 ERC20 토큰이 들어왔다는 것은 전송자(msg.sender )가 transfer 를 호출했다는 뜻이므로 당연히 fallback function이 호출되지 않습니다. 말씀하신 대로 컨트랙트에 전송된 ERC20 토큰을 다른 곳으로 포워딩하시려면, 아래와 같이 transfer 함수 내부에서 처리를 해주시면 될 것 같습니다.

function transfer(address to, uint tokens) {
  if (to === this) {
    _transfer(anotherAddress, tokens)
  }
  // ...
}