如何判断接收方是否为流动性池?
How do I determine whether a recipient is a liquidity pool?
我正在创建一个代币,当它在流动性池中出售时,它会收取费用并销毁一定数量。
鉴于我有一个收件人地址,我如何检查它是否是一个流动资金池?
我想我可以使用这个:https://docs.uniswap.org/protocol/V2/reference/smart-contracts/pair-erc-20但是我不确定哪个功能可以工作或者是否有其他方法。
编辑:
您可以根据 Uniswap Pair (V2) or Uniswap Pool (V3) 接口测试地址,是否是 returns 预期值。
更进一步,您可以将这些返回值传回 Uniswap Factory 合约(地址可在 V2 docs and V3 docs 中找到),它会根据输入值告诉您一个矿池地址。这样你就可以确定查询的地址实际上是一个 Uniswap 池,而不仅仅是来自 same-named 函数的一些其他合约返回值。
pragma solidity ^0.8;
import "https://github.com/Uniswap/v2-core/blob/master/contracts/interfaces/IUniswapV2Factory.sol";
import "https://github.com/Uniswap/v3-core/blob/main/contracts/interfaces/IUniswapV3Factory.sol";
import "https://github.com/Uniswap/v2-core/blob/master/contracts/interfaces/IUniswapV2Pair.sol";
import "https://github.com/Uniswap/v3-core/blob/main/contracts/interfaces/IUniswapV3Pool.sol";
contract MyContract {
IUniswapV2Factory constant v2Factory = IUniswapV2Factory(address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f));
IUniswapV3Factory constant v3Factory = IUniswapV3Factory(address(0x1F98431c8aD98523631AE4a59f267346ea31F984));
/**
* true on Ethereum mainnet - 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852
* false on Ethereum mainnet - 0xdAC17F958D2ee523a2206206994597C13D831ec7
*/
function isUniswapV2Pair(address target) external view returns (bool) {
if (target.code.length == 0) {
return false;
}
IUniswapV2Pair pairContract = IUniswapV2Pair(target);
address token0;
address token1;
try pairContract.token0() returns (address _token0) {
token0 = _token0;
} catch (bytes memory) {
return false;
}
try pairContract.token1() returns (address _token1) {
token1 = _token1;
} catch (bytes memory) {
return false;
}
return target == v2Factory.getPair(token0, token1);
}
/**
* true on Ethereum mainnet - 0x4e68Ccd3E89f51C3074ca5072bbAC773960dFa36
* false on Ethereum mainnet - 0xdAC17F958D2ee523a2206206994597C13D831ec7
*/
function isUniswapV3Pool(address target) external view returns (bool) {
if (target.code.length == 0) {
return false;
}
IUniswapV3Pool poolContract = IUniswapV3Pool(target);
address token0;
address token1;
uint24 fee;
try poolContract.token0() returns (address _token0) {
token0 = _token0;
} catch (bytes memory) {
return false;
}
try poolContract.token1() returns (address _token1) {
token1 = _token1;
} catch (bytes memory) {
return false;
}
try poolContract.fee() returns (uint24 _fee) {
fee = _fee;
} catch (bytes memory) {
return false;
}
return target == v3Factory.getPool(token0, token1, fee);
}
}
请注意,此代码段仅适用于部署了 Uniswap 的网络(例如,主网的本地分支或某些测试网)。在其他网络(例如 Remix VM 模拟器)上,无法访问 Uniswap 合约,这会导致调用恢复。
我正在创建一个代币,当它在流动性池中出售时,它会收取费用并销毁一定数量。
鉴于我有一个收件人地址,我如何检查它是否是一个流动资金池?
我想我可以使用这个:https://docs.uniswap.org/protocol/V2/reference/smart-contracts/pair-erc-20但是我不确定哪个功能可以工作或者是否有其他方法。
编辑:
您可以根据 Uniswap Pair (V2) or Uniswap Pool (V3) 接口测试地址,是否是 returns 预期值。
更进一步,您可以将这些返回值传回 Uniswap Factory 合约(地址可在 V2 docs and V3 docs 中找到),它会根据输入值告诉您一个矿池地址。这样你就可以确定查询的地址实际上是一个 Uniswap 池,而不仅仅是来自 same-named 函数的一些其他合约返回值。
pragma solidity ^0.8;
import "https://github.com/Uniswap/v2-core/blob/master/contracts/interfaces/IUniswapV2Factory.sol";
import "https://github.com/Uniswap/v3-core/blob/main/contracts/interfaces/IUniswapV3Factory.sol";
import "https://github.com/Uniswap/v2-core/blob/master/contracts/interfaces/IUniswapV2Pair.sol";
import "https://github.com/Uniswap/v3-core/blob/main/contracts/interfaces/IUniswapV3Pool.sol";
contract MyContract {
IUniswapV2Factory constant v2Factory = IUniswapV2Factory(address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f));
IUniswapV3Factory constant v3Factory = IUniswapV3Factory(address(0x1F98431c8aD98523631AE4a59f267346ea31F984));
/**
* true on Ethereum mainnet - 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852
* false on Ethereum mainnet - 0xdAC17F958D2ee523a2206206994597C13D831ec7
*/
function isUniswapV2Pair(address target) external view returns (bool) {
if (target.code.length == 0) {
return false;
}
IUniswapV2Pair pairContract = IUniswapV2Pair(target);
address token0;
address token1;
try pairContract.token0() returns (address _token0) {
token0 = _token0;
} catch (bytes memory) {
return false;
}
try pairContract.token1() returns (address _token1) {
token1 = _token1;
} catch (bytes memory) {
return false;
}
return target == v2Factory.getPair(token0, token1);
}
/**
* true on Ethereum mainnet - 0x4e68Ccd3E89f51C3074ca5072bbAC773960dFa36
* false on Ethereum mainnet - 0xdAC17F958D2ee523a2206206994597C13D831ec7
*/
function isUniswapV3Pool(address target) external view returns (bool) {
if (target.code.length == 0) {
return false;
}
IUniswapV3Pool poolContract = IUniswapV3Pool(target);
address token0;
address token1;
uint24 fee;
try poolContract.token0() returns (address _token0) {
token0 = _token0;
} catch (bytes memory) {
return false;
}
try poolContract.token1() returns (address _token1) {
token1 = _token1;
} catch (bytes memory) {
return false;
}
try poolContract.fee() returns (uint24 _fee) {
fee = _fee;
} catch (bytes memory) {
return false;
}
return target == v3Factory.getPool(token0, token1, fee);
}
}
请注意,此代码段仅适用于部署了 Uniswap 的网络(例如,主网的本地分支或某些测试网)。在其他网络(例如 Remix VM 模拟器)上,无法访问 Uniswap 合约,这会导致调用恢复。