Foundry vs. Hardhat

使用 Hardhat 需要在两种不同的编程语言“Solidity”和“JavaScript”之间不断进行上下文切换。Foundry要更出色一些。

Foundry vs. Hardhat
一键发币: SOL | BNB | ETH | BASE | Blast | ARB | OP | POLYGON | AVAX | FTM | OK

智能合约是用 Solidity 编程语言编写的,然后由 Hardhat 以太坊开发环境编译智能合约。使用连接到 Hardhat 网络的“ethers”库测试需求,并使用“Chai”匹配器创建各种单元测试。

我已经使用 Hardhat 来测试和部署我的智能合约超过六个月了。 它要求我学习“javaScript”和“typeScript”的基础知识来部署和测试我的智能合约。

因此,使用 Hardhat 需要在两种不同的编程语言“Solidity”和“JavaScript”之间不断进行上下文切换。

然后Foundry来了......

Foundry 不仅发展迅速,而且很快就被 DeFi 领域的巨头所采用。 但它也有非常详细的文档,比如这本 Foundry Book

花了几个小时后,我弄清楚了如何使用 Foundry 测试“CompoundV2”协议上的其中一个功能。它在各种日志记录、断言和作弊代码功能方面有一个学习曲线。 但很快,我就能把它们拼凑起来。

我的目标是为“cEth”合约提供流动性。 步骤如下:

  • 交易合约 1_000 ether,通过 cETH.mint()提供给 CompoundV2 协议
  • 执行基本计算以检查汇率和预期铸造的 cTokens 数量
  • 将收到的 cTokens 与上一步中计算的预期金额进行比较。
  • 将时间提前 50_000 块,以对存入的流动性产生利息。
  • 赎回基础 ETH 并断言其大于最初提供的金额。

代码片段(非开发人员可以跳到记录的输出消息):

 /***@notice  Supply ETH to the cETH contract, check the cToken balances and redeem.
 */   
 function testSupply_ETH() public{
     console.log("Supplying liquidity into the cETH contract");
        vm.deal(here, 1000 ether); 
        uint256 initialBalETH = address(this).balance;
        emit log_named_uint("Supplied ETH liquidity", 1000 ether);
        emit log_named_uint("Initial cETH balance of this contract:", cETH.balanceOf(here));
        cETH.mint{value: 1000 ether}();
        emit log_named_decimal_uint("cETH balance after calling mint:", cETH.balanceOf(here),0);
        uint256 calcExchangeRate = 1e18*(cETH.getCash() + cETH.totalBorrowsCurrent() - cETH.totalReserves())/cETH.totalSupply();
        uint256 calculatedMinted = (1000 ether *1e18)/calcExchangeRate;
        emit log_named_decimal_uint("Calculated Exchange Rate", calcExchangeRate,0);
        emit log_named_decimal_uint("Calculated minted tokens", calculatedMinted,0);
        emit log_named_decimal_uint("Exchange rate", cETH.exchangeRateCurrent(),(0)); 
       emit log_named_uint("Calculated minted", calculatedMinted);
       uint256 actualMinted_cETH = cETH.balanceOf(here);
       assertEq(calculatedMinted,actualMinted_cETH);
       vm.roll(block.number+50000);
       uint256 currentBalanceMinted  = cETH.balanceOf(here);
       assertEq(cETH.redeem(currentBalanceMinted),0);
       assertEq(cETH.balanceOf(here),0);
       uint256 finalBalETH  = address(this).balance;
        assertGt(finalBalETH,initialBalETH);
      emit log_named_decimal_uint("ETH redeemed after advancing blocks", finalBalETH,18);


    } 

输出日志:

 Supplying liquidity into the cETH contract
  Supplied ETH liquidity: 1000000000000000000000
  Initial cETH balance of this contract:: 0
  cETH balance after calling mint:: 4979504810940.0
  Calculated Exchange Rate: 200823181815761189523999271.0
  Calculated minted tokens: 4979504810940.0
  Exchange rate: 200823181815761189523999271.0
  Calculated minted: 4979504810940
  ETH redeemed after advancing blocks: 1000.015064602371332482:

为了使本文简短,我跳过了所需的接口,也没有解释 Compound 开发人员文档和代码存储库中记录的功能。 我可以根据要求分享我的代码存储库。

最后的想法:这是一次有趣的学习体验,Foundry 速度极快且易于使用,我不认为自己会很快回到 Hardhat。

原文链接:Foundry vs Hardhat

DefiPlot翻译整理,转载请标明出处

通过 NowPayments 打赏