Contract-Design
協議之間介面衝突的細粒度
在我的項目中集成Balancer Exchange協議時,我注意到在他們的交換代理中定義了這個介面:
interface TokenInterface { function balanceOf(address) external view returns (uint); function allowance(address, address) external view returns (uint); function approve(address, uint) external returns (bool); function transfer(address, uint) external returns (bool); function transferFrom(address, address, uint) external returns (bool); function deposit() external payable; function withdraw(uint) external; }
這幾乎是一個 ERC-20 介面,但它有兩個自定義函式,
deposit
和withdraw
. 這些功能存在的原因超出了這個問題的範圍。我想在交換代理上呼叫這個函式:
function smartSwapExactIn( TokenInterface tokenIn, TokenInterface tokenOut, uint256 totalAmountIn, uint256 minTotalAmountOut, uint256 nPools ) external payable returns (uint256 totalAmountOut);
TokenInterface
但是在編寫契約時,我想使用一個普通的 ERC-20 界面而不是這個自定義界面。這是棘手的部分。Balancer 已經在地址0x3E66B66Fd1d0b02fDa6C811Da9E0547970DB2f21部署了交換代理。我會用我自己的合約做同樣的事情(在某個時候部署它),顯然編譯器不會抱怨,因為我使用了另一個介面而不是
TokenInterface
(它不知道它的最終目的是什麼)。當我嘗試
smartSwapExactIn
通過定義與 and 參數略有不同的介面的合約呼叫 Balancer 的函式TokenInterface
時tokenIn
,協議是否會“交叉劍”tokenOut
?
是的,如果協議
TokenInterface
不完全相同,協議將相互交鋒。我必須使用Balancer repo中定義的介面:
interface TokenInterface { function balanceOf(address) external view returns (uint256); function allowance(address, address) external view returns (uint256); function approve(address, uint256) external returns (bool); function transfer(address, uint256) external returns (bool); function transferFrom( address, address, uint256 ) external returns (bool); function deposit() external payable; function withdraw(uint256) external; }