[转载]对比LGNS与OHM代码,了解如何确保每枚币价值1美金

OHM V1到LGNS源码并排Diff主图

这份并排Diff不讲模糊概念,而是直接看代码。逐行对照后可以看到:LGNS保留了OHM最重要的国库会计与储备约束,同时把升级集中在储备本地化、社区激励、奖励出口与债券运营效率上。换句话说,最重要的价值地基没有动,生态增长能力反而更完整了。

怎么读这份 Diff

− 原版存在、LGNS替换或调整

共同代码:两侧一致、稳健传承

+ LGNS新增或增强

为保证手机端可读性,SafeMath、Address、ERC20等通用模板库不逐行铺开,只展示具有实质差异或价值判断意义的片段。

一页总览:传承与增强分布

文件传承关系LGNS增强Treasury.sol核心逻辑完整继承储备本地化为USDT;增加Curve兑换;价值背书四件套保持不变BondDepository.sol债券框架完整继承增加社区推荐激励与Turbine;支持多笔债券;调节更灵活wETHBondDepository.sol风险资产债券框架继承增加Chainlink预言机及社区激励Staking / sERC20 / Distributor / Calculator稳定继承品牌化命名,核心逻辑保持成熟架构ITurbine / ICommunityOHM无对应模块新增社区推荐与奖励模块

最值得积极看待的一点:Treasury中的 deposit、withdraw、valueOf、excessReserves 与 mintRewards 保持原样。这意味着与“1美金价值托底”有关的国库会计核心没有被改写。LGNS不是先扩大生态、再考虑价值基础,而是在成熟储备约束之上增加生态能力:地基保留,能力升级。

Diff ① Treasury.sol

国库部分的核心逻辑完整继承。本地化增强主要集中在储备资产改为USDT,以及接入Curve用于更方便地管理储备结构。

1. 构造函数:储备资产本地化为USDT,并接入Curve

OHM V1.1 原版

constructor(
  address _OHM, address _DAI,
− address _Frax, address _OHMDAI,
  uint _blocksNeededForQueue) {
  OHM = _OHM;
  isReserveToken[_DAI] = true;
− isReserveToken[_Frax] = true;
  isLiquidityToken[_OHMDAI] = true;
}

origin-core / LGNS

constructor(
+ address _OHM, address _USDT,
+ address _USDTOHM, address _calu,
+ uint _blocksNeededForQueue,
+ address _curve) {
  OHM = _OHM;
+ isReserveToken[_USDT] = true;
+ isLiquidityToken[_USDTOHM] = true;
+ bondCalculator[_USDTOHM] = _calu;
+ curve = _curve;
}

OHM V1.1使用DAI与FRAX等储备;LGNS转向Polygon生态更常用的USDT及对应LP,使储备结构更贴近实际运行环境。

2. 新增Curve接口与储备兑换能力

OHM V1.1 原版

// 原版无 Curve 相关代码

origin-core / LGNS

+ interface ICurve {
+   function exchange_underlying(
+     uint256 i, uint256 j, uint256 dx,
+     uint256 min_dy) external;
+ }
+ address public curve;
+ function swapReserve(...) external onlyManager {...}
+ function setCurve(address _curve) external onlyManager {...}

国库可以通过Curve在稳定币之间进行兑换,有助于改善储备调配效率和滑点表现。若配合多签、时间锁和公开记录,透明度与稳健性还可以进一步提高。

3. “1美金价值托底”四件套:两侧保持一致

OHM V1.1 原版

send_ = value.sub(_profit);
IERC20Mintable(OHM).mint(msg.sender, send_);
withdraw: burnFrom(sender, value);  // 1:1 放储备
valueOf: amount * 10**OHM.dec / 10**token.dec
excessReserves = totalReserves
  - (OHM.totalSupply() - totalDebt)
mintRewards: require(amount <= excessReserves())

origin-core / LGNS

