Erc-20為什麼 Uniswap V2 使用
為什麼 Uniswap V2 使用 _safeTransfer
來轉移代幣?
我正在研究 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 標準,我們將恢復)
- 如果該布爾值為假,則傳輸未完成,我們將恢復
- 如果為真,則傳輸正常完成