Solidity

Solidity 合約在第一次交換後看不到 ERC20 代幣

  • March 6, 2022

我有一份小型 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

  1. 我與我的契約分開批准我的錢包以花費最大數量的 USDT。
  2. 我啟動合約,函式 swapIt 啟動。
  3. 因為我事先批准了我的錢包,合約將 USDT 從我的錢包轉移到它自己。
  4. 合約隨後通過 ParaswapProxy 批准該金額,並發出低級呼叫將 USDT 轉換為 USDC。
  5. 它將USDC返還給合約。
  6. 合約通過 ParaswapProxy 批准 USDC,並呼叫低級呼叫從 USDC 交換回 USDT。
  7. 它將USDT返還給合約。
  8. 合約將 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 程式碼中的一個問題,部分是交換的問題。

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