Accounts

使用安全帽通過 Uniswap 流動性供應測試代幣

  • February 13, 2022

我正在嘗試分叉 Safemoon(或真正的 NotSafeMoon),並將其用作學習智能合約開發的工具。(我有大量你可能稱之為“Web 2.0”的開發經驗)。

所以說我的建構子中有類似的東西:

constructor () {
       _rOwned[_msgSender()] = _rTotal;
       IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);       // binance PANCAKE V2
       uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

當我執行測試時,npx hardhat test出現以下故障:

Compilation finished successfully


 TestToken contract
   Deployment
     1) "before each" hook for "Has the right name"


 0 passing (807ms)
 1 failing

 1) TestToken contract
      "before each" hook for "Has the right name":
    Error: Transaction reverted: function call to a non-contract account

現在,這確實很有意義,畢竟我試圖呼叫 Pancakeswap v2 路由器合約。我如何繞過這個限制?有沒有辦法將路由器的契約地址作為環境變數注入?我可以使用 UniswapRouter 的模擬建構子嗎?一般來說,這種事情是如何通過智能合約開發以可測試(以及如何測試)的方式完成的?

聽起來您正面臨兩個問題之一 - 要麼您使用本地開發鏈並且尚未將 Uniswap 部署到它,要麼您正在使用鏈的測試分支,並且沒有告訴您的測試套件在哪裡尋找它。您的測試中可能有程式碼用於notSafeMoon使用類似的東西或類似的東西來部署契約const tokenArtifacts = await ethers.getContractFactory("Token");。您將需要對您希望與之互動的任何其他契約執行類似的操作。您是使用本地開發鏈進行測試還是使用主網分叉進行測試是有區別的,因此我們將分開回答以涵蓋兩者。

注意:儘管 OP 正在使用 BSC 上的 Pancake Swap,因為 Pancake Swap 是 Uniswap v2 分叉,並且由於在撰寫本文時大多數測試分叉環境使用乙太坊主網進行分叉,我們將討論 Uniswap v2和乙太坊主網分叉,儘管同樣可以推斷為 Pancake Swap 和分叉 BSC 以用於測試環境(前提是可以找到分叉 BSC 的服務))

本地開發鏈(預設)

您將需要部署 Uniswap v2 路由器,儘管這可能還不是全部:我們假設在 Uniswap 套件中有更多與路由器互動的合約,您需要部署所有合約。快速搜尋會出現一個專門用於此的儲存庫儘管這不是背書。查看getContractFactory函式,您需要contracts在 Hardhat 的文件夾中擁有合約原始碼,然後呼叫getContractFactory合約的名稱(不是 的名稱.sol,順便說一下 - 合約中的實際名稱),然後是deploy,如安全帽文件中所述)。

主網分叉

(如果您有興趣了解有關分叉測試環境的更多資訊,請參閱Hardhat文件。)

如果您使用的是從主網分叉的環境,則不需要部署合約,因為它們已經為您部署好了。這仍然意味著您還需要 Uniswap v2 路由器的 ABI 和地址。Uniswap 實際上在他們的文件中有他們合約的 ABI ,儘管作為對未來的建議,Etherscan通常是你最好的朋友。大多數主要項目都在 Etherscan 上驗證他們的契約,這意味著完整的原始碼和 ABI 可以在他們的頁面上免費獲得。例如,如果你想在 Etherscan 上找到 Uni v2 路由器的 ABI,你可以開始輸入“Uniswap v2”,然後向下滾動選項:他們有一個標記為“Uniswap V2:路由器”的契約。

(項目通常會在他們的文件中列出他們部署的地址,您也可以使用它來查找文件中不包含他們的項目的 ABI。)

擁有 ABI 後,您可以將其複制粘貼到測試中或導入到單獨的文件中,然後您可以使用它來創建新合約:

const router = new ethers.Contract(ADDRESS, ABI)

(有一個可選的第三個參數用於傳入提供者或特定簽名者,Ethers docs。)

請注意,由於您只與路由器互動,因此您只需要為路由器建構合約 - 其餘部分將使用鏈上狀態完成。

希望這足以讓你暢通無阻!

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