You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Remix IDE部署合约时向Solidity构造函数传入结构体参数

在Remix IDE中部署带NewPoolParams结构体的Solidity合约参数传入指南

一、合约代码中文注释版

struct NewPoolParams {
    IVault vault;          // Balancer Vault合约地址
    string name;           // 池的名称
    string symbol;         // 池的代币符号
    IERC20 token0;         // 池中的第一个代币合约地址
    IERC20 token1;         // 池中的第二个代币合约地址
    uint256 normalizedWeight0;  // 第一个代币的标准化权重(需与token1权重之和等于FixedPoint.ONE)
    uint256 normalizedWeight1;  // 第二个代币的标准化权重
    uint256 swapFeePercentage;  // 兑换手续费百分比(采用Balancer定点数格式,如0.01%对应1e16)
    uint256 pauseWindowDuration; // 暂停窗口时长(单位:秒)
    uint256 bufferPeriodDuration; // 缓冲期时长(单位:秒)
    bool oracleEnabled;    // 是否启用预言机
    address owner;         // 池的拥有者地址
}

constructor(NewPoolParams memory params)
    // 基础池预期通过工厂合约部署。使用工厂地址作为操作标识符,让同一工厂部署的所有池共享操作ID。
    // 这样可简化权限管理(比如统一管理同一工厂创建的所有池的"设置手续费"权限),同时确保不同工厂的操作ID唯一,避免意外错误。
    Authentication(bytes32(uint256(msg.sender)))
    BalancerPoolToken(params.name, params.symbol)
    BasePoolAuthorization(params.owner)
    TemporarilyPausable(params.pauseWindowDuration, params.bufferPeriodDuration)
{
    _setOracleEnabled(params.oracleEnabled);
    _setSwapFeePercentage(params.swapFeePercentage);

    bytes32 poolId = params.vault.registerPool(IVault.PoolSpecialization.TWO_TOKEN);

    // 传入零地址作为资产管理器
    IERC20[] memory tokens = new IERC20[](2);
    tokens[0] = params.token0;
    tokens[1] = params.token1;
    params.vault.registerTokens(poolId, tokens, new address[](2));

    // 设置不可变状态变量 - 构造期间无法读取这些变量
    _vault = params.vault;
    _poolId = poolId;

    _token0 = params.token0;
    _token1 = params.token1;

    _scalingFactor0 = _computeScalingFactor(params.token0);
    _scalingFactor1 = _computeScalingFactor(params.token1);

    // 确保每个标准化权重不低于最小值,并找出权重最大的代币索引
    _require(params.normalizedWeight0 >= _MIN_WEIGHT, Errors.MIN_WEIGHT);
    _require(params.normalizedWeight1 >= _MIN_WEIGHT, Errors.MIN_WEIGHT);

    // 确保标准化权重之和等于ONE(Balancer定点数常量,通常为1e18)
    uint256 normalizedSum = params.normalizedWeight0.add(params.normalizedWeight1);
    _require(normalizedSum == FixedPoint.ONE, Errors.NORMALIZED_WEIGHT_INVARIANT);

    _normalizedWeight0 = params.normalizedWeight0;
    _normalizedWeight1 = params.normalizedWeight1;
    _maxWeightTokenIndex = params.normalizedWeight0 >= params.normalizedWeight1 ? 0 : 1;
}

二、参数准备要求

  • vault:填写对应网络的官方Balancer Vault合约地址(如主网0xBA12222222228d8Ba445958a75a0704d566BF2C8,测试网需自行确认)
  • name/symbol:自定义池的名称和代币符号,如"My Balancer Pool"、"MBP"
  • token0/token1:填入已部署的两个ERC20代币合约地址
  • normalizedWeight0/normalizedWeight1:标准化权重,需满足两者之和等于1e18(Balancer的FixedPoint.ONE),且各自不低于合约定义的_MIN_WEIGHT(比如1e17即10%权重)。例如token0占60%填6e17,token1填4e17
  • swapFeePercentage:兑换手续费,用定点数表示,如0.3%填3e15(1e18对应100%)
  • pauseWindowDuration/bufferPeriodDuration:暂停窗口、缓冲期的时长(单位秒),如填86400(24小时)
  • oracleEnabled:布尔值,填true或false
  • owner:池的管理地址,可填你的钱包地址或指定账户

三、Remix部署操作步骤

  1. 将合约代码(含依赖接口)粘贴到Remix编辑器,确保编译通过
  2. 切换到Deploy & Run Transactions标签,选择目标网络和部署账户
  3. 在部署区域,Remix会自动识别NewPoolParams结构体,生成结构化输入表单:
    • 地址类字段:直接粘贴对应合约/钱包地址
    • 字符串类字段:输入自定义文本
    • 数值类字段:输入十进制uint256数值(如600000000000000000对应60%权重)
    • 布尔类字段:勾选复选框或输入true/false
  4. 确认所有参数无误后,点击Deploy,签名并发送交易,等待部署完成

四、关键注意事项

  • 必须保证normalizedWeight0与normalizedWeight1之和严格等于1e18,否则部署会触发错误
  • 确认vault地址为对应网络的官方地址,避免因地址错误导致部署失败
  • 手续费、权重等数值需符合Balancer定点数规范,不要填错量级
  • 建议先在测试网(如Sepolia)测试部署,确认参数无误后再部署到主网

内容的提问来源于stack exchange,提问作者Charmas Bajpai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:30:56