主要是测试https://solidity-by-example.org/defi/uniswap-v2-add-remove-liquidity/中的这个例子,向Uniswap V2的WETH/USDT流动性池添加或删除流动性。
分叉测试方法
使用foundry新建一个项目: forge init AddRemoveLiquidity
合约源代码放在src目录,命名为UniswapV2Liquidity.sol,测试代码放在test目录,命名为UniswapV2Liquidity.t.sol ,
另外,为了使得调试信息更为直观,使用了console.sol
进行日志输出:
- 合约中引入,
import "forge-std/console.sol"
; foundry.toml
配置文件中启用 ffi = true ,允许 Foundry 运行本地命令和输出日志。- forge test
-vvvv
选项来启用更高的日志级别,这样调试信息才能被打印出来。
最后,运行forge test -vvvv --fork-url https://eth-mainnet.g.alchemy.com/v2/ACCESS_TOKEN --fork-block-number 20623798
,fork主网,设置指定区块号,执行分叉测试。
测试sol文件
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {Test} from "forge-std/Test.sol";
import "forge-std/console.sol";
import "../src/UniswapV2Liquidity.sol";
IERC20 constant WETH = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
IERC20 constant USDT = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7);
IERC20 constant PAIR = IERC20(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852);
contract UniswapV2AddLiquidityTest is Test {
UniswapV2AddLiquidity private uni = new UniswapV2AddLiquidity();
// Add WETH/USDT Liquidity to Uniswap
function testAddLiquidity() public {
// Deal test USDT and WETH to this contract
deal(address(USDT), address(this), 1e6 * 1e6);
assertEq(USDT.balanceOf(address(this)), 1e6 * 1e6, "USDT balance incorrect");
deal(address(WETH), address(this), 1e6 * 1e18);
assertEq(WETH.balanceOf(address(this)), 1e6 * 1e18, "WETH balance incorrect");
console.log("\u6dfb\u52a0\u6d41\u52a8\u6027\u6d4b\u8bd5...");
console.log("UniswapV2AddLiquidityTest USDT balance: %s" , USDT.balanceOf(address(this)) / 1e6);
console.log("UniswapV2AddLiquidityTest WETH balance: %s" , WETH.balanceOf(address(this)) / 1e18);
// Approve uni for transferring
safeApprove(WETH, address(uni), 1e64);
safeApprove(USDT, address(uni), 1e64);
uni.addLiquidity(address(WETH), address(USDT), 1 * 1e18, 2435 * 1e6);
console.log("addLiquidity...");
assertGt(PAIR.balanceOf(address(uni)), 0, "pair balance 0");
console.log("UniswapV2Liquidity WETH/USDT LP Token: %s", PAIR.balanceOf(address(uni)));
}
// Remove WETH/USDT Liquidity from Uniswap
function testRemoveLiquidity() public {
// Deal LP tokens to uni
deal(address(PAIR), address(uni), 1e10);
assertEq(PAIR.balanceOf(address(uni)), 1e10, "LP tokens balance = 0");
assertEq(USDT.balanceOf(address(uni)), 0, "USDT balance non-zero");
assertEq(WETH.balanceOf(address(uni)), 0, "WETH balance non-zero");
console.log("\u5220\u9664\u6d41\u52a8\u6027\u6d4b\u8bd5...");
console.log("UniswapV2Liquidity WETH/USDT LP Token: %s", PAIR.balanceOf(address(uni)));
console.log("UniswapV2Liquidity USDT balance: %s", USDT.balanceOf(address(uni)) / 1e6);
console.log("UniswapV2Liquidity WETH balance: %s", WETH.balanceOf(address(uni)) / 1e18);
uni.removeLiquidity(address(WETH), address(USDT));
console.log("removeLiquidity...");
assertEq(PAIR.balanceOf(address(uni)), 0, "LP tokens balance != 0");
assertGt(USDT.balanceOf(address(uni)), 0, "USDT balance = 0");
assertGt(WETH.balanceOf(address(uni)), 0, "WETH balance = 0");
console.log("UniswapV2Liquidity WETH/USDT LP Token: %s", PAIR.balanceOf(address(uni)));
console.log("UniswapV2Liquidity USDT balance: %s", USDT.balanceOf(address(uni)) / 1e6);
console.log("UniswapV2Liquidity WETH balance: %s", WETH.balanceOf(address(uni)));
}
/**
* @dev The transferFrom function may or may not return a bool.
* The ERC-20 spec returns a bool, but some tokens don't follow the spec.
* Need to check if data is empty or true.
*/
function safeTransferFrom(
IERC20 token,
address sender,
address recipient,
uint256 amount
) internal {
(bool success, bytes memory returnData) = address(token).call(
abi.encodeCall(IERC20.transferFrom, (sender, recipient, amount))
);
require(
success
&& (returnData.length == 0 || abi.decode(returnData, (bool))),
"Transfer from fail"
);
}
/**
* @dev The approve function may or may not return a bool.
* The ERC-20 spec returns a bool, but some tokens don't follow the spec.
* Need to check if data is empty or true.
*/
function safeApprove(IERC20 token, address spender, uint256 amount)
internal
{
(bool success, bytes memory returnData) = address(token).call(
abi.encodeCall(IERC20.approve, (spender, amount))
);
require(
success
&& (returnData.length == 0 || abi.decode(returnData, (bool))),
"Approve fail"
);
}
}
运行结果:
[⠊] Compiling...
[⠒] Compiling 1 files with Solc 0.8.27
[⠑] Solc 0.8.27 finished in 1.51s
Compiler run successful with warnings:
Warning (2072): Unused local variable.
--> src/UniswapV2Liquidity.sol:23:10:
|
23 | (uint256 amountA, uint256 amountB, uint256 liquidity) = IUniswapV2Router(
| ^^^^^^^^^^^^^^^
Warning (2072): Unused local variable.
--> src/UniswapV2Liquidity.sol:23:27:
|
23 | (uint256 amountA, uint256 amountB, uint256 liquidity) = IUniswapV2Router(
| ^^^^^^^^^^^^^^^
Warning (2072): Unused local variable.
--> src/UniswapV2Liquidity.sol:23:44:
|
23 | (uint256 amountA, uint256 amountB, uint256 liquidity) = IUniswapV2Router(
| ^^^^^^^^^^^^^^^^^
Warning (2072): Unused local variable.
--> src/UniswapV2Liquidity.sol:43:10:
|
43 | (uint256 amountA, uint256 amountB) = IUniswapV2Router(ROUTER)
| ^^^^^^^^^^^^^^^
Warning (2072): Unused local variable.
--> src/UniswapV2Liquidity.sol:43:27:
|
43 | (uint256 amountA, uint256 amountB) = IUniswapV2Router(ROUTER)
| ^^^^^^^^^^^^^^^
Ran 2 tests for test/UniswapV2Liquidity.t.sol:UniswapV2AddLiquidityTest
[PASS] testAddLiquidity() (gas: 575384)
Logs:
添加流动性测试...
UniswapV2AddLiquidityTest USDT balance: 1000000
UniswapV2AddLiquidityTest WETH balance: 1000000
addLiquidity...
UniswapV2Liquidity WETH/USDT LP Token: 19108473809684
Traces:
[724496] UniswapV2AddLiquidityTest::testAddLiquidity()
├─ [5031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 100000000 [1e8]
├─ [0] VM::record()
│ └─ ← [Return]
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 100000000 [1e8]
├─ [0] VM::accesses(0xdAC17F958D2ee523a2206206994597C13D831ec7)
│ └─ ← [Return] [0x000000000000000000000000000000000000000000000000000000000000000a, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78], []
├─ [0] VM::load(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78) [staticcall]
│ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000005f5e100
├─ [0] VM::load(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78) [staticcall]
│ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000005f5e100
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 100000000 [1e8]
├─ [0] VM::store(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78, 0x0000000000000000000000000000000000000000000000000000000000000000)
│ └─ ← [Return]
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::store(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78, 0x0000000000000000000000000000000000000000000000000000000005f5e100)
│ └─ ← [Return]
├─ emit SlotFound(who: 0xdAC17F958D2ee523a2206206994597C13D831ec7, fsig: 0x70a08231, keysHash: 0x5ff10565516c110180bb9cc111cdbc2b0a68e09ff7fac17290373c3aa4a1bb03, slot: 49784443915320261189887103614045882155521089248264299114442679287293484801912 [4.978e76])
├─ [0] VM::load(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78) [staticcall]
│ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000005f5e100
├─ [0] VM::store(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78, 0x000000000000000000000000000000000000000000000000000000e8d4a51000)
│ └─ ← [Return]
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 1000000000000 [1e12]
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 1000000000000 [1e12]
├─ [0] VM::assertEq(1000000000000 [1e12], 1000000000000 [1e12], "USDT balance incorrect") [staticcall]
│ └─ ← [Return]
├─ [2534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 200000000000000000 [2e17]
├─ [0] VM::record()
│ └─ ← [Return]
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 200000000000000000 [2e17]
├─ [0] VM::accesses(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)
│ └─ ← [Return] [0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c], []
├─ [0] VM::load(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c) [staticcall]
│ └─ ← [Return] 0x00000000000000000000000000000000000000000000000002c68af0bb140000
├─ [0] VM::load(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c) [staticcall]
│ └─ ← [Return] 0x00000000000000000000000000000000000000000000000002c68af0bb140000
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 200000000000000000 [2e17]
├─ [0] VM::store(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c, 0x0000000000000000000000000000000000000000000000000000000000000000)
│ └─ ← [Return]
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::store(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c, 0x00000000000000000000000000000000000000000000000002c68af0bb140000)
│ └─ ← [Return]
├─ emit SlotFound(who: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, fsig: 0x70a08231, keysHash: 0x5ff10565516c110180bb9cc111cdbc2b0a68e09ff7fac17290373c3aa4a1bb03, slot: 13407199363679635973052879518465057167389910613330280238043615909335847287356 [1.34e76])
├─ [0] VM::load(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c) [staticcall]
│ └─ ← [Return] 0x00000000000000000000000000000000000000000000000002c68af0bb140000
├─ [0] VM::store(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c, 0x00000000000000000000000000000000000000000000d3c21bcecceda1000000)
│ └─ ← [Return]
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 1000000000000000000000000 [1e24]
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 1000000000000000000000000 [1e24]
├─ [0] VM::assertEq(1000000000000000000000000 [1e24], 1000000000000000000000000 [1e24], "WETH balance incorrect") [staticcall]
│ └─ ← [Return]
├─ [0] console::log("添加流动性测试...") [staticcall]
│ └─ ← [Stop]
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 1000000000000 [1e12]
├─ [0] console::log("UniswapV2AddLiquidityTest USDT balance: %s", 1000000 [1e6]) [staticcall]
│ └─ ← [Stop]
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
│ └─ ← [Return] 1000000000000000000000000 [1e24]
├─ [0] console::log("UniswapV2AddLiquidityTest WETH balance: %s", 1000000 [1e6]) [staticcall]
│ └─ ← [Stop]
├─ [24420] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::approve(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 10000000000000000000000000000000000000000000000000000000000000000 [1e64])
│ ├─ emit Approval(owner: UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], spender: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 10000000000000000000000000000000000000000000000000000000000000000 [1e64])
│ └─ ← [Return] true
├─ [24953] 0xdAC17F958D2ee523a2206206994597C13D831ec7::approve(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 10000000000000000000000000000000000000000000000000000000000000000 [1e64])
│ ├─ emit Approval(owner: UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], spender: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 10000000000000000000000000000000000000000000000000000000000000000 [1e64])
│ └─ ← [Stop]
├─ [221669] UniswapV2AddLiquidity::addLiquidity(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7, 1000000000000000000 [1e18], 2435000000 [2.435e9])
│ ├─ [26048] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::transferFrom(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 1000000000000000000 [1e18])
│ │ ├─ emit Transfer(from: UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 1000000000000000000 [1e18])
│ │ └─ ← [Return] true
│ ├─ [35224] 0xdAC17F958D2ee523a2206206994597C13D831ec7::transferFrom(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 2435000000 [2.435e9])
│ │ ├─ emit Transfer(from: UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 2435000000 [2.435e9])
│ │ └─ ← [Stop]
│ ├─ [24420] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::approve(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 1000000000000000000 [1e18])
│ │ ├─ emit Approval(owner: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], spender: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, value: 1000000000000000000 [1e18])
│ │ └─ ← [Return] true
│ ├─ [24953] 0xdAC17F958D2ee523a2206206994597C13D831ec7::approve(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 2435000000 [2.435e9])
│ │ ├─ emit Approval(owner: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], spender: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, value: 2435000000 [2.435e9])
│ │ └─ ← [Stop]
│ ├─ [103656] 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D::addLiquidity(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7, 1000000000000000000 [1e18], 2435000000 [2.435e9], 1, 1, UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 1724808407 [1.724e9])
│ │ ├─ [2564] 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f::getPair(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7) [staticcall]
│ │ │ └─ ← [Return] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852
│ │ ├─ [2504] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::getReserves() [staticcall]
│ │ │ └─ ← [Return] 0x0000000000000000000000000000000000000000000005008e7105f2ba39b18000000000000000000000000000000000000000000000000000003475da1d3c250000000000000000000000000000000000000000000000000000000066ce7ccb
│ │ ├─ [8948] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::transferFrom(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 997209288222181203 [9.972e17])
│ │ │ ├─ emit Transfer(from: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], to: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, value: 997209288222181203 [9.972e17])
│ │ │ └─ ← [Return] true
│ │ ├─ [12124] 0xdAC17F958D2ee523a2206206994597C13D831ec7::transferFrom(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 2435000000 [2.435e9])
│ │ │ ├─ emit Transfer(from: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], to: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, value: 2435000000 [2.435e9])
│ │ │ └─ ← [Stop]
│ │ ├─ [66290] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::mint(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f])
│ │ │ ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
│ │ │ │ └─ ← [Return] 23623093615202266888403 [2.362e22]
│ │ │ ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
│ │ │ │ └─ ← [Return] 57683210167013 [5.768e13]
│ │ │ ├─ [2314] 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f::feeTo() [staticcall]
│ │ │ │ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
│ │ │ ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 19108473809684 [1.91e13])
│ │ │ ├─ emit Sync(: 23623093615202266888403 [2.362e22], : 57683210167013 [5.768e13])
│ │ │ ├─ emit Mint(param0: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, param1: 997209288222181203 [9.972e17], param2: 2435000000 [2.435e9])
│ │ │ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000116109cb2b14
│ │ └─ ← [Return] 997209288222181203 [9.972e17], 2435000000 [2.435e9], 19108473809684 [1.91e13]
│ └─ ← [Stop]
├─ [0] console::log("addLiquidity...") [staticcall]
│ └─ ← [Stop]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 19108473809684 [1.91e13]
├─ [0] VM::assertGt(19108473809684 [1.91e13], 0, "pair balance 0") [staticcall]
│ └─ ← [Return]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 19108473809684 [1.91e13]
├─ [0] console::log("UniswapV2Liquidity WETH/USDT LP Token: %s", 19108473809684 [1.91e13]) [staticcall]
│ └─ ← [Stop]
└─ ← [Stop]
[PASS] testRemoveLiquidity() (gas: 353196)
Logs:
删除流动性测试...
UniswapV2Liquidity WETH/USDT LP Token: 10000000000
UniswapV2Liquidity USDT balance: 0
UniswapV2Liquidity WETH balance: 0
removeLiquidity...
UniswapV2Liquidity WETH/USDT LP Token: 0
UniswapV2Liquidity USDT balance: 1
UniswapV2Liquidity WETH balance: 521867574644689
Traces:
[446760] UniswapV2AddLiquidityTest::testRemoveLiquidity()
├─ [2480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::record()
│ └─ ← [Return]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::accesses(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852)
│ └─ ← [Return] [0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a], []
├─ [0] VM::load(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a) [staticcall]
│ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
├─ emit WARNING_UninitedSlot(who: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, slot: 101865277652109193157934748849462594086263052630085157397691791389601577573226 [1.018e77])
├─ [0] VM::load(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a) [staticcall]
│ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::store(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
│ └─ ← [Return]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 115792089237316195423570985008687907853269984665640564039457584007913129639935 [1.157e77]
├─ [0] VM::store(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a, 0x0000000000000000000000000000000000000000000000000000000000000000)
│ └─ ← [Return]
├─ emit SlotFound(who: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, fsig: 0x70a08231, keysHash: 0x996b860ef646da948c7d745162e3851398cba818db7bc8c7a4d9d465a54dfa11, slot: 101865277652109193157934748849462594086263052630085157397691791389601577573226 [1.018e77])
├─ [0] VM::load(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a) [staticcall]
│ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
├─ [0] VM::store(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a, 0x00000000000000000000000000000000000000000000000000000002540be400)
│ └─ ← [Return]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 10000000000 [1e10]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 10000000000 [1e10]
├─ [0] VM::assertEq(10000000000 [1e10], 10000000000 [1e10], "LP tokens balance = 0") [staticcall]
│ └─ ← [Return]
├─ [5031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::assertEq(0, 0, "USDT balance non-zero") [staticcall]
│ └─ ← [Return]
├─ [2534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::assertEq(0, 0, "WETH balance non-zero") [staticcall]
│ └─ ← [Return]
├─ [0] console::log("删除流动性测试...") [staticcall]
│ └─ ← [Stop]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 10000000000 [1e10]
├─ [0] console::log("UniswapV2Liquidity WETH/USDT LP Token: %s", 10000000000 [1e10]) [staticcall]
│ └─ ← [Stop]
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] console::log("UniswapV2Liquidity USDT balance: %s", 0) [staticcall]
│ └─ ← [Stop]
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] console::log("UniswapV2Liquidity WETH balance: %s", 0) [staticcall]
│ └─ ← [Stop]
├─ [180060] UniswapV2AddLiquidity::removeLiquidity(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7)
│ ├─ [2564] 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f::getPair(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7) [staticcall]
│ │ └─ ← [Return] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852
│ ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ │ └─ ← [Return] 10000000000 [1e10]
│ ├─ [24442] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::approve(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 10000000000 [1e10])
│ │ ├─ emit Approval(owner: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], spender: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, value: 10000000000 [1e10])
│ │ └─ ← [Return] true
│ ├─ [144791] 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D::removeLiquidity(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7, 10000000000 [1e10], 1, 1, UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 1724808407 [1.724e9])
│ │ ├─ [25849] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::transferFrom(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 10000000000 [1e10])
│ │ │ ├─ emit Transfer(from: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], to: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, value: 10000000000 [1e10])
│ │ │ └─ ← [Return] true
│ │ ├─ [116585] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::burn(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f])
│ │ │ ├─ [2534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
│ │ │ │ └─ ← [Return] 23622096405914044707200 [2.362e22]
│ │ │ ├─ [3031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
│ │ │ │ └─ ← [Return] 57680775167013 [5.768e13]
│ │ │ ├─ [2314] 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f::feeTo() [staticcall]
│ │ │ │ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
│ │ │ ├─ emit Transfer(from: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, to: 0x0000000000000000000000000000000000000000, value: 10000000000 [1e10])
│ │ │ ├─ [25962] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::transfer(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 521867574644689 [5.218e14])
│ │ │ │ ├─ emit Transfer(from: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 521867574644689 [5.218e14])
│ │ │ │ └─ ← [Return] true
│ │ │ ├─ [35601] 0xdAC17F958D2ee523a2206206994597C13D831ec7::transfer(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 1274303 [1.274e6])
│ │ │ │ ├─ emit Transfer(from: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 1274303 [1.274e6])
│ │ │ │ └─ ← [Stop]
│ │ │ ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
│ │ │ │ └─ ← [Return] 23622095884046470062511 [2.362e22]
│ │ │ ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
│ │ │ │ └─ ← [Return] 57680773892710 [5.768e13]
│ │ │ ├─ emit Sync(: 23622095884046470062511 [2.362e22], : 57680773892710 [5.768e13])
│ │ │ ├─ emit Burn(param0: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, param1: 521867574644689 [5.218e14], param2: 1274303 [1.274e6], param3: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f])
│ │ │ └─ ← [Return] 0x0000000000000000000000000000000000000000000000000001daa2c3680fd100000000000000000000000000000000000000000000000000000000001371bf
│ │ └─ ← [Return] 521867574644689 [5.218e14], 1274303 [1.274e6]
│ └─ ← [Stop]
├─ [0] console::log("removeLiquidity...") [staticcall]
│ └─ ← [Stop]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::assertEq(0, 0, "LP tokens balance != 0") [staticcall]
│ └─ ← [Return]
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 1274303 [1.274e6]
├─ [0] VM::assertGt(1274303 [1.274e6], 0, "USDT balance = 0") [staticcall]
│ └─ ← [Return]
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 521867574644689 [5.218e14]
├─ [0] VM::assertGt(521867574644689 [5.218e14], 0, "WETH balance = 0") [staticcall]
│ └─ ← [Return]
├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 0
├─ [0] console::log("UniswapV2Liquidity WETH/USDT LP Token: %s", 0) [staticcall]
│ └─ ← [Stop]
├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 1274303 [1.274e6]
├─ [0] console::log("UniswapV2Liquidity USDT balance: %s", 1) [staticcall]
│ └─ ← [Stop]
├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
│ └─ ← [Return] 521867574644689 [5.218e14]
├─ [0] console::log("UniswapV2Liquidity WETH balance: %s", 521867574644689 [5.218e14]) [staticcall]
│ └─ ← [Stop]
└─ ← [Stop]
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.24ms (12.78ms CPU time)
Ran 1 test suite in 1.07s (9.24ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)
标签:staticcall,0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f,Return,Foundry,UniswapV2Ad
From: https://www.cnblogs.com/lyhero11/p/18436035