send_ = value.sub(_profit);
IERC20Mintable(OHM).mint(msg.sender, send_);
withdraw: burnFrom(sender, value);  // 1:1 放储备
valueOf: amount * 10**OHM.dec / 10**token.dec
excessReserves = totalReserves
  - (OHM.totalSupply() - totalDebt)
mintRewards: require(amount <= excessReserves())

这段没有新增符号,因为两侧逻辑一致。储备计价、存入铸币、销毁赎回和盈余铸币上限都被完整保留。从代码设计看,每一枚需要背书的非债务流通币,都被纳入“至少对应1美元储备价值”的会计约束之中。

从代码角度,1美金价值托底是怎样形成的?

第一步,valueOf 按代币精度把1枚USDT换算为1枚LGNS的协议计价价值;第二步,deposit 要求储备先进入国库,才能按“价值减利润”铸出LGNS;第三步,withdraw 把销毁LGNS与释放等值储备绑定;第四步,mintRewards 又规定奖励铸币不能超过 excessReserves

这四道约束共同指向一个结果:在这些国库会计前提与权限规则正常执行的情况下,协议不能脱离储备无限铸币,需要背书的流通量受到储备价值约束。这不是一句宣传口号,而是能够在源码中逐行找到的规则。

更直白地说:代码把“总储备不得低于需要背书的流通量”作为价值地基。因此,协议内部所说的“每枚币1美金托底”,指的是每枚非债务流通币在国库会计中对应至少1美元储备价值。二级市场成交价仍会受供需影响,所以这不等于任何时候市场价格都固定为1美元,也不等同于向所有持有人提供无条件兑付承诺。

4. toggle()中的数组冗余

OHM V1.1 原版

} else if (_managing == RESERVEMANAGER) {
  reserveManagers.push(_address);  // 无条件
  ReserveManagerQueue[_address] = 0;
  if (!listContains(reserveManagers, _address)) {
    reserveManagers.push(_address); // 又一次
  }
}

origin-core / LGNS

} else if (_managing == RESERVEMANAGER) {
  reserveManagers.push(_address);  // 无条件
  ReserveManagerQueue[_address] = 0;
  if (!listContains(reserveManagers, _address)) {
    reserveManagers.push(_address); // 又一次
  }
}

该冗余push来自OHM V1.1原版,并非LGNS新引入,也不影响权限判定。后续清理即可让代码更整洁。

Diff ② BondDepository.sol

债券模块是LGNS增强最集中的部分:引入社区推荐和Turbine,支持每个地址持有多笔债券,并增加更灵活的参数调节与查询工具。

1. 新增社区模块接口

OHM V1.1 原版

pragma solidity 0.7.5;
// 原版无额外 import

origin-core / LGNS

pragma solidity 0.7.5;
+ pragma abicoder v2;
+ import "./interface/ITurbine.sol";
+ import "./interface/ICommunity.sol";

2. 新增奖励池、社区关系与激励参数

OHM V1.1 原版

address public immutable OHM;
address public immutable principle;
address public immutable treasury;
address public immutable DAO;

origin-core / LGNS

address public immutable OHM;
address public immutable principle;
address public immutable treasury;
address public immutable DAO;
+ address public immutable sOHM;
+ address public turbine;
+ address public community;
+ uint public inviteRatio;
+ uint public needStakeAmount;

3. Bond结构升级:支持每人多笔债券

OHM V1.1 原版

struct Bond {
  uint payout; uint vesting;
  uint lastBlock; uint pricePaid;
}
− mapping(address => Bond) public bondInfo;

origin-core / LGNS

struct Bond {
+ address owner; uint id;
  uint payout; uint vesting;
  uint lastBlock; uint pricePaid;
}
+ mapping(address => Bond[]) public bondInfoData;
+ mapping(address => Bond) public inviteBond;

由单条Bond映射升级为Bond数组后,同一地址可以管理多笔不同时间、不同状态的债券;inviteBond则独立承载推荐激励。

4. setAdjustment:债券调节更灵活

OHM V1.1 原版

