我正在查看 uniswap 代码,试图理解代码,其中大部分内容都非常清楚,但我确实有一些问题。
在这个函数中:
function createPair(address tokenA, address tokenB) external returns (address pair) {
require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
bytes memory bytecode = type(UniswapV2Pair).creationCode;
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
assembly {
pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
IUniswapV2Pair(pair).initialize(token0, token1);
getPair[token0][token1] = pair;
getPair[token1][token0] = pair; // populate mapping in …Run Code Online (Sandbox Code Playgroud) 因此,由于重入攻击,我正在构建我的函数以防止被黑客攻击。因此,首先更新映射等,然后发送付款。
我的问题是如果付款失败怎么办?仅付款即可恢复整个功能吗?
因为只要付款就意味着我的映射将被更新,就像付款已完成一样。
是这样吗?
感谢您的解答!
我正在尝试在 uniswap unsing Hardhat 的主网分支上交换代币,但出现此错误:Error: Transaction reverted without a reason string。我真的不知道为什么。
这是我的交换函数:
function swap(address router, address _tokenIn, address _tokenOut, uint _amount) public {
IERC20(router).approve(router, _amount);
address[] memory path;
path = new address[](2);
path[0] = _tokenIn;
path[1] = _tokenOut;
uint deadline = block.timestamp + 300;
IUniswapV2Router(router).swapExactTokensForTokens(_amount, 1, path, address(this), deadline);
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的函数,应该可以工作。我就是这样称呼它的:
await arb.swap(
uniAddress,
wethAddress,
daiAddress,
ethers.utils.parseEther('0.5')
);
Run Code Online (Sandbox Code Playgroud)
感谢您的解答!
另外,我拨打的地址只是为了验证它们是否正确,但我很确定它们是:
const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
const uniAddress = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D';
Run Code Online (Sandbox Code Playgroud) 我使用的是 Sha256 哈希函数,该函数返回 [u8; 32] 因为 256 位长的哈希值太大,无法用 Rust 的本机类型表示。
这一切都很好,但我需要从哈希生成一个二进制数,并检查二进制数中有多少个前导零。
有什么好的方法可以做到这一点吗?
截至目前,我尝试将每个单独的 u8 转换为其二进制形式并将它们连接在一起,但这不会生成正确的数字。
pub fn to_bits(arr: &[u8; 32]) -> String {
let mut final_str = String::new();
for i in arr {
final_str.push_str(&format!("{:b}", i));
}
final_str
}
Run Code Online (Sandbox Code Playgroud)