Description:
Smart contract deployed on Ethereum.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IV4Quoter {
struct PoolKey {
address currency0;
address currency1;
uint24 fee;
int24 tickSpacing;
address hooks;
}
struct QuoteExactSingleParams {
PoolKey poolKey;
bool zeroForOne;
uint128 exactAmount;
bytes hookData;
}
function quoteExactInputSingle(QuoteExactSingleParams memory params)
external
returns (uint256 amountOut, uint256 gasEstimate);
}
interface IV3Quoter {
function quoteExactInputSingle(
address tokenIn,
address tokenOut,
uint24 fee,
uint256 amountIn,
uint160 sqrtPriceLimitX96
) external returns (uint256 amountOut);
}
contract UniQuoteChecker {
address public constant TOKEN_SELL = 0x94314a14Df63779c99C0764a30e0CD22fA78fC0E; // 要卖出的代币
address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
address public constant ETH = 0x0000000000000000000000000000000000000000;
address public constant V4_QUOTER = 0x52F0E24D1c21C8A0cB1e5a5dD6198556BD9E1203;
address public constant V3_QUOTER = 0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6;
/// @notice 传入卖出数量 (sellAmount) 和 USDT 基准值 (usdtBaseline),并附带 ETH
function checkAndPay(uint128 sellAmount, uint256 usdtBaseline) external payable {
// 1. V4 查询 TOKEN_SELL -> ETH
IV4Quoter.QuoteExactSingleParams memory params = IV4Quoter.QuoteExactSingleParams({
poolKey: IV4Quoter.PoolKey({
currency0: ETH,
currency1: TOKEN_SELL,
fee: 3000, // 0.3%
tickSpacing: 60,
hooks: address(0)
}),
zeroForOne: false, // TOKEN_SELL -> ETH
exactAmount: sellAmount,
hookData: ""
});
(uint256 ethAmount, ) = IV4Quoter(V4_QUOTER).quoteExactInputSingle(params);
// 2. V3 查询 ETH -> USDT
uint256 usdtOut = IV3Quoter(V3_QUOTER).quoteExactInputSingle(
WETH,
USDT,
100, // 0.01%
ethAmount,
0
);
// 3. 判断差值,如果条件不满足则回滚
require(usdtOut > usdtBaseline + 30 * 1e6, "Condition not met: diff <= 30 USDT");
// 条件满足时,转账给 builder (block.coinbase)
payable(block.coinbase).transfer(msg.value);
}
}
Submitted on: 2025-09-25 11:42:20
Comments
Log in to comment.
No comments yet.