아하
생활

생활꿀팁

최선의최선을
최선의최선을

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

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

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

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

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

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

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

    55글자 더 채워주세요.
    1개의 답변이 있어요!
    • 최선의최선을1
      최선의최선을1

      안녕하세요, 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) } // ... }