contract BuySnowGasComparisonTest is Test {
GasComparisonBuySnow token;
MockWETH weth;
address buyerEth = makeAddr("buyerEth");
address buyerWeth = makeAddr("buyerWeth");
uint256 constant FEE = 0.01 ether;
function setUp() public {
weth = new MockWETH();
token = new GasComparisonBuySnow(address(weth));
vm.deal(buyerEth, 100 ether);
weth.mint(buyerWeth, 100 ether);
vm.prank(buyerWeth);
weth.approve(address(token), type(uint256).max);
}
function test_GasComparison_ETHPath() public {
uint256 amount = 5;
uint256 cost = FEE * amount;
uint256 gasBeforeOriginal = gasleft();
vm.prank(buyerEth);
token.buySnowOriginal{value: cost}(amount);
uint256 gasUsedOriginal = gasBeforeOriginal - gasleft();
uint256 gasBeforeOptimized = gasleft();
vm.prank(buyerEth);
token.buySnowOptimized{value: cost}(amount);
uint256 gasUsedOptimized = gasBeforeOptimized - gasleft();
console.log("=== ETH path, amount:", amount, "===");
console.log("Original gas used:", gasUsedOriginal);
console.log("Optimized gas used:", gasUsedOptimized);
console.log("Gas saved:", gasUsedOriginal - gasUsedOptimized);
assertLt(gasUsedOptimized, gasUsedOriginal);
}
function test_GasComparison_WETHPath() public {
uint256 amount = 5;
uint256 gasBeforeOriginal = gasleft();
vm.prank(buyerWeth);
token.buySnowOriginal(amount);
uint256 gasUsedOriginal = gasBeforeOriginal - gasleft();
uint256 gasBeforeOptimized = gasleft();
vm.prank(buyerWeth);
token.buySnowOptimized(amount);
uint256 gasUsedOptimized = gasBeforeOptimized - gasleft();
console.log("=== WETH path, amount:", amount, "===");
console.log("Original gas used:", gasUsedOriginal);
console.log("Optimized gas used:", gasUsedOptimized);
console.log("Gas saved:", gasUsedOriginal - gasUsedOptimized);
assertLt(gasUsedOptimized, gasUsedOriginal);
}
}
- remove this code
function buySnow(uint256 amount) external payable canFarmSnow {
if (msg.value == (s_buyFee * amount)) {
_mint(msg.sender, amount);
} else {
i_weth.safeTransferFrom(msg.sender, address(this), (s_buyFee * amount));
_mint(msg.sender, amount);
}
s_earnTimer = block.timestamp;
emit SnowBought(msg.sender, amount);
}
+ add this code
function buySnow(uint256 amount) external payable canFarmSnow {
uint256 totalFee = s_buyFee * amount; // single SLOAD + single MUL, reused below
if (msg.value == totalFee) {
_mint(msg.sender, amount);
} else {
i_weth.safeTransferFrom(msg.sender, address(this), totalFee);
_mint(msg.sender, amount);
}
s_earnTimer = block.timestamp;
emit SnowBought(msg.sender, amount);
}