针对不同小数位数的代币,此A代币购买量计算函数是否正确?
关于以B代币定价计算A代币可购买量函数的正确性分析
你的这个函数在给定的参数定义下是正确的,但必须严格遵守参数的含义约定,以下是详细分析:
参数含义的核心约束
函数成立的前提是:priceForA必须严格定义为合约内1单位A代币对应的合约内B代币数量——也就是你示例里描述的“购买1000000个合约内A代币需要支付10000000000000000个合约内B代币”这个对应关系。
示例验证
代入你提供的测试数值:
decimalsA = 6; priceForA = 10000000000000000; amountOfB = 50000000000000000;
计算过程:50000000000000000 * 10^6 / 10000000000000000 = 5 * 10^6
结果为合约内5000000个A代币,对应人类可读的5个A,和预期完全一致。
不同小数位数场景的覆盖测试
1. A和B小数位数相同
decimalsA = 18; decimalsB = 18; priceForA = 2 * 10**18; // 人类可读:1个A = 2个B amountOfB = 10 * 10**18; // 人类可读:10个B
计算结果:10*10^18 *10^18 / 2*10^18 = 5*10^18,对应人类可读5个A,正确。
2. A小数位数高于B
decimalsA = 18; decimalsB = 6; priceForA = 5 * 10**6; // 合约内1个A对应5个B,人类可读:1个A = 0.000005个B amountOfB = 20 * 10**6; // 人类可读:20个B
计算结果:20*10^6 *10^18 /5*10^6 = 4*10^18,对应人类可读4个A,正确。
3. A小数位数低于B
decimalsA = 6; decimalsB = 18; priceForA = 1 * 10**18; // 合约内1个A对应1*10^18个B,人类可读:1个A =1个B amountOfB = 3 * 10**18; // 人类可读:3个B
计算结果:3*10^18 *10^6 /1*10^18 =3*10^6,对应人类可读3个A,正确。
关键注意事项
- 整数溢出风险:如果使用Solidity 0.8.x及以上版本,会自动检测乘法溢出并回滚交易;若为更低版本,必须引入
SafeMath库来处理溢出问题。 - 参数含义不能混淆:如果
priceForA被定义为人类可读的价格(比如示例中0.01个B对应1个A的人类可读值),函数逻辑需要调整,必须始终保证priceForA是合约内单位A对应的合约内B数量。
内容的提问来源于stack exchange,提问作者detoso
相关产品推荐
相关产品推荐

