Erc-20

為什麼 Uniswap V2 使用 _safeTransfer 來轉移代幣?

  • October 21, 2022

我正在研究 Uniswap V2 程式碼,發現它使用_safeTransfer函式在Pair 合約中傳輸 ERC20 代幣。

   function _safeTransfer(address token, address to, uint value) private {
       (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
       require(success && (data.length == 0 || abi.decode(data, (bool))), 'UniswapV2: TRANSFER_FAILED');
   }
...

   function burn(address to) external lock returns (uint amount0, uint amount1) {
       ...
       _safeTransfer(_token0, to, amount0);
       ...
   }

為什麼它不簡單地呼叫IERC20(_token).transfer(to, amount0)

因為 ERC20 標準有點糟糕,並且不清楚你應該如何處理不成功的代幣轉移,所以在技術上允許恢復和返回 false,所以這兩種情況都考慮在內

(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
       // Case where there is no return data      case where there is return data
       require(success && (data.length == 0 || abi.decode(data, (bool))), 'UniswapV2: TRANSFER_FAILED');
  • 如果success為假,則恢復對代幣合約的呼叫,我們恢復整個交易,

  • 如果success為真且沒有返回數據,則代幣合約在轉賬時不返回任何內容且轉賬成功,

  • 如果success為真但有返回數據,我們檢查它是否為布爾值(如果不是我們呼叫的合約不符合 ERC20 標準,我們將恢復)

    • 如果該布爾值為假,則傳輸未完成,我們將恢復
    • 如果為真,則傳輸正常完成

引用自:https://ethereum.stackexchange.com/questions/137882