Solidity中使用CREATE2创建确定的合约

使用CREATE2可以创建确定的合约地址,并且事先可以知道合约地址。如何在合约中使用CREATE2? 其实很简单, 就是在创建合约时加入salt参数即可,例如 Pair p = new Pair{salt: salt}()

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Pair {

    function foo(uint8 x) public returns(uint8) {
        return x;
    }
}


contract Test {


    function f(uint8 x) public returns (uint8) {
        return x;
    }

    function f(uint256 x) public returns (uint256) {
        return x;
    }

    // 提前计算pair合约地址
    function calculateAddr(address tokenA, address tokenB) public view returns(address predictedAddress){
        require(tokenA != tokenB, "IDENTICAL_ADDRESSES"); //避免tokenA和tokenB相同产生的冲突
        // 计算用tokenA和tokenB地址计算salt
        (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); //将tokenA和tokenB按大小排序
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        // 计算合约地址方法 hash()
        predictedAddress = address(uint160(uint(keccak256(abi.encodePacked(
            bytes1(0xff),
            address(this),
            salt,
            keccak256(type(Pair).creationCode)
        )))));
    }

    // 创建合约
    function mycreate(address tokenA, address tokenB) public returns(address addr) {
        require(tokenA != tokenB, "IDENTICAL_ADDRESSES"); //避免tokenA和tokenB相同产生的冲突
        // 计算用tokenA和tokenB地址计算salt
        (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));

        Pair p = new Pair{salt: salt}();
        return address(p);
    }

}

在这里插入图片描述
可以看到,calculateAddr预先计算的合约地址与实际调用CREATE2创建出来的地址是一样的。

更多关于solidity的内容可以看WTF的solidity教程, 非常推荐的入门教程:https://wtf.academy/solidity-advanced/Create2/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值