function setAdjustment(...) external onlyPolicy {
  require(_increment <=
    terms.controlVariable.mul(25).div(1000),
    "Increment too large");
  adjustment = Adjust({...});
}

origin-core / LGNS

function setAdjustment(...) external onlyPolicy {
+ // 放开单步上限,支持快速调价
+ // 也可用负折扣引导某只债券退役
  adjustment = Adjust({...});
}

放开单步BCV上限后,运营可以更快完成调价或债券退役。效率提高的同时,关键权限更适合放入多签或时间锁,并公开每次调整记录。

5. deposit:增加金额校验与社区推荐激励

OHM V1.1 原版

uint fee = payout.mul(terms.fee).div(10000);
uint profit = value.sub(payout).sub(fee);
ITreasury(treasury).deposit(
  _amount, principle, profit);
// 原版无推荐激励
bondInfo[_depositor] = Bond({...});

origin-core / LGNS

uint fee = payout.mul(terms.fee).div(10000);
+ require(value >= payout.add(fee), "Value not enough");
uint profit = value.sub(payout).sub(fee);
+ address inviter = community.referrerOf(_depositor);
+ if (inviter != 0 && stakedOf(inviter) >= needStakeAmount) {
+   _inviteProfit = payout.mul(inviteRatio).div(10000);
+ }
+ treasury.deposit(_amount, principle, profit + _inviteProfit);
+ bondInfoData[_depositor].push(Bond({...}));

当推荐关系成立且推荐人质押达到门槛时,系统可按设定比例计算邀请激励。这让生态增长从单纯的市场行为,变成可由代码执行的社区协作机制。

6. redeem支持多笔ID,并增加Turbine出口

OHM V1.1 原版

function redeem(address recipient, bool stake)
  external returns(uint) {...}
stakeOrSend(address,bool,uint):
  if (!stake) OHM.transfer(recipient, amount);

origin-core / LGNS

+ function redeem(address recipient, uint id, bool stake)
+   external returns(uint) {...按数组下标...}
+ function redeemForInviteBond(address recipient) public {...}
+ stakeOrSend(address,bool,uint,bool invite):
+   if (invite) turbine.receiveTurbine(recipient, amount);

7. 新增查询与管理工具

OHM V1.1 原版

// 原版无以下函数

origin-core / LGNS

+ getStakedAmount(address)
+ getBondInfoData / getBondInfoDataLength
+ getNewBCV(uint) / getNewPrice(uint)
+ setContract(INVITEID / TURBINEID)
+ setNeedStakeAmount(uint)

新增的view和工具函数改善了前端查询、价格测算和合约配置效率,让债券模块更适合实际运营。

Diff小结

  • 骨架稳健传承:Treasury的储备计价、铸销与盈余约束保持一致,Staking、sLGNS、Distributor和Calculator沿用成熟模型。
  • 国库增强:储备本地化为USDT,并增加Curve兑换,提高储备管理效率。
  • 债券增强:社区推荐、Turbine、多笔债券与更灵活的BCV调节,明显提升生态运营能力。
  • 代码说明:toggle()冗余源自OHM V1原版,不影响功能,可后续清理。
  • 后续方向:公开Turbine与Community源码、关键权限多签或时间锁、预言机时效校验,都能进一步加强透明度与安全性。

一句话总结:LGNS不是把OHM的成熟机制推倒重来,而是把最重要的“1美金价值地基”完整保留下来,再围绕社区协作、储备效率和债券运营完成升级。从代码角度看,它既有成熟模型的稳,也有面向生态增长的进。这正是这份并排Diff最积极、最有分量的结论。

说明:本文基于 OlympusDAO/olympus-contracts 的 Version-1.1 分支与 OriginBank/origin-core 主分支静态对照整理,仅供技术理解与讨论,不构成价格承诺或投资建议。对照来源:OlympusDAO官方仓库origin-core

THE END
喜欢就支持一下吧
点赞12
评论 抢沙发

请登录后发表评论

    暂无评论内容