小编Kul*_*y14的帖子

uniswap 程序集 create2 功能如何工作?

我正在查看 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)

solidity smartcontracts uniswap

5
推荐指数
1
解决办法
843
查看次数

功能何时恢复?

因此,由于重入攻击,我正在构建我的函数以防止被黑客攻击。因此,首先更新映射等,然后发送付款。

我的问题是如果付款失败怎么办?仅付款即可恢复整个功能吗?

因为只要付款就意味着我的映射将被更新,就像付款已完成一样。

是这样吗?

感谢您的解答!

reentrancy solidity smartcontracts

4
推荐指数
1
解决办法
1001
查看次数

为什么我会收到此错误错误:交易已恢复而没有原因字符串。当尝试在 uniswap 上交换代币时?

我正在尝试在 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)

blockchain solidity smartcontracts uniswap

4
推荐指数
1
解决办法
8168
查看次数

如何转换 [u8; 32] 类型为二进制

我使用的是 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)

rust

0
推荐指数
1
解决办法
743
查看次数