Solidity
Solidity 合約在第一次交換後看不到 ERC20 代幣
我有一份小型 Paraswap 合約。它所做的只是對 Paraswap 進行兩次低級呼叫以交換令牌並返回給發送者。
pragma solidity ^0.8.0; import "./IERC20.sol"; // from OpenZeppelin contract Swap { address private constant Paraswap = // Main Paraswap address address private constant ParaswapProxy = // Paraswap Proxy address function swapIt( address _token1, uint _amount1, bytes calldata _swapdata1, address _token2, uint _amount2, bytes calldata _swapdata2 ) external { IERC20(_token1).transferFrom(msg.sender, address(this), _amount1); IERC20(_token1).approve(ParaswapProxy, _amount1); (bool success1, ) = Paraswap.call(_swapdata1); require(success1, 'Failed at one'); IERC20(_token2).approve(ParaswapProxy, _amount2); (bool success2, ) = Paraswap.call(_swapdata2); require(success2, 'Failed at two'); IERC20(_token2).transferFrom(address(this), msg.sender, _amount2); } }
我必須做的一件事是使用 Paraswap 代理批准代幣,這樣它就可以將代幣從合約轉移到主要的 Paraswap 合約以進行交換。
我看到它的方式是這樣的 UDST > USDC > USDT
- 我與我的契約分開批准我的錢包以花費最大數量的 USDT。
- 我啟動合約,函式 swapIt 啟動。
- 因為我事先批准了我的錢包,合約將 USDT 從我的錢包轉移到它自己。
- 合約隨後通過 ParaswapProxy 批准該金額,並發出低級呼叫將 USDT 轉換為 USDC。
- 它將USDC返還給合約。
- 合約通過 ParaswapProxy 批准 USDC,並呼叫低級呼叫從 USDC 交換回 USDT。
- 它將USDT返還給合約。
- 合約將 USDT 返還到我的錢包。
發生的事情是在低級別呼叫的第 6 步,它失敗了。它看不到 USDC 餘額來進行另一次交換。
我通過添加:
uint bal = IERC20(_token2).balanceOf(address(this)); require(bal >= _amount2, 'Balance too low');
我在 USDC 上遇到了這個錯誤。
所以我回撥並自己嘗試了第一次交換:
IERC20(_token1).transferFrom(msg.sender, address(this), _amount1); IERC20(_token1).approve(ParaswapProxy, _amount1); (bool success1, ) = Paraswap.call(_swapdata1); require(success1, 'Failed at one');
USDT 從我的錢包中取出,兌換成 USDC 並留在合約上,所以這部分工作正常。就在第二次交換時,它沒有看到 USDC。我覺得我錯過了一些小東西。
USDC的起始餘額是否為0,然後我必須嘗試檢測它何時轉回?或者這是完全不同的東西?
更新:
對此進行了更多研究,我發現了該站點以調試事務。
https://dashboard.tenderly.co/explorer
查看我的交易,它現在說:
ERC20: transfer amount exceeds balance
在某些地方,我相信 USDC 的價值在第二次掉期之前正在發生變化,並且高於指定的金額,但我不確定如何、為什麼或如何繞過它。我可以接受更多,所以我將一行改為:
IERC20(_token2).approve(ParaswapProxy, 1 ether);
但仍然是同樣的錯誤。
通過tender debug explorer,一行行查看交易明細,我發現我兩次批准了USDT 。
因此,在第一次交換時它執行良好,但在第二次交換時,它再次批准了 USDT,並在需要批准 USDC 時失敗了。
但即使在第二次互換期間批准了 USDC 之後,USDC 的數量也會發生某種變化,變得比預期的要少。
這是我的 Python 程式碼中的一個問題,部分是交換的問